我在将mongod作为服务时遇到问题: 当我执行sudo mongod -f /etc/mongod.conf但是当使用sudo service mongod start启动它时,它是如何工作的呢?我在日志中收到错误
Assertion: 28595:13: Permission denied src/mongo/db/storage/wiredtiger/wiredtiger_kv_engine.cpp 267
我在ubuntu 16上运行mongodb
我完全按照mongodb文档中的说明安装该版本,这是一个错误吗?任何建议如何解决这一点是值得赞赏的。
其他信息:
mongodb服务启动脚本如下所示,并以用户mongodb的身份运行,是否可以连接到错误? LIB / systemd /系统/ mongodb.service:
[Unit]
Description=MongoDB Database Service
Wants=network.target
After=network.target
[Service]
ExecStart=/usr/bin/mongod --config /etc/mongod.conf
ExecReload=/bin/kill -HUP $MAINPID
Restart=always
User=mongodb
Group=mongodb
StandardOutput=syslog
StandardError=syslog
[Install]
WantedBy=multi-user.target
答案 0 :(得分:40)
我在使用mongod作为服务时遇到了问题:当我执行sudo mongod -f /etc/mongod.conf但是当使用sudo service mongod start启动它时它是如何工作的我在日志中出错了
sudo
命令以mongod
权限(又名superuser access)启动root
。如果您将mongod
作为服务运行,则在服务定义中配置用户和组(在您的示例中为mongodb
配置)。
无需像mongod
用户那样运行root
进程,强烈建议不要使用Principle of least privilege的常见安全做法。
如果要从命令行测试配置,可以使用sudo
与指定用户而不是默认(root)用户一起运行。
例如:
sudo -u mongodb mongod -f /etc/mongod.conf
通常,最好使用服务配置,而不是手动运行mongod
。通过手动调用,您还必须记住包含配置文件路径之类的参数(因为没有默认的配置路径)。如果没有配置文件,mongod
也会使用默认选项,例如dbPath
/data/db
。
断言:28595:13:权限被拒绝src / mongo / db / storage / wiredtiger / wiredtiger_kv_engine.cpp 267
您的权限错误的可能原因是之前已mongod
用户身为root
。某些目录和文件现在可能由root用户拥有,因此mongodb
用户无法访问这些目录和文件。您的具体错误与访问数据目录中的文件(即storage.dbPath
中已配置的mongod.conf
)有关。
假设您没有更改mongod.conf
文件中的默认路径,您应该能够递归调整权限以匹配mongod.service
定义所期望的内容。
首先,确保您已暂停mongod
实例,如果它当前正在运行。
然后,递归调整对预期用户和组的权限:
# storage.dbPath
sudo chown -R mongodb:mongodb /var/lib/mongodb
# systemLog.path
sudo chown -R mongodb:mongodb /var/log/mongodb
现在您应该可以启动mongod
作为服务。如果服务无法启动,则mongod
日志文件中应该有更详细的信息(假设日志文件可由mongodb
服务用户写入)。
答案 1 :(得分:7)
有同样的问题。
/var/log/mongodb/mongod.log中的内容:
2017-05-13T13:46:41.152+0700 E STORAGE [initandlisten] WiredTiger error (13) [1494658001:152518][15821:0x7fb843803cc0], connection: /var/lib/mongodb/journal/WiredTigerPreplog.0000000002: file-remove: unlink: Permission denied
2017-05-13T13:46:41.159+0700 I - [initandlisten] Assertion: 28595:13: Permission denied src/mongo/db/storage/wiredtiger/wiredtiger_kv_engine.cpp 267
所以我们看到有些东西无法删除/ var / lib / mongodb / journal /中的文件“WiredTigerPreplog.0000000002” 所以id只是给了权限,我刚刚做了:
sudo chmod 764 /var/lib/mongodb/journal/
如果没有帮助,请尝试:
sudo chown -R mongodb:mongodb /var/lib/mongodb/ && sudo chmod 764 /var/lib/mongodb/journal/
答案 2 :(得分:6)
有三种设置会触发此类问题:
在您的情况下,请检查是否存在/data/db
。如果它没有或者它是空的,那么mongod正在尝试错误的dbpath。你需要找到它,它通常在/var/lib/mongodb
下。
一旦你找到它,你可以做两件事。首先,将所有文件从那里复制到/data/db
。其次,在mongod.conf文件下更改dbpath,该文件位于/etc/mongod.conf
(在linux中)。确保使用--config
指定配置文件启动mongod。
chown mongodb:mongodb dbpath -R
。
如果你确定dbpath是正确的,并且那里没有WiredTiger.wt的实例。你的数据库坏了。如果丢失此文件,则无法确保完整性。通过以下方式重新安装mongodb:
sudo apt-get purge mongodb-org*
sudo rm -r dbpath
sudo apt-get install mongodb-org
编辑: 或者从您的一个副本中复制dbpath。
答案 3 :(得分:0)
我希望对上一个答案附加评论,但不幸的是我还不能。
我完全同意Stennie的解释。这正是发生在我身上的事情。
我一直将mongod作为服务运行,但今天,因为我做了一些更改,我尝试使用sudo mongod --auth --dbpath /data/mongodb/
来运行该过程来测试授权和数据库更改位置。
之后,由于此权限问题,mongod服务不再运行。
我已经说过sudo chown -R mongodb:mongodb /data/mongodb/
命令没有按预期立即解决问题。我不得不多次重启,删除mongod.lock
下的/data/mongodb/
文件,再次重新发出sudo chown
命令..最后一切都进展顺利。
答案 4 :(得分:0)
我有一个类似的问题,但是具有自定义日志路径和数据目录。更新所有者和对他们的组访问权不能解决作为服务运行的问题 将组和所有者更新为mongodb:如前所述,mongodb可自行运行mongod
!rm ~/yourfolder.zip
或
sudo -u mongodb mongod -f /etc/mongod.conf
答案 5 :(得分:0)
sudo chmod -R 666 /var/lib/mongodb
是另一种解决方案...
答案 6 :(得分:0)
如果您在 CentOS 上发现自己遇到同样的问题,但权限看起来是正确的,可能是因为 SELinux 策略。在我的系统上,MongoDB 文件使用特定的 SELinux 上下文。 mongod 服务器无法启动,输出相同的权限错误,直到我更正 SELinux 上下文。
如果不存在,则创建 MongoDB 数据文件夹(/var/lib/mongo 或 /var/lib/mongodb,检查您的 /etc/mongod.conf 文件):
$ mkdir -p /var/lib/mongodb
然后尝试恢复 SELinux 上下文:
$ restorecon -v /var/lib/mongodb
$ restorecon -v /var/lib/mongodb/*
如果仍然不起作用,请尝试直接应用上下文:
$ chcon system_u:object_r:mongod_var_lib_t:s0 /var/lib/mongodb
$ chcon system_u:object_r:mongod_var_lib_t:s0 /var/lib/mongodb/*
验证上下文是否正确:
$ ls -lZ -d /var/lib/mongodb
drwxr-xr-x. mongod mongod system_u:object_r:mongod_var_lib_t:s0 /var/lib/mongodb