附件:fnos_update_logs.zip
# fnOS 系统更新失败 Bug 反馈(按社区规范格式)
一、发帖时必须提供的基础信息
系统版本
- 设备架构: X86_64
- 系统版本: fnOS 1.2.0302(更新目标版本 1.2.0401,内核 6.18.18.c952-trim)
设备环境
- 物理机 / 虚拟机: 虚拟机(virtio 磁盘驱动)
- 网络: 局域网(IP 192.168.31.4,网关 192.168.31.1,DNS 192.168.31.1)
- 访问方式: 局域网网页端 http://192.168.31.4:5666
- 浏览器: Edge / Chrome 最新版
- 客户端: 仅网页端操作
BUG 现象
通过局域网网页端登录 fnOS,进入"系统设置 - 系统更新",点击"立即更新"后出现以下现象:
- 更新进度卡在"下载"阶段较长时间后,提示"更新失败",且反复重试多次均失败;
- 失败后系统自动回滚,但回滚不彻底:内核镜像已安装(linux-image-6.18.18.c952-trim),
而配套的 linux-modules-trim-、linux-headers-、trim 包未安装;
- 重启后系统以新内核运行,但 ZFS 等内核模块缺失,系统日志持续报错:
- "The ZFS modules cannot be auto-loaded."
- trim 守护进程每 5 秒执行 zpool status 均返回 WEXITSTATUS=1;
- 在系统重启后再次点击"立即更新",若下载文件完整则一次成功(本次成功时 trim 包 342M 完整下载),
说明问题与下载文件的完整性强相关。
附:完整根因分析与证据见本文件"二、详细分析",关键日志已按要求打包(见"四、日志文件")。
出现频率
- 大版本更新(含 319M 的 trim 包、96M 的 linux-image 包)时:必现(多次重试均失败)
- 小版本/小文件更新:偶现
- 重启后重试:可能成功(取决于 CDN 节点与下载完整性)
联系方式
- 飞牛私有云 fnOS27 微信群昵称:Lonely Rye
二、详细分析
根因 1:liveupdate 下载 .deb 包后不做完整性校验(主因)
- liveupdate 从 download.liveupdate.fnnas.com 下载 .deb 到 /var/tmp/trim-update/ 后,
不校验文件大小、不校验 SHA256、不校验 .deb 文件头,直接交给 dpkg -i 安装;
- 大文件(319M trim 包、96M linux-image)下载不完整(实测曾出现仅下载 89M),
dpkg 解压报错: "lzma decompression error: unexpected end of file or stream",随后整体回滚;
- liveupdate status 返回的 JSON 中每个包都带 sign(SHA256)字段,但客户端未在安装前使用。
根因 2:更新失败回滚不彻底,产生"半更新"状态
- 2026-08-09 02:07 更新尝试:linux-image-6.18.18.c952-trim 安装成功,
后续包(trim 1.2.0401 等)未安装即中断回滚;
- 重启后系统直接运行新内核 6.18.18.c952-trim,但配套模块缺失,ZFS 无法加载;
- dpkg 日志(/var/log/dpkg.log)证实:02:07:22 install linux-image... -> 02:07:57 status installed,
之后无任何其他包的安装记录。
根因 3:updatemgr 服务持续崩溃循环
- /var/log/updatemgr/error.log 显示自 2026-08-05 起持续报错:
"socket /var/run/trim_app_cgi/updatemgr is running"(每 5 秒一次);
- info.log 显示 updatemgr 内部 queryTransportRet**oop 每 5 秒 panic 一次,持续多日;
- 该崩溃循环与 2026-08-09 更新失败时间段(02:07-02:11)完全重叠;
- 系统重启后恢复(info.log 出现 "lazy apply success")。
复现与对比验证
- 2026-08-09 02:28 重启后再次点击"立即更新",全程监控下载缓存:
fnos_Mainland-PE_x86_1.2.0401_2328.deb 完整下载 342M,随后 trim 1.2.0401、
linux-modules-trim-extra、linux-image-amd64、linux-headers x2、linux-libc-dev 全部安装成功;
- 同一台机器、同一网络,只要下载完整即可一次成功,进一步证明问题在下载完整性。
三、建议修复方向
- liveupdate 下载完成后校验文件大小与 SHA256(sign 字段),不匹配则删除重试(建议至少 3 次);
- 检查下载响应 Content-Length 与实际接收字节数一致性,支持断点续传;
- 改进回滚机制:内核镜像等不可回滚的包应最后安装,或安装前备份 bootloader,避免"半更新"状态;
- updatemgr 启动时检测 stale socket:确认旧进程不存在则清理 socket 文件后重新监听。
四、日志文件
以下日志文件已按社区要求整理并打包(附件 fnos_update_logs.zip,包内附 README.txt 说明):
| 文件 |
来源 |
说明 |
| updatemgr_error.log |
/var/log/updatemgr/error.log(摘录) |
updatemgr 崩溃循环(socket is running,08-05 ~ 08-09 共 61727 次,每 5 秒一次) |
| updatemgr_info.log |
/var/log/updatemgr/info.log(摘录) |
updatemgr 运行日志(6272 次 panic,含完整堆栈:trim-cgi-sdk.Listen(),重启后恢复) |
| dpkg.log |
/var/log/dpkg.log |
更新安装记录(02:07 仅 linux-image c952 部分安装;02:28 全部包成功) |
| journalctl_trim_update.txt |
journalctl -t trim-update |
重启后 journal 已轮转(-- No entries --),证明日志随重启丢失 |
| journalctl_trim_update_captured_excerpt.txt |
故障现场抓取(7/17 与 08-09) |
trim-update 更新/失败现场日志(updating / failed to install / WEXITSTATUS) |
| liveupdate_status.json |
/usr/trim/bin/liveupdate status |
更新包元数据(url/size/sign);反馈时已无待更新包 |
| syslog_zpool_errors.txt |
/var/log/syslog(摘录) |
ZFS 模块无法自动加载、zpool status 轮询 WEXITSTATUS=1 |
说明:
- updatemgr 原始日志较大(error.log 6.2M、info.log 11.5M、syslog 35M),本次提供关键摘录;如需完整原始文件可另行提供;
- 系统诊断日志请按社区要求,在"日志应用 - 更多 - 系统诊断日志"导出后随帖上传;
- 如附件超过论坛大小限制,可通过网盘/飞牛外链分享提供。