MongoDB: исключение в initAndListen: 20 Попытка создать файл блокировки в каталоге только для чтения: / data / db, завершение


149

Я создал /data/dbв корневом каталоге и запустил ./mongod:

[initandlisten] exception in initAndListen: 20 Attempted to create a lock file on a read-only directory: /data/db, terminating
[initandlisten] shutdown: going to close listening sockets...
[initandlisten] shutdown: going to flush diaglog...
[initandlisten] now exiting
[initandlisten] shutting down with code:100

4
похоже проблема с разрешениями. Есть ли у пользователя, запускающего mongod, разрешение на запись в каталог / data / db? Поделитесь выводом ls -ld /data/dbи idтак можем посоветовать.
Бьорн Рош,

drwxr-xr-x 2 root root 4096
whinytween96

uid = 1000 (пользователь) gid = 1000 (пользователь) группы = 1000 (пользователь), 4 (adm), 24 (cdrom), 27 (sudo), 30 (dip), 46 (plugdev), 113 (lpadmin), 128 (sambashare)
whinytween96,

@BjornRoche, спасибо за -ldроль :)
Skynet

@BjornRoche мой результат, drwxrwxrwx. 4 mongod mongod 4096 Sep 17 18:18 /data/dbи я все еще получаю сообщение об ошибке. Любые идеи?
Блейк

Ответы:


282

Проблема в том, что созданный вами каталог /data/dbпринадлежит и доступен для записи только пользователю root, но вы запускаете mongod от имени себя. Есть несколько способов решить эту проблему, но в конечном итоге вы должны предоставить соответствующему каталогу правильные разрешения. Если это для производства, я бы посоветовал вам проверить документацию и тщательно обдумать это - вы, вероятно, захотите проявить особую осторожность.

Однако, если это просто для тестирования, и вам просто нужно, чтобы это работало и продолжало с этим, вы можете попробовать это, что сделает каталог доступным для записи всем:

> sudo chmod -R go+w /data/db

или это, что сделает каталог принадлежащим вам:

> sudo chown -R $USER /data/db

4
Я думаю, что кому-то может потребоваться рекурсивно -Rизменить все /data/dbфайлы внутри.
Юнхао Ху

3
Спасибо за это. Пробовал и все равно получаю ту же ошибку
Samuel Dare

1
Эта тема уже немного устарела, но для меня использование chmodсгенерировало новую ошибку initAndListen : operation not permitted, но chownсработало.
bachinblack

chown сделал это и для меня
dwagnerkc

Давать 777 umask каталогу - плохая практика. Вы можете установить 755, и он работаетchmod -R 755 /data/db
Хуан-Каббали

62

На Mac мне пришлось сделать следующее:

sudo chown -R $USER /data/db
sudo chown -R $USER /tmp/

потому что был также файл, внутри /tmpкоторого Монго также нуждался в доступе


2
Работает в Fedora 28 Linux
Самуэль Иван

2
Это должно быть на вершине
Яшвант Камбала

1
это сделало это и для меня.
Canovice

25

Если ваша система использует SELinux, убедитесь, что вы используете правильный контекст для созданного вами каталога:

ls -dZ /data/db/
ls -dZ /var/lib/mongo/

и клонировать контекст с помощью:

chcon -R --reference=/var/lib/mongo /data/db

1
Ты спас мне день! Большое спасибо
Кеэртхивасан

2
ls -dZ / var / lib / mongodb / для более поздних версий mongo
03

17

У меня возникла та же проблема, и следующее решение решило эту проблему. Вам следует попробовать следующее решение.

sudo mkdir -p / data / db
sudo chown -R 'имя пользователя' / data / db


13

введите описание изображения здесьПрежде всего остановите все службы mongoDB , затем создайте каталог /, то есть root, если у вас его нет, а также удалите файл порта. предоставьте все разрешения этому каталогу, станьте владельцем этого каталога, выполните команду ниже:

sudo service mongod stop
sudo rm -rf /tmp/mongod*
sudo mkdir -p /data/db
sudo chmod -R a+wxr /data
sudo chown -R $USER:$USER /data

Теперь все готово, просто запустите службу MongoDB, если не помогло, попробуйте изменить порт, например:

sudo service mongod restart && mongod # if didn't help run below cmd
mongod --port 27018

Примечание: для меня все это работает, и я надеюсь, что сработает и для вас, парень!


7

Исправьте разрешения /data/db(или /var/lib/mongodb):

sudo chown -R mongodb: /data/db

затем перезапустите MongoDB, например, используя

sudo systemctl restart mongod

Если это не помогает, проверьте сообщение об ошибке, если вы используете каталог данных, отличный от / var / lib / mongodb. В этом случае запустите

sudo chown -R mongodb: <insert your data directory here>

источник


4

