追梦学习库

飞牛 NAS Docker 无法启动 —— 故障排查全过程记录

追梦君 69 阅读
文章摘要

文档版本: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 页面异常。

最终结论

  1. docker-ce / docker-ce-cli 两个包被卸载,导致 /usr/bin/dockerd/usr/bin/docker 二进制文件丢失,Docker 引擎无法启动(status=203/EXEC)。
  2. 系统 apt 源的 GPG 公钥被破坏(keyring.gpg 0 字节、debian-archive-bookworm-stable.asc 被截断为 461 字节),导致 apt-get install 无法重装 Docker。
  3. 最终通过直接下载 .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-cedocker-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-cedocker-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 到信任目录。

建议处理方案(按优先级):

  1. 给 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
  2. 从 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
  3. 使用飞牛网页端「系统修复」一键重置。

注:此问题不影响 Docker 及容器运行,仅影响 apt 安装软件。


六、安全排查结果

  • crontab -l:干净,仅系统自带 logrotate 任务
  • /etc/cron.d/:正常(e2scrub_all、sysstat)
  • /etc/init.d/:全部为正常系统服务
  • sources.list.malicious.bak.*:内容与当前源一致(均为干净中科大源),未发现恶意地址

判定:未发现后门或恶意脚本残留,事件更接近 Trim Security 误报/误操作。


七、经验与建议

  1. AI agent 权限隔离:带 shell 执行权的 AI(Hermes 等)不要以 root 直跑宿主,应使用非 root 用户 + 最小权限,或放入受限容器/沙箱。
  2. Docker 数据备份:本次数据未丢失,是因为 data-root/vol2/docker 且卸载包不删数据目录,但仍建议定期备份 /vol2/docker
  3. apt 源可恢复性:遇到 GPG 验证失败,dpkg --force-confnew 和复制 keyring 均可能无效,最快方案是直接下载 .deb 直装。
  4. 版本号是关键线索:残留的 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
分享到:

发表评论

请先 登录 再评论