飞牛OS(fnOS) 内核更新失败排查记录

飞牛OS(fnOS) 内核更新失败排查记录

__

日期: 2026-08-30 设备: OrangePi 5 Plus (RK3588, ARM64) 系统版本: fnOS 1.2.0503 问题内核: linux-image-6.18.18.c994-trim(更新后一直提示更新,重启也不生效)


问题现象

系统更新提示有 6.18.18.c994-trim 内核包待更新,执行更新、重启后,更新提示依然存在,反复出现。

根本原因

飞牛OS在 RK3588 这类走 U-Boot(而非GRUB)引导的机型上,OTA更新脚本存在结构性薄弱环节:

  1. 新内核文件(vmlinuz-*config-*System.map-*)会被正常下载到 /boot

  2. 但对应的 initrd.img-*uInitrd-*(U-Boot启动所需的initramfs)可能没有被正确生成

  3. U-Boot 实际读取的是 /boot/Image/boot/uInitrd 这两个固定名字的符号链接(不是像GRUB那样动态读取配置选择内核版本),OTA脚本需要显式把这两个链接重新指向新内核——这一步容易失败或被跳过

  4. 以上任一环节出问题,系统重启后仍从旧内核启动,uname -a 版本不变,更新程序检测不到变化,于是持续提示"有更新"

这不是偶发个例,而是该机型OTA机制的已知薄弱点,此前也因为 /usr/sbin 不在 PATH 里导致 update-initramfs 底层工具调不到而出现过同类问题。

排查与修复步骤

1. 确认当前实际运行的内核

uname -a

版本号如果不是目标版本,说明切换确实没成功。

2. 检查 /boot 目录,确认新内核相关文件是否齐全

ls -la /boot/ | grep -E "<目标内核版本号>|Image|uInitrd|vmlinuz"

重点检查:

  • 新内核的 vmlinuz-<版本> 是否存在

  • 对应的 initrd.img-<版本>uInitrd-<版本> 是否存在(最常见的缺失点

3. 检查 U-Boot 实际读取的符号链接

ls -la /boot/Image /boot/uInitrd

看这两个链接当前指向的是不是旧内核版本。

4. 如缺少 initramfs,手动生成

export PATH=$PATH:/usr/sbin
sudo update-initramfs -c -k <目标内核版本号>

生成成功后会自动完成U-Boot格式封装(uInitrd),并可能自动切换 uInitrd 符号链接(但 Image 链接不一定会自动切)。

5. 检查并手动切换 /boot/Image 符号链接(如未自动切换)

ls -la /boot/Image

若仍指向旧内核,手动切换:

cd /boot
sudo ln -sf vmlinuz-<目标内核版本号> Image
ls -la /boot/Image /boot/uInitrd   # 确认两个链接都已指向新版本

6. 重启并验证

sudo reboot

重启后:

uname -a

确认版本号已变为目标内核版本,并去系统更新页面确认提示已消失。

后续建议

  • 旧内核文件(如本次的 c821-trim)不必立即删除,留作应急回退,待新内核稳定运行几天后再清理

  • 每次系统更新后,养成先用 uname -a 核对内核版本的习惯,而不只是看更新页面是否还提示——如果版本没变,第一时间按上述流程排查,几分钟即可解决,避免问题累积

OpenMAIC 本地化部署记录 2026-07-10

评论区