已经将 /host/dir 加入了 /etc/fapolicyd/rule.d/ 下
这说明你已经尝试通过 fapolicyd 的规则允许容器挂载目录被访问。但仍然遇到:
runc create failed: waiting for init preliminary setup: read init-p: connection reset by peer
这强烈表明 fapolicyd 仍在拦截或干扰容器启动,可能是:
🔍 根因可能有:
✅ 1. 规则文件存在,但没有生效
fapolicyd 的规则文件修改后,需要重建数据库并重启服务:
sudo fagenrules
sudo systemctl restart fapolicyd
否则更改不会生效。
✅ 2. 规则不正确或太保守
你是否加的是白名单规则?例如:
allow perm=execute : dir=/host/dir
若写法不对,或权限不足,fapolicyd 依然会拒绝。
✅ 3. 容器执行文件路径未包含在白名单中
容器运行时,如 Docker/Podman,会从 /usr/bin/runc、/usr/bin/containerd-shim、或者 container 镜像中的 /bin/sh 启动进程。这些执行路径也需被允许。
✅ 解决建议
✅ 方法一:确认规则是否生效
执行以下命令以检查哪些操作被阻止:
sudo journalctl -t fapolicyd
你可以看到被拒绝的路径,例如:
fapolicyd: access denied: /host/dir/somebin
这会帮你确认还缺少哪些规则。
✅ 方法二:临时禁用 fapolicyd 验证问题是否确实来自它
sudo systemctl stop fapolicyd
然后重新运行你的容器命令,例如:
docker run -v /host/dir:/container/dir your-image
如果成功启动,说明确实是 fapolicyd 在阻止。
✅ 方法三:加宽规则允许容器使用
可以尝试添加更宽泛的规则,如:
allow perm=any all : dir=/host/dir
然后重建规则并重启服务:
sudo fagenrules
sudo systemctl restart fapolicyd
✅ 方法四(开发或非生产环境):
如果你只是本地测试容器,建议暂时关闭 fapolicyd:
sudo systemctl disable –now fapolicyd
systemctl stop fapolicyd 是 临时关闭服务,它的行为如下:
✅ 不会自动恢复运行
一旦你执行了:
systemctl stop fapolicyd
fapolicyd 服务会一直保持关闭状态,直到你手动启动它。
❗除非发生以下情况之一,它才会“自动恢复”:
情况 | 是否会导致 fapolicyd 重新启动 |
---|---|
你手动运行 systemctl start fapolicyd | ✅ 是 |
服务器重启(且 fapolicyd 设置为开机自启) | ✅ 是 |
有人或自动脚本运行 systemctl restart | ✅ 是 |
只是停止服务,没有重启系统 | ❌ 否,服务不会自动恢复 |
你可以检查是否设为开机启动:
systemctl is-enabled fapolicyd
如果返回:
enabled:说明重启系统后它会恢复运行
disabled:重启系统后它仍然不会启动
✅ 如果你想让它彻底不再自动运行:
sudo systemctl disable fapolicyd
这样即使系统重启,它也不会恢复。
✅ 如果你只是临时调试,建议做完后恢复:
sudo systemctl start fapolicyd
🧠 补充建议
正在排查容器启动失败的问题,临时关闭 fapolicyd 是一种好方法。
但建议最终还是加规则解决根本问题,而不是依赖关闭服务。
sudo fapolicyd –debug
确实可能会阻塞系统或导致 SSH 卡顿,原因如下:
⚠️ 为什么 fapolicyd –debug 可能导致系统卡顿甚至 SSH 登录失败?
✅ 原因一:debug 模式会劫持系统调用
fapolicyd –debug 模式会:
拦截并打印系统中所有的文件执行相关事件
输出非常密集,尤其在高频操作系统中(容器、cron、sshd)
如果你在 –debug 模式下启动了容器或系统活跃进程,fapolicyd 会疯狂打印,严重拖慢系统,甚至导致:
进程调度异常
SSH 登录卡死
CPU 飙高
系统响应变慢
✅ 如何恢复系统
方法一:远程连接失败?尝试本地控制台登录
如果你有 IPMI、iDRAC、BMC 或 KVM 接口,优先通过控制台连接后执行:
sudo killall fapolicyd
sudo systemctl restart fapolicyd
方法二:尝试已有会话恢复
如果你还有一个已经登录的 ssh 会话或 tmux/screen 没死,尝试:
ps aux | grep fapolicyd
kill -9
方法三:强制重启服务器(最后手段)
如果你无法通过任何方式登录,可能需要通过云后台或物理按钮执行:
硬重启(reboot / power cycle)
⚠️ 重启后,fapolicyd 会再次启动(如果是 enabled 状态),所以建议马上:
sudo systemctl disable fapolicyd
✅ 正确使用 fapolicyd 的调试方式(不影响系统)
下次你可以改用更安全的方式调试:
sudo fapolicyd –debug > /tmp/fapolicyd.log 2>&1 &
这样它在后台运行,且日志被重定向,不会卡死终端。
也可以临时调低日志量:
sudo fapolicyd –debug –rules=/tmp/minimal.rules
用一个最小化规则集避免频繁触发。
✅ 总结建议
动作 | 建议 |
---|---|
系统卡死原因 | –debug 模式输出过多导致系统负荷异常 |
恢复方法 | 杀掉进程或重启系统 |
避免卡顿 | 后台运行并重定向日志 |
容器调试 | 建议用 auditd 或 strace 替代 |
若你觉得我的文章对你有帮助,欢迎点击上方按钮对我打赏