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

MongoDB не будет работать, если dbPath привязан к символической ссылке

Я установил MongoDB 4.0.4 из официального репо. Я последовал за эти инструкции. Моя ОС - CentOS 7, а SELinux находится в принудительном режиме. Если я использую dbPath значение, которое является символической ссылкой на другой каталог, в журнале появляется следующая ошибка:

exception in initAndListen: Location28596: Unable to determine status of lock file in the data directory /var/lib/mongo_test: boost::filesystem::status: Permission denied: "/var/lib/mongo_test/mongod.lock", terminating

Если я изменю dbPath в любой другой каталог, который не имеет символических ссылок, он будет работать нормально.

Это моя текущая тестовая установка, и она выдаст ошибку:

# ln -s /var/lib/mongo /var/lib/mongo_test

# chcon -u system_u -t mongod_var_lib_t -h /var/lib/mongo_test

# cat /etc/mongod.conf | grep -v '^$\|^\s*\#'
systemLog:
  destination: file
  logAppend: true
  path: /var/log/mongodb/mongod.log
storage:
  dbPath: /var/lib/mongo_test
  journal:
    enabled: true
processManagement:
  fork: true
  pidFilePath: /var/run/mongodb/mongod.pid
  timeZoneInfo: /usr/share/zoneinfo
net:
  port: 27017
  bindIp: 127.0.0.1

# ls -alZ /var/lib/ | grep mongo
drwxr-xr-x. mongod    mongod    system_u:object_r:mongod_var_lib_t:s0 mongo
lrwxrwxrwx. root      root      system_u:object_r:mongod_var_lib_t:s0 mongo_test -> /var/lib/mongo

# namei -l /var/lib/mongo_test/mongod.lock
f: /var/lib/mongo_test/mongod.lock
dr-xr-xr-x root   root   /
drwxr-xr-x root   root   var
drwxr-xr-x root   root   lib
lrwxrwxrwx root   root   mongo_test -> /var/lib/mongo
dr-xr-xr-x root   root     /
drwxr-xr-x root   root     var
drwxr-xr-x root   root     lib
drwxr-xr-x mongod mongod   mongo
-rw------- mongod mongod mongod.lock

Здесь вы почти наверняка столкнетесь с SELinux. Пока он ожидает и разрешает доступ к каталогу данных /var/lib/mongo, или более конкретно файлы и каталоги, имеющие тип SELinux mongod_var_lib_t, он ничего не знает о вашей символической ссылке, поскольку, вероятно, не имеет этого типа.

Если вы измените тип SELinux символической ссылки, вы можете обнаружить, что MongoDB может снова получить доступ к базе данных.

chcon -h -t mongod_var_lib_t /var/lib/mongo_test

Обратите внимание, что вы, вероятно, еще не закончили. Если вы возитесь с подобными символическими ссылками, вы, вероятно, собираетесь сделать что-то вроде размещения всех ваших данных на каком-то другом диске. В таком случае, вам также необходимо сделать контексты постоянными (см. здесь).