TL; DR: MongoDB在一切允许的目录上抱怨权限。
我在Debian Jessie ARM上运行MongoDB v2.4.10 。 我想将数据存储在外部驱动器上,格式化为ext4并通过/etc/fstab使用以下行进行装载:
UUID=<uuid goes here> /mnt/external1 ext4 defaults,noatime 0 0
/mnt/external1上的权限是:
$ ls -l | grep external1 drwxrwxrwx 4 root plugdev 4096 Jul 31 10:57 external1
在驱动器安装完成后,
$ sudo chown -R root:plugdev /mnt/external1 $ sudo chmod 777 -R /mnt/external1
mongodb用户在组plugdev :
$ cat /etc/group | grep mongodb plugdev:x:46:mongodb mongodb:x:112:mongodb
但是,运行sudo service mongodb start我在/mnt/external1/mongodb.log看到以下/mnt/external1/mongodb.log :
Fri Jul 31 10:56:17.341 [initandlisten] MongoDB starting : pid=27189 port=27017 dbpath=/mnt/external1/mongodb 32-bit host=odroidc1 Fri Jul 31 10:56:17.341 [initandlisten] Fri Jul 31 10:56:17.341 [initandlisten] ** NOTE: This is a 32 bit MongoDB binary. Fri Jul 31 10:56:17.341 [initandlisten] ** 32 bit builds are limited to less than 2GB of data (or less with --journal). Fri Jul 31 10:56:17.341 [initandlisten] ** See http://dochub.mongodb.org/core/32bit Fri Jul 31 10:56:17.343 [initandlisten] Fri Jul 31 10:56:17.343 [initandlisten] db version v2.4.10 Fri Jul 31 10:56:17.343 [initandlisten] git version: nogitversion Fri Jul 31 10:56:17.343 [initandlisten] build info: Linux hartmann 3.16.0-0.bpo.4-armmp-lpae #1 SMP Debian 3.16.7-ckt4-3~bpo70+1 (2015-02-12) armv7l BOOST_LIB_VERSION=1_55 Fri Jul 31 10:56:17.343 [initandlisten] allocator: system Fri Jul 31 10:56:17.343 [initandlisten] options: { bind_ip: "<ip goes here>", config: "/etc/mongodb.conf", dbpath: "/mnt/external1/mongodb", journal: "true", logappend: "true", logpath: "/mnt/external1/mongodb.log" } Fri Jul 31 10:56:18.002 [initandlisten] journal dir=/mnt/external1/mongodb/journal Fri Jul 31 10:56:18.002 [initandlisten] recover : no journal files present, no recovery needed Fri Jul 31 10:56:18.003 [initandlisten] warning couldn't write to / rename file /mnt/external1/mongodb/journal/prealloc.0: couldn't open file /mnt/external1/mongodb/journal/prealloc.0 for writing errno:1 Operation not permitted Fri Jul 31 10:56:18.022 [initandlisten] couldn't open /mnt/external1/mongodb/local.ns errno:1 Operation not permitted Fri Jul 31 10:56:18.022 [initandlisten] error couldn't open file /mnt/external1/mongodb/local.ns terminating Fri Jul 31 10:56:18.022 dbexit: Fri Jul 31 10:56:18.022 [initandlisten] shutdown: going to close listening sockets... Fri Jul 31 10:56:18.023 [initandlisten] shutdown: going to flush diaglog... Fri Jul 31 10:56:18.023 [initandlisten] shutdown: going to close sockets... Fri Jul 31 10:56:18.023 [initandlisten] shutdown: waiting for fs preallocator... Fri Jul 31 10:56:18.023 [initandlisten] shutdown: lock for final commit... Fri Jul 31 10:56:18.023 [initandlisten] shutdown: final commit... Fri Jul 31 10:56:18.023 [initandlisten] shutdown: closing all files... Fri Jul 31 10:56:18.023 [initandlisten] closeAllFiles() finished Fri Jul 31 10:56:18.023 [initandlisten] journalCleanup... Fri Jul 31 10:56:18.023 [initandlisten] removeJournalFiles Fri Jul 31 10:56:18.027 [initandlisten] shutdown: removing fs lock... Fri Jul 31 10:56:18.028 dbexit: really exiting now
这意味着MongoDB可以附加到现有的文件(日志本身),但不能创build新的文件。
如果不是root:plugdev (我相信是挂载外部驱动器的标准方式;如果我错了,请纠正我)我把所有者设置为mongodb:mongodb ,问题就消失了。 不过,我想要正确的做,而不是闯入。
我如何得到它的权利?
将/mnt/external1/mongodb和/mnt/external1/mongodb.log的所有者设置为mongodb:mongodb解决了这个问题。 但是,如果将驱动器格式化为NTFS并通过ntfs-3g挂载,则该解决scheme将无法工作,除非整个驱动器的所有者被设置为mongodb:mongodb 。 我把这个问题解决了,因为从forms的angular度来看,这确实是解决我这个问题的方法。