Назад | Перейти на главную страницу

Проблема с разрешениями на каталог данных MongoDB

TL; DR: MongoDB жалуется на разрешения в каталоге, где все разрешено.

Я бегаю MongoDB v2.4.10 на Debian Jessie ARM. Я хочу хранить данные на внешнем диске, который отформатирован в 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:

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 может добавлять в существующие файлы (сам журнал), но не может создавать новые.

Если вместо root:plugdev (который, я считаю, является стандартным способом установки внешних дисков; поправьте меня, если я ошибаюсь). Я установил для владельца mongodb:mongodb, проблема уходит. Однако я бы хотел сделать это правильно, вместо того, чтобы пробиваться сквозь них.

Как мне это исправить?

Установка владельца только что /mnt/external1/mongodb и /mnt/external1/mongodb.log к mongodb:mongodb решает проблему. Однако это решение не сработает, если диск отформатирован в NTFS и смонтирован через ntfs-3g, если только владелец всего диска не настроен на mongodb:mongodb. Отмечу вопрос как решенный, так как с формальной точки зрения это действительно решение проблемы в моем случае.