飞牛 fnOS 升级后硬盘无法挂载的修复记录
一、故障现象
升级 fnOS 后:
- 硬盘仍能被系统识别;
- 删除并重新创建存储空间时提示“内部错误”;
- 数据卷无法挂载;
- 系统日志出现:
btrfs: Unknown parameter 'trimacl'
ext4: Unknown parameter 'trimacl'
mount failed
本次故障的原因是:
系统软件和 SATA 系统盘里的内核已经更新,但设备实际从 eMMC 启动。eMMC 中仍是旧内核,而新版飞牛服务要求内核支持 <span>trimacl</span>,最终导致数据卷挂载失败。
二、重要警告
执行前请注意:
- 不要在飞牛界面继续“删除”“重建”或“格式化”存储空间。
- 本操作只同步启动内核,不会主动格式化数据盘。
- 如果已经删除并重建过存储空间,原文件系统可能已经被格式化。
- 必须确保新内核与当前系统的软件包匹配。
- 建议准备显示器、键盘或串口,以便极端情况下恢复启动配置。
以下步骤以本次机器环境为例:
SSH 地址:192.168.8.99
SSH 端口:22
系统盘:/dev/sda
实际启动分区:/dev/mmcblk1p1
旧内核:6.12.41-trim
新内核:6.18.18.c944-trim
数据卷挂载位置:/vol1
三、连接机器
在本地电脑执行:
ssh -i /path/to/your/private-key -p 22 root@服务器地址
例如:
ssh -i /Users/用户名/keys/claw -p 22 root@192.168.8.99
四、检查当前运行内核
uname -r
uptime -s
cat /proc/cmdline
本次故障机器显示:
6.12.41-trim
同时 <span>/proc/cmdline</span> 中包含:
ubootpart=/dev/mmcblk1p1
这表示设备实际由 <span>/dev/mmcblk1p1</span> 上的 eMMC 启动。
五、确认数据盘并未丢失
lsblk -e7 -o NAME,PATH,TYPE,SIZE,FSTYPE,UUID,MOUNTPOINTS,RO,MODEL
blkid
继续检查 RAID、LVM 和 Btrfs:
mdadm --detail /dev/md0
pvs -a -o pv_name,pv_uuid,vg_name,pv_attr,pv_size,pv_free
vgs -a -o vg_name,vg_uuid,vg_attr,vg_size,vg_free
lvs -a -o lv_name,vg_name,lv_uuid,lv_attr,lv_size,devices
btrfs filesystem show
如果 RAID 状态显示:
State : clean
Failed Devices : 0
说明阵列本身正常。
查看挂载失败日志:
journalctl -b --no-pager |
grep -C 5 -E "trimacl|mount failed|/vol1|/dev/dm-0"
如果看到:
btrfs: Unknown parameter 'trimacl'
则可以继续检查内核版本问题。
六、确认新内核已经安装
查看 <span>/boot</span> 中的内核:
ls -lh /boot/vmlinuz*
ls -lh /boot/uInitrd*
ls -lh /boot/System.map-*
ls -lh /boot/config-*
查看已安装的内核软件包:
dpkg -l | grep -E "^ii[[:space:]]+(linux-image|linux-headers|linux-modules)"
本次使用的新内核为:
6.18.18.c944-trim
确认新内核包含 <span>trimacl</span>:
grep -i trimacl /boot/System.map-6.18.18.c944-trim
正常情况下应看到类似:
is_trimacl
trimacl_check_acl
ext4_xattr_trimacl_access_handler
btrfs_xattr_trimacl_access_handler
如果没有任何输出,不要继续复制这个内核。
七、检查系统盘的启动配置
sed -n '1,80p' /boot/fnEnv.txt
本次正确配置为:
verbosity=1
bootlogo=false
console=both
fdtfile=amlogic/meson-g12b-s922x-oes-plus.dtb
kernelfile=vmlinuz-6.18.18.c944-trim
rootdev=PARTUUID=0060e0e9-02
instdisk_bootuuid=0060e0e9-01
instdisk_rootuuid=0060e0e9-02
initrdfile=uInitrd-6.18.18.c944-trim
不要直接复制上述 PARTUUID 到你的机器。你的机器必须使用它自己 <span>/boot/fnEnv.txt</span> 中的值。
确认系统根分区 PARTUUID:
findmnt -n -o SOURCE /
blkid /dev/sda2
八、挂载实际的 eMMC 启动分区
创建临时挂载目录:
mkdir -p /mnt/emmcboot
先以只读方式挂载:
mountpoint -q /mnt/emmcboot ||
mount -o ro /dev/mmcblk1p1 /mnt/emmcboot
检查 eMMC 中的旧内核:
sed -n '1,80p' /mnt/emmcboot/fnEnv.txt
ls -lh /mnt/emmcboot/vmlinuz*
ls -lh /mnt/emmcboot/uInitrd*
本次故障时,eMMC 中仍指向:
kernelfile=vmlinuz-6.12.41-trim
而系统盘 <span>/boot/fnEnv.txt</span> 已经指向:
kernelfile=vmlinuz-6.18.18.c944-trim
由此可以确认两个启动分区未同步。
九、检查 eMMC 剩余空间
df -h /mnt/emmcboot
新内核、initrd、配置和设备树通常需要约 70~100MB。确保剩余空间充足后再继续。
十、备份 eMMC 原启动文件
将 eMMC 临时改为可写:
mount -o remount,rw /mnt/emmcboot
备份启动配置:
cp -a \
/mnt/emmcboot/fnEnv.txt \
/mnt/emmcboot/fnEnv.txt.pre-6.18.18-c944
备份当前设备树:
cp -a \
/mnt/emmcboot/dtb/amlogic/meson-g12b-s922x-oes-plus.dtb \
/mnt/emmcboot/dtb/amlogic/meson-g12b-s922x-oes-plus.dtb.pre-6.18.18-c944
旧内核文件不要删除,它可以用于回退。
十一、同步新内核到 eMMC
复制新内核:
cp -a \
/boot/vmlinuz-6.18.18.c944-trim \
/mnt/emmcboot/vmlinuz-6.18.18.c944-trim
复制 initrd:
cp -a \
/boot/uInitrd-6.18.18.c944-trim \
/mnt/emmcboot/uInitrd-6.18.18.c944-trim
复制内核配置和符号表:
cp -a \
/boot/System.map-6.18.18.c944-trim \
/mnt/emmcboot/System.map-6.18.18.c944-trim
cp -a \
/boot/config-6.18.18.c944-trim \
/mnt/emmcboot/config-6.18.18.c944-trim
复制对应设备树:
cp -a \
/boot/dtb/amlogic/meson-g12b-s922x-oes-plus.dtb \
/mnt/emmcboot/dtb/amlogic/meson-g12b-s922x-oes-plus.dtb
复制这台机器自身的新启动配置:
cp -a /boot/fnEnv.txt /mnt/emmcboot/fnEnv.txt
这里必须使用目标机器自己的 <span>/boot/fnEnv.txt</span>,不要使用其他机器的文件。
十二、校验复制结果
计算源文件校验值:
sha256sum \
/boot/vmlinuz-6.18.18.c944-trim \
/boot/uInitrd-6.18.18.c944-trim \
/boot/dtb/amlogic/meson-g12b-s922x-oes-plus.dtb
计算 eMMC 中的校验值:
sha256sum \
/mnt/emmcboot/vmlinuz-6.18.18.c944-trim \
/mnt/emmcboot/uInitrd-6.18.18.c944-trim \
/mnt/emmcboot/dtb/amlogic/meson-g12b-s922x-oes-plus.dtb
两边对应文件的 SHA-256 必须完全一致。
再次确认启动配置:
sed -n '1,80p' /mnt/emmcboot/fnEnv.txt
确认至少包含:
kernelfile=vmlinuz-6.18.18.c944-trim
initrdfile=uInitrd-6.18.18.c944-trim
写入磁盘并恢复只读挂载:
sync
mount -o remount,ro /mnt/emmcboot
十三、重启机器
sync
systemctl reboot
等待约 1~3 分钟后重新连接:
ssh -i /path/to/your/private-key -p 22 root@服务器地址
确认新内核:
uname -r
预期结果:
6.18.18.c944-trim
确认 <span>trimacl</span> 已生效:
grep -w is_trimacl /proc/kallsyms
应看到类似:
ffff8000804c6064 T is_trimacl
地址每台机器或每个内核可能不同,只要存在 <span>is_trimacl</span> 即可。
十四、验证数据卷挂载
lsblk -e7 -o NAME,TYPE,SIZE,FSTYPE,UUID,MOUNTPOINTS,RO
findmnt /vol1
df -hT /vol1
正常结果应包含:
/vol1
btrfs
rw
trimacl
查看完整挂载参数:
findmnt -rn -o SOURCE,TARGET,FSTYPE,OPTIONS |
grep -E "(/vol1|/dev/mapper/trim_)"
本次修复后显示:
/dev/mapper/trim_...-0 /vol1 btrfs rw,relatime,ssd,discard=async,trimacl,...
十五、验证飞牛相关服务
systemctl is-active \
trim_main.service \
filestor_service.service \
dsmgr.service \
docker.service \
docker.socket
正常应全部显示:
active
确认没有新的挂载错误:
journalctl -b --no-pager |
grep -E "Unknown parameter 'trimacl'|mount failed|/vol1"
新内核启动后不应再出现:
Unknown parameter 'trimacl'
十六、故障结论
本次故障链路为:
fnOS 更新
↓
SATA 系统盘 /boot 更新到新内核
↓
实际 eMMC 启动分区没有同步
↓
机器重启后仍运行旧内核
↓
新版飞牛服务使用 trimacl 挂载参数
↓
旧内核不支持 trimacl
↓
Btrfs/EXT4 挂载失败
↓
飞牛界面显示“内部错误”
修复方式是将系统盘 <span>/boot</span> 中的新内核、initrd、设备树和 <span>fnEnv.txt</span> 同步到实际使用的 eMMC 启动分区,再重启验证。
以上是全部内容,感谢观看,谢谢!