我的这项systemd
服务具有以下PIDFile
属性:
PIDFile=/home/john/.pm2/pm2.pid
您可能期望该文件位于该/run
目录下。不幸的是,事情就是这样,我无法直接改变它(不过我正在努力)。
因此,当我启动服务时出现此错误
SELinux is preventing systemd from read access on the file pm2.pid.
这是(我认为是)相关信息:
Source Context system_u:system_r:init_t:s0
Target Context system_u:object_r:user_home_t:s0
我想用 更新目标上下文chcon
。我认为我应该更新第三位(又称类型),但我不知道要设置什么。
如何更改 PID 文件的安全上下文以使错误消失?
答案1
只是添加另一个不需要新 SELinux 规则的选项:
编辑systemd
启动的文件pm2
并指定 PIDFile 的替代位置pm2
)。您必须进行两项更改,一项是告诉pm2
在哪里放置 PIDFile,另一项是告诉systemd
在哪里查找它。将现有的 PIDFile 行替换为以下两行
Environment=PM2_PID_FILE_PATH=/run/pm2.pid
PIDFile=/run/pm2.pid
如果您有权添加新的 SELinux 规则,您systemd
也应该有权编辑该文件。
答案2
由于我还没有弄清楚的原因,SELinux 正在阻塞,pm2
但没有正确记录它(即使更改配置以显示所有日志),所以我没有任何东西可以通过管道传输到audit2allow
.
花了半天时间,我的解决方案是最终创建一个pm2
以我所需的用户身份运行的自定义 .sh,然后创建一个服务来运行该 .sh。
以下操作是作为 root 用户完成的。
- 创建目录
mkdir /usr/bin/pm2-startup
nano pm2-startup.sh
创建包含以下内容的 脚本文件:#!/bin/bash runuser -l [insert desired username here] -c 'pm2 resurrect'
nano /etc/systemd/system/pm2.service
创建包含以下内容的 服务文件:[Unit] Description=Resurrect PM2 as [desired username] After=network.target [Service] Type=simple ExecStart=/usr/bin/pm2-startup/pm2_startup.sh TimeoutStartSec=0 [Install] WantedBy=default.target
- 重新加载系统
systemctl daemon-reload
- 启用新创建的服务
systemctl enable pm2.service
- 启动服务
systemctl start pm2
- 确保服务以 启动
systemctl status pm2
,然后重新启动以确保 pm2 复活systemctl reboot
- 重新启动后,
pm2 list
以您正在使用的用户身份运行并确认应用程序正在运行。
如果您在启动后检查该服务的状态,它会说inactive
因为它实际上只是一个运行单个脚本的服务,然后就完成了。
答案3
添加规则就可以了。尝试启动服务(这会导致超时)后,我必须以 root 身份运行这些命令
ausearch -c 'systemd' --raw | audit2allow -M my-systemd
semodule -i my-systemd.pp
现在一切似乎都很好。重启后,服务正常启动。
请注意,此解决方案可能只能暂时起作用,因为新规则似乎是在文件中定义的/tmp/my-systemd.te
。这是它的内容(我猜包含实际感兴趣的政策)
module my-systemd 1.0;
require {
type init_t;
type user_home_t;
class file { open read };
}
#============= init_t ==============
#!!!! This avc is allowed in the current policy
allow init_t user_home_t:file read;
allow init_t user_home_t:file open;