【问题标题】:mongodb 3.4.3 Permission denied wiredtiger_kv_engine.cpp 267 error with ubuntu 16mongodb 3.4.3 Permission denied Wiredtiger_kv_engine.cpp 267 错误与 ubuntu 16
【发布时间】:2017-08-25 12:33:03
【问题描述】:

我在将 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/system/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

【问题讨论】:

    标签: mongodb ubuntu


    【解决方案1】:

    我在将 mongod 作为服务启动时遇到问题:当我执行 sudo mongod -f /etc/mongod.conf 但使用 sudo service mongod start 启动它时,它怎么可能在日志中出现错误

    sudo 命令以mongod 开头,具有root 权限(又名superuser access)。如果您将mongod 作为服务运行,则用户和组在服务定义中进行配置(在您的示例中为mongodb)。

    无需以root 用户身份运行mongod 进程,根据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

    您的权限错误的可能原因是之前以root 用户身份启动了mongod。某些目录和文件现在可能归 root 用户所有,因此 mongodb 用户无法访问它们。您的具体错误与访问数据目录中的文件有关(即在mongod.conf 中配置的storage.dbPath)。

    假设您没有更改 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 服务用户写入)。

    【讨论】:

    • 嗨,这是一篇较旧的帖子,但它帮助我解决了我的问题。实际上我是 Linux 新手,我经常遇到同样的根类型问题。我有一个 root 用户连接到我的 VPS,所以当我安装服务时,它们总是由 root 用户创建,我总是不得不尝试更改权限。在 Linux 上安装东西的正确方法是什么?如果我是 root 用户,我如何告诉 Linux 安装 mongdb,例如,作为 mongodb 用户?我需要先创建这个用户,还是?
    • @Amir 如果您按照说明通过官方软件包(例如:Install MongoDB Community Edition on Ubuntu)安装 MongoDB,权限和目录将正确设置。 MongoDB 服务通过sudo service ... 管理,但mongod 进程以非特权用户/组权限运行(例如,mongodb/mongodb 在 Ubuntu 上,如果它们不存在时将被创建MongoDB服务器包已安装)。
    • 那是我遵循的教程,但我不必将sudo 放在我的命令前面,因为我已经以 root 身份登录。我应该把sudo 放在前面吗?这是我的安装中缺少的吗?
    • @Amir 抱歉,刚刚注意到您的评论。如果您已经以 root 身份登录,则无需运行 sudosudo 的目的是允许一个用户帐户以另一个帐户的权限运行(默认为 root,尽管可以指定其他用户)。但是,正如我在回答中指出的那样,以 root 用户身份运行 mongod 进程并不是最佳做法:推荐的方法是使用服务配置运行 mongod。您的mongod 进程的用户需要对dbPathmongod 使用的所有文件和目录具有读/写权限。
    • 感谢您指出以 root 身份启动 mongod 实际上会更改作为服务启动所需的一些文件权限。我一直在试图找出问题所在,您的解释使它点击了问题所在。
    【解决方案2】:

    我希望对上一个答案添加评论,但不幸的是我还不能。

    我完全同意 Stennie 的解释。这正是发生在我身上的事情。 我一直将 mongod 作为服务运行,但今天,因为我做了一些更改,我尝试使用 sudo mongod --auth --dbpath /data/mongodb/.. 运行该进程来测试授权和 ​​db 更改位置。 之后,由于这个权限问题,mongod 服务不再运行。

    我不得不说命令sudo chown -R mongodb:mongodb /data/mongodb/ 并没有像预期的那样立即解决问题。我不得不重启几次,删除/data/mongodb/下的mongod.lock文件,再次重新发出sudo chown命令..终于一切顺利。

    【讨论】:

      【解决方案3】:

      有同样的问题。

      /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/
      

      【讨论】:

        【解决方案4】:

        触发此类问题的三种设置:

        1. MongoDB 安装配置为在给定路径创建数据库文件,并且该路径在您当前的系统上不存在。此路径在 mongo 中称为 dbpath

        在您的情况下,检查/data/db 是否存在。如果没有或它为空,则 mongod 正在尝试错误的 dbpath。你需要找到它,它通常在/var/lib/mongodb下。

        找到它后,您可以做两件事。首先,将所有文件从那里复制到/data/db。其次,更改 mongod.conf 文件下的 dbpath,该文件位于(在 linux 中)/etc/mongod.conf。确保使用 --config 指定配置文件来启动 mongod。

        1. MongoDB 无权读取其 dbpath 对应的一个或多个文件或目录。

        chown mongodb:mongodb dbpath -R.

        1. MongoDB 缺少 WiredTiger.wt 。如果您删除 dbpath 下的文件或出现设备故障,则可能会发生这种情况。例如,我们这样做是为了测试恢复策略。

        如果您确定 dbpath 是正确的并且那里没有 WiredTiger.wt 的实例。你的数据库坏了。如果您丢失此文件,则无法确保完整性。通过以下方式重新安装 mongodb:

        sudo apt-get purge mongodb-org*

        sudo rm -r dbpath

        sudo apt-get install mongodb-org

        编辑: 或者从您的副本之一复制 dbpath。

        【讨论】:

          【解决方案5】:

          我有一个类似的问题,但有自定义日志路径和数据目录。更新所有者和组对它们的访问权限并不能解决作为服务运行的问题 将组和所有者更新为 mongodb:mongodb 可以自行运行 mongod,如前所述

          sudo -u mongodb mongod -f /etc/mongod.conf 
          

          sudo mongod -f /etc/mongod.conf
          

          【讨论】:

            【解决方案6】:
            sudo chmod -R 666 /var/lib/mongodb
            

            是另一种解决方案...

            【讨论】:

            • edit您的回答解释这将如何以及为什么会解决问题。
            【解决方案7】:

            如果您发现自己在 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
            

            【讨论】:

              【解决方案8】:

              我在我的 mongod.log 中遇到了同样的问题:

              2021-09-16T16:06:43.782+0200 F  STORAGE  [initandlisten] Reason: 13: Permission       denied
              2021-09-16T16:06:43.782+0200 F  -        [initandlisten] Fatal Assertion 28595     at src/mongo/db/storage/wiredtiger/wiredtiger_kv_engine.cpp 789
              

              所以我查看了我的 dbPath 文件夹(在 mongodb 配置文件 /etc/mongod.conf,部分 storage:dbPath 中指定),发现同一个文件归 root 所有:

               WiredTiger.turtle
               WiredTigerLAS.wt 
               journal/WiredTigerLog.0000000112
              

              从 dbPath 文件夹中,使用下面的命令,我将所有者和组更改为 mongodb:

              sudo chown mongodb:mongodb WiredTiger.turtle WiredTigerLAS.wt journal/WiredTigerLog.0000000112
              

              在此之后,我可以启动 mongodb 服务器为 “服务 mongod 开始” 并检查其状态为 带有输出的“服务 mongod 状态”:

              mongod.service - MongoDB Database Server
              Loaded: loaded (/lib/systemd/system/mongod.service; enabled; vendor preset: enabled)
              Active: active (running) since Thu 2021-09-16 16:19:47 CEST; 54min ago
              Docs: https://docs.mongodb.org/manual
              Main PID: 8459 (mongod)
                 CGroup: /system.slice/mongod.service
                         └─8459 /usr/bin/mongod --config /etc/mongod.conf
              Sep 16 16:19:47 svi5-ubu16 systemd[1]: Started MongoDB Database Server.
              

              请注意,以上命令是以普通用户身份运行的,而不是以 root 身份运行的。

              我的配置:Ubuntu 16.04.2 LTS,MongoDB shell 版本 v4.2.1。

              mongodb(用户和组)拥有的其他文件或文件夹:

              /var/log/mongodb
              /var/lib/mongodb 
              /tmp/mongodb-27028.sock
              

              我花了很多时间来解决这个问题,非常感谢在这里发帖并指导我解决问题的每一个人。

              【讨论】:

                猜你喜欢
                • 2018-12-24
                • 2021-11-30
                • 2013-09-28
                • 1970-01-01
                • 2021-01-10
                • 1970-01-01
                • 1970-01-01
                • 2022-07-18
                • 2020-07-30
                相关资源
                最近更新 更多