尝试设置 systemd 服务时,一直出现“更改请求的工作目录失败:权限被拒绝”

尝试设置 systemd 服务时,一直出现“更改请求的工作目录失败:权限被拒绝”

我是 Linux 新手,4 个月前才从 Windows 转过来。我正在尝试使用教程,当我尝试通过 systemd 启动服务器并检查其状态时,我不断收到此信息:

Loaded: loaded (/etc/systemd/system/minecraft.service; disabled; vendor preset: enabled)
     Active: failed (Result: exit-code) since Tue 2022-07-19 22:32:20 PDT; 6s ago
    Process: 21308 ExecStart=/usr/bin/java -Xmx1024M -Xms1024M -jar server.jar nogui (code=exited, status=200/CHDIR)
   Main PID: 21308 (code=exited, status=200/CHDIR)
        CPU: 14ms

Jul 19 22:32:20 myname-ThinkPad systemd[1]: Started Minecraft Server.
Jul 19 22:32:20 myname-ThinkPad systemd[21308]: minecraft.service: Changing to the requested working directory failed: Permission denied
Jul 19 22:32:20 myname-ThinkPad systemd[21308]: minecraft.service: Failed at step CHDIR spawning /usr/bin/java: Permission denied
Jul 19 22:32:20 myname-ThinkPad systemd[1]: minecraft.service: Main process exited, code=exited, status=200/CHDIR
Jul 19 22:32:20 myname-ThinkPad systemd[1]: minecraft.service: Failed with result 'exit-code'.

我确实在几个地方偏离了教程,我确信问题就出在那里。出于几个原因,我使用自己的用户配置文件来安装服务器,而不是单独创建一个,但我确保相应地更改了路径。我还必须安装 Oracle Java,因为 OpenJDK 在安装服务器文件时遇到了问题(我使用的是 1.19 而不是 1.16,后者是教程中链接的版本)。

这是 systemd 文件:

[Unit]
Description=Minecraft Server
After=network.target

[Service]
User=myname
Nice=1
KillMode=none
SuccessExitStatus=0 1
ProtectHome=true
ProtectSystem=full
PrivateDevices=true
NoNewPrivileges=true
WorkingDirectory=/home/myname/mc_server/server
ExecStart=/usr/bin/java -Xmx1024M -Xms1024M -jar server.jar nogui
ExecStop=/home/myname/mc_server/tools/mcrcon/mcrcon -H 127.0.0.1 -P 25575 -p serverpasswd stop

[Install]
WantedBy=multi-user.target

所以我想我的问题是,有没有办法解决这个问题,而不需要创建单独的用户配置文件或返回到 OpenJDK(以及旧版本的游戏)?

答案1

问题是你设置了ProtectHome=true,这限制了服务对 的访问/home,但同时又希望服务能够cd/home它无法做到这一点,因为它被设置为ProtectHome,因此它会给出你看到的错误:

Changing to the requested working directory failed: Permission denied

解决此问题的方法是:

  1. /opt按照教程说明将 Minecraft 文件放入
  2. 从服务文件中删除该ProtectHome行以允许服务访问/home

相关内容