Yesterday I tried to install mongodb on my Raspberry Pi. Raspbian Jessie ships with a default mongo 2.4 package, so the installation should be pretty straightforward:

apt-get install mongodb

However, after the installation finished, the service did not start:

service mongodb start

did not result in a started mongod process. No log files in /var/log/mongodb were produced, indicating that the process stops before the logging is initialized. If the mongodb server is started manually, a very early crash can be observed:

sudo -u mongodb /usr/bin/mongod  --config /etc/mongodb.conf
Sun Mar 27 07:48:45.296 terminate() called, printing stack (if implemented for platform):
 0x664160 0x16d954 0x767ea9a0
 /usr/bin/mongod(_ZN5mongo15printStackTraceERSo+0x1c) [0x664160]
 /usr/bin/mongod(_ZN5mongo11myterminateEv+0x54) [0x16d954]
 /usr/lib/arm-linux-gnueabihf/libstdc++.so.6(+0x4a9a0) [0x767ea9a0]
Sun Mar 27 07:48:45.299 Got signal: 6 (Aborted).
 
Sun Mar 27 07:48:45.302 Backtrace:
0x664160 0x16e370 0x765be180 0x765bcf70
 /usr/bin/mongod(_ZN5mongo15printStackTraceERSo+0x1c) [0x664160]
 /usr/bin/mongod(_ZN5mongo10abruptQuitEi+0x2a0) [0x16e370]
 /lib/arm-linux-gnueabihf/libc.so.6(__default_sa_restorer_v2+0) [0x765be180]
 /lib/arm-linux-gnueabihf/libc.so.6(gsignal+0x38) [0x765bcf70]

Stracing the syscalls shows that the error is generated shortly after mongod tries to load locales:

munmap(0x76f24000, 4096)                = 0
open("/usr/lib/locale/en_GB.UTF-8/LC_NUMERIC", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
open("/usr/lib/locale/en_GB.utf8/LC_NUMERIC", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
open("/usr/lib/locale/en_GB/LC_NUMERIC", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
open("/usr/lib/locale/en.UTF-8/LC_NUMERIC", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
open("/usr/lib/locale/en.utf8/LC_NUMERIC", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
open("/usr/lib/locale/en/LC_NUMERIC", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
gettimeofday({1459065376, 950211}, NULL) = 0
open("/etc/localtime", O_RDONLY|O_CLOEXEC) = 4
fstat64(4, {st_mode=S_IFREG|0644, st_size=118, ...}) = 0
fstat64(4, {st_mode=S_IFREG|0644, st_size=118, ...}) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x76f24000
read(4, "TZif2\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\1\0\0\0\0"..., 4096) = 118
_llseek(4, -6, [112], SEEK_CUR)         = 0
read(4, "\nUTC0\n", 4096)               = 6
close(4)                                = 0
munmap(0x76f24000, 4096)                = 0
fstat64(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 1), ...}) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x76f24000
write(1, "Sun Mar 27 07:56:16.950 ", 24Sun Mar 27 07:56:16.950 ) = 24
write(1, "terminate() called, printing sta"..., 65terminate() called, printing stack (if implemented for platform):) = 65
write(1, "\n", 1
)                       = 1
futex(0x7667e5d8, FUTEX_WAKE_PRIVATE, 2147483647) = 0
write(1, "0x664160 0x16d954 0x7679a9a0 \n", 300x664160 0x16d954 0x7679a9a0
) = 30
write(1, " /usr/bin/mongod(_ZN5mongo15prin"..., 65 /usr/bin/mongod(_ZN5mongo15printStackTraceERSo+0x1c) [0x664160]
) = 65
write(1, " /usr/bin/mongod(_ZN5mongo11myte"..., 59 /usr/bin/mongod(_ZN5mongo11myterminateEv+0x54) [0x16d954]
) = 59
write(1, " /usr/lib/arm-linux-gnueabihf/li"..., 68 /usr/lib/arm-linux-gnueabihf/libstdc++.so.6(+0x4a9a0) [0x7679a9a0]
) = 68

It turns out that I did not change the default locale on my installation (which was en_GB.UTF-8), and did not make sure a proper locale was generated for this setting.

To fix the error, first make sure you pick the right locale. This can be changed by running

dpkg-reconfigure locales

There, you can first pick the locales that should be generated:

Afterwards, you can pick the locale that should be used on the system:

dpkg-reconfigure will then generate the locales that are supported. The changes will be applied after the next reboot. Make sure they are actually used in your current session by running

export LANG=*<YOUR_LOCALE_SELECTION>*

Afterwards, mongodb should start just fine.

If you are not on a debian system, you can make sure that the proper locales are generated by editing

/etc/locale.gen

and uncommenting all locales that you need. Afterwards you need to generate

locale-gen

which will generate the locale files. Setting the LANG environment variable is something that is distribution specific. Check your manual on where you can find the proper place to configure the locale. On debian-based systems, you can find it in

/etc/default/locale

on Gentoo, check your

/etc/env.d/02locale