核心逻辑
通过物理克隆(dd)将旧分区的每一个字节搬运到新分区,通过修改 UUID 解决识别冲突,最后通过修改引导参数(PARTUUID)强制内核切换启动设备。
第一阶段:准备新硬盘分区
在操作前,需确保 NVMe 硬盘上的重要数据已备份。
-
进入分区工具:
sudo fdisk /dev/nvme0n1 -
删除旧分区(如有): 输入
d。 -
新建分区:
- 输入
n(新建) ->p(主分区) ->1(分区号)。 - First sector: 直接回车(默认 2048)。
-
Last sector: 输入
+64G(或其他你想要的大小)。
- 输入
-
清除特征码: 如果提示
Contains a zfs_member signature,输入y确认清除。 -
保存: 输入
w写入分区表并退出。 -
强制内核刷新分区:
sudo partprobe /dev/nvme0n1
第二阶段:全量克隆系统 (Rootfs)
使用 dd 命令进行位对位克隆。
# if 为源(SD/eMMC), of 为目标(NVMe)
sudo dd if=/dev/mmcblk0p2 of=/dev/nvme0n1p1 bs=1M conv=noerror,sync status=progress
注意:克隆完成后,两个分区的 UUID 将完全一致,此时切勿重启。
第三阶段:解决 UUID 冲突与文件系统优化
为了让系统区分开新旧两个“双胞胎”分区,必须修改新分区的身份 ID。
-
生成并修改新 UUID:
NEW_UUID=$(uuidgen) sudo btrfstune -U $NEW_UUID /dev/nvme0n1p1 -
修正新系统内的挂载表 (fstab):
将sudo mount /dev/nvme0n1p1 /mnt sudo nano /mnt/etc/fstab/挂载点那一行的UUID=修改为刚才生成的新 UUID。 -
扩容文件系统:
由于dd只是克隆了原分区大小,需手动填满 64G 空间:sudo btrfs filesystem resize max /mnt sudo umount /mnt
第四阶段:注入 NVMe 驱动(可忽略,一般都有驱动)
这是最容易被忽略的一步。如果内核启动镜像(initramfs)里没有 NVMe 驱动,系统将无法识别硬盘。
-
添加驱动模块:
在末尾添加:sudo nano /etc/initramfs-tools/modulesnvme pcie-rockchip -
更新启动镜像:
sudo update-initramfs -u
第五阶段:修改引导参数 (最关键)
由于 FN-OS 的引导程序比较“固执”,我们需要通过 PARTUUID 强制覆盖启动路径。
-
查看 NVMe 的 PARTUUID:
blkid /dev/nvme0n1p1 # 记下 PARTUUID="f972c3cb-..." -
修改引导配置文件:
sudo nano /boot/fnEnv.txt -
设置强制启动参数:
在extraargs中加入rootwait和root=PARTUUID=...,确保它位于参数链末尾以获得最高优先级。extraargs=cma=256M rootwait root=PARTUUID=你的新PARTUUID rootdev=UUID=你的新UUID
第六阶段:重启与验证
执行 sudo reboot。
验证命令:
lsblk
如果根目录 / 对应的设备是 nvme0n1p1,迁移大功告成!
进阶小贴士
-
旧分区处理: 建议稳定运行几天后再格式化旧的
mmcblk0p2,将其作为数据盘或备用系统。 - 性能提升: NVMe 的随机读写性能(IOPS)远超 SD 卡,你会发现系统更新、数据库运行和网页打开速度有质的飞跃。