飞牛 NAS Docker 无法启动 —— 故障排查全过程记录
文档版本:v1.0 记录日期:2026-08-17 设备主机名:MaoMaoFnOS 一、故障概述 现象:使用 Hermes Agent(1panel/hermes-agent,一款带 shell 执行能力的自我改进型 AI 智能体)操作后,飞牛 NAS 的 Docker 服务无法启动,所有容器停止,网页端 Docker 页面异常。 最终结论: docke...
文档版本:v1.0
记录日期:2026-08-17
设备主机名:MaoMaoFnOS
一、故障概述
现象:使用 Hermes Agent(1panel/hermes-agent,一款带 shell 执行能力的自我改进型 AI 智能体)操作后,飞牛 NAS 的 Docker 服务无法启动,所有容器停止,网页端 Docker 页面异常。
最终结论:
docker-ce/docker-ce-cli两个包被卸载,导致/usr/bin/dockerd和/usr/bin/docker二进制文件丢失,Docker 引擎无法启动(status=203/EXEC)。- 系统 apt 源的 GPG 公钥被破坏(
keyring.gpg0 字节、debian-archive-bookworm-stable.asc被截断为 461 字节),导致apt-get install无法重装 Docker。 - 最终通过直接下载 .deb 包手动安装绕过 apt 源,成功恢复,容器数据完好。
二、环境信息
| 项目 | 值 |
|---|---|
| 主机名 | MaoMaoFnOS |
| 系统 | 飞牛 fnOS(基于 Debian 12 bookworm) |
| 内核 | 6.18.18-trim #570 SMP PREEMPT_DYNAMIC |
| 架构 | x86_64 |
| Docker 原版本 | 28.2.2-1~debian.12~bookworm |
| containerd.io | 1.7.27-1 |
| docker-ce-rootless-extras | 5:28.2.2(残留包,暴露原版本) |
| Docker 数据目录 | /vol2/docker(daemon.json 指定) |
磁盘状态(排查时确认,非满盘):
| 挂载点 | 容量 | 已用 | 使用率 |
|---|---|---|---|
| / | 63G | 16G | 26% |
| /vol1 | 56G | 23G | 42% |
| /vol2 | 120G | 93G | 80% |
| /vol3 | 7.3T | 3.5T | 48% |
三、排查全过程(时间线)
第一步:定位 Docker 服务故障
SSH 登录后执行诊断,systemctl status docker 显示:
Active: failed (Result: exit-code)
Process: ExecStart=/usr/bin/dockerd ... (code=exited, status=203/EXEC)
日志关键行:
docker.service: Failed to locate executable /usr/bin/dockerd: No such file or directory
同时命令行执行 docker ps -a 报:
-bash: docker: command not found
判断:不是 daemon.json 配置问题,也不是磁盘满,而是 Docker 二进制文件本身丢失。
此时已排除:daemon.json 内容正常、各磁盘均未写满、
/var/lib/docker仅 424K(因为 data-root 在 /vol2/docker)。
第二步:确认包卸载情况
dpkg -l | grep docker 显示:
ii containerd.io 1.7.27-1
ii docker-ce-rootless-extras 5:28.2.2-1~debian.12~bookworm
docker-ce 和 docker-ce-cli 已不在列表中(被卸载)。
关键线索:残留的 docker-ce-rootless-extras 版本号 5:28.2.2 直接暴露了原 Docker 版本就是 28.2.2,为后续手动重装提供了精确版本依据。
第三步:尝试 apt 重装(多次失败)
3.1 首次尝试
未提权(普通用户 maoxuan)执行 apt-get install,报 Permission denied。需 sudo -i 提权。
3.2 提权后 apt update 报 GPG 错误
NO_PUBKEY 6ED0E7B82643E131 NO_PUBKEY 78DBA3BC47EF2265 ...
Debian 源的签名公钥无法验证,apt 忽略这些源,docker-ce 报"无安装候选"。
3.3 重装 debian-archive-keyring(无效)
dpkg -i /var/cache/apt/archives/debian-archive-keyring_2023.3+deb12u2_all.deb
重装后 apt-get update 仍报 NO_PUBKEY。
3.4 强制覆盖 conffile(无效)
dpkg --force-confnew -i /var/cache/apt/archives/debian-archive-keyring_2023.3+deb12u2_all.deb
仍报 NO_PUBKEY。说明坏掉的 keyring 文件不是该包管理的 conffile。
3.5 复制正确 keyring(无效)
cp -f /usr/share/keyrings/debian-archive-keyring.gpg /etc/apt/trusted.gpg.d/
apt 仍报 NO_PUBKEY。判断飞牛对 apt 的 keyring 信任机制做了定制,全局目录不再生效。
第四步:最终方案 —— 下载 .deb 直装
放弃 apt 源,直接从镜像站下载 Docker 官方 deb 包手动安装:
cd /tmp
# 下载 docker-ce-cli 28.2.2
curl -fL --retry 3 -o docker-ce-cli.deb \
"https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/debian/dists/bookworm/pool/stable/amd64/docker-ce-cli_28.2.2-1~debian.12~bookworm_amd64.deb"
# 下载 docker-ce 28.2.2
curl -fL --retry 3 -o docker-ce.deb \
"https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/debian/dists/bookworm/pool/stable/amd64/docker-ce_28.2.2-1~debian.12~bookworm_amd64.deb"
# 安装(先 cli 后 ce)
dpkg -i docker-ce-cli.deb docker-ce.deb
# 启动
systemctl daemon-reload
systemctl restart docker
systemctl restart dockermgr
# 验证
docker ps -a
结果:docker ps -a 成功列出所有容器,safeline(雷池)、moontv、lunatv、kvrocks 等容器自动恢复 Up,容器数据完好无损。
四、根因分析
直接根因
docker-ce、docker-ce-cli 两个 apt 包被卸载,Docker 引擎二进制(/usr/bin/dockerd)和客户端(/usr/bin/docker)丢失。
深层线索
排查中发现 /etc/apt/sources.list 头部有异常注释:
# Debian镜像源 - 由 Trim Security 自动修复生成
# 修复时间: 2026-02-02 22:14:56
# 原配置已备份为: /etc/apt/sources.list.malicious.bak.*
同时发现多个 GPG keyring 文件被破坏:
/etc/apt/trusted.gpg.d/keyring.gpg→ 0 字节(空文件)/etc/apt/trusted.gpg.d/debian-archive-bookworm-stable.asc→ 461 字节(正常应 2~3KB,被截断)
结论:2026-02-02 前后系统发生过一次"恶意篡改"事件(或 Trim Security 误报),飞牛安全组件"自动修复"了 apt 源,但 keyring 文件没被正确恢复,反而被破坏,导致 apt 源长期处于 GPG 验证失败状态。
关于"元凶"
容器列表中存在两个 1panel/hermes-agent 容器。Hermes Agent 是带 shell 执行权限的自我改进型 AI 智能体,极可能在执行任务时卸载了 Docker 包或改动了系统底层配置,属于典型"AI agent 无权限隔离操作宿主"事故。
五、遗留问题
apt 源 GPG 验证失败(未彻底解决)
apt-get update 仍会报 NO_PUBKEY,影响后续 apt install 安装软件。
已尝试但无效:重装 keyring、强制覆盖 conffile、复制正确 keyring 到信任目录。
建议处理方案(按优先级):
-
给 Debian 源显式指定签名文件:
sed -i 's|^deb https://mirrors|deb [signed-by=/usr/share/keyrings/debian-archive-keyring.gpg] https://mirrors|' /etc/apt/sources.list /etc/apt/sources.list.d/aliyun.list -
从 docker 镜像层提取干净 keyring:
SRC=$(find /vol2/docker -path "*usr/share/keyrings/debian-archive-keyring.gpg" 2>/dev/null | head -1) cp -f "$SRC" /etc/apt/trusted.gpg.d/debian-archive-keyring.gpg -
使用飞牛网页端「系统修复」一键重置。
注:此问题不影响 Docker 及容器运行,仅影响 apt 安装软件。
六、安全排查结果
crontab -l:干净,仅系统自带 logrotate 任务/etc/cron.d/:正常(e2scrub_all、sysstat)/etc/init.d/:全部为正常系统服务sources.list.malicious.bak.*:内容与当前源一致(均为干净中科大源),未发现恶意地址
判定:未发现后门或恶意脚本残留,事件更接近 Trim Security 误报/误操作。
七、经验与建议
- AI agent 权限隔离:带 shell 执行权的 AI(Hermes 等)不要以 root 直跑宿主,应使用非 root 用户 + 最小权限,或放入受限容器/沙箱。
- Docker 数据备份:本次数据未丢失,是因为
data-root在/vol2/docker且卸载包不删数据目录,但仍建议定期备份/vol2/docker。 - apt 源可恢复性:遇到 GPG 验证失败,
dpkg --force-confnew和复制 keyring 均可能无效,最快方案是直接下载 .deb 直装。 - 版本号是关键线索:残留的
docker-ce-rootless-extras暴露了精确版本,避免装错版本导致"未知错误"。
附:关键命令速查
# 查看 Docker 服务状态
systemctl status docker
# 查看 Docker 启动失败日志
journalctl -u docker -n 50
# 查看已安装的 docker 相关包
dpkg -l | grep -iE 'docker|containerd'
# 手动下载并安装 docker-ce(以 28.2.2 为例)
cd /tmp
curl -fL -o docker-ce-cli.deb "https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/debian/dists/bookworm/pool/stable/amd64/docker-ce-cli_28.2.2-1~debian.12~bookworm_amd64.deb"
curl -fL -o docker-ce.deb "https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/debian/dists/bookworm/pool/stable/amd64/docker-ce_28.2.2-1~debian.12~bookworm_amd64.deb"
dpkg -i docker-ce-cli.deb docker-ce.deb
systemctl restart docker && systemctl restart dockermgr
发表评论