前端analysis | 知其所以然

AlmaLinux fapolicy

2025-06-03

已经将 /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 替代
使用支付宝打赏
使用微信打赏

若你觉得我的文章对你有帮助,欢迎点击上方按钮对我打赏