Хорошие решения, но мне интересно, почему никто не предлагает решения для окон.

Если вы используете Windows, вам просто нужно «Запускать от имени администратора» cmd.


7
Я думаю, это потому, что люди обычно не запускают серверы баз данных в Windows.
Blake

1
Кроме того, запускать базу данных от имени администратора / root - плохая идея, более подробную информацию
можно

4

Если вы проверяете свои журналы mongodb и получаете такую ​​ошибку, просто выполните шаги, как я. Это происходит из-за проблем с разрешениями в вашем /data/dbкаталоге. Я использую ubuntu16.04 и нахожу решение, выполнив две следующие простые команды.

Шаг 1. Дайте разрешение каталогу / data / db:

sudo chmod -R 0777 /data/db

Шаг 2: Попробуйте запустить службу mongod как:

sudo service mongod start

Шаг 3: проверьте статус службы mongod:

sudo service mongod status

2
Шаг 1 предоставит всем пользователям права на чтение / запись / выполнение. Это не должно использоваться.
Йонас Франц

Спасибо, @JonasFranz, за ваш отзыв, так что в этом случае мы можем использовать разрешение 0755 для рабочего сервера. Пожалуйста, поправьте меня, если я ошибаюсь.
Джитендра

4

Я имел дело с той же проблемой:

Перейдите в каталог MongoDB, который содержит binкаталог, и запустите:

sudo bin/mongod 

При запуске MongoDB от имени пользователя root вас могут попросить ввести пароль root. Если вы по-прежнему не можете запустить MongoDB, проверьте разрешения для каталога данных MongoDB. Войти:

ls -ld /data

или введите ls -l /разрешения для всех каталогов и файлов в каталоге, включая /dataкаталог.

Режим разрешений для пользователя root должен быть " rwx", что означает, что пользователь root может читать, записывать и выполнять файлы. Для этого мы используем:

chmod 755 /data 

755представляет собой восьмеричное обозначение для установки разрешений /dataкаталога на « rwxr-xr-x», что означает, что пользователь root может читать, писать и выполнять, тогда как «группа» и «все» могут только читать и выполнять.

Примечание. Если вы не можете этого сделать, введите вместо этого:

sudo chmod 755 /data   

чтобы установить разрешение как пользователь root.

Затем, когда закончите с этим шагом, повторно захватите режимы разрешений, используя:

ls -ld /data

который должен выглядеть так:

drwxr-xr-x  3 root  wheel  102 Mar  3 17:00 /data

Вам не нужно беспокоиться о " d" в начале, и обратите внимание, что разрешения отражают " rwxr-xr-x".

Теперь вы можете вернуться в каталог MongoDB и ввести:

sudo bin/mongod  

для запуска MongoDB.


2
Плохая идея, НИКОГДА не запускайте его как sudo. Есть лучшие решения, которые управляют пользователем / группой mongod или mongodb в зависимости от вашего дистрибутива. Не используйте это решение.
Энди

3

Если вам не нужно, чтобы каталоги базы данных были в корне, вы можете создать их data/dbв своем домашнем каталоге ( mkdir -p ~/data/db).

Затем вы можете запустить сервер MongoDB с --dbpathопцией:

mongod --dbpath=$(echo ~)/data/db

(Предполагается, что вы запускаете его с терминала. По какой-то странной причине mongodне принимает ~ в качестве пути к домашнему каталогу, поэтому вы также можете написать обман bash echo /home/yourusername/data/db)

Фактически, это не обязательно ~/data/db, это может быть где угодно, и таким образом у вас может быть несколько путей к базе данных и все хорошо организовать. Возможно, это не лучший вариант для производства (в зависимости от того, что вы хотите сделать), но для разработки работает нормально.


2

вам просто нужно запустить команду от имени суперпользователя:

просто введите с терминала: sudo su mongod


1
Всегда плохая идея запускать подобные программы от имени суперпользователя. Лучше поправить разрешения папок
Джейсон


0

Это сработало для меня в Ubuntu LTS 20.04:

$ sudo service mongod start

1
Пожалуйста, объясните, почему вы думаете, что это сработает и для других!
sauhardnc

1
Пожалуйста, опишите решение более подробно с дополнительными сведениями, такими как объяснение фактической причины, добавление фрагмента рабочего кода и шаги, которые необходимо выполнить для устранения проблем. Дополнительные сведения см. В рекомендациях StackOverflow.
Капил Рагхуванши

0

Проверьте, включен ли SElinux. Если он находится в принудительном режиме, просто попробуйте разрешающий режим. В случае, если это поможет, вам следует создать политики SElinux для mongodb.

Вы можете попробовать с помощью audit2allow - проверьте https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/6/html/security-enhanced_linux/sect-security-enhanced_linux-fixing_problems-allowing_access_audit2allow

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.