摘要
本文记录一次在线系统迁移过程:
在系统正常运行的前提下,将 Raspberry Pi 上的 Ubuntu 24.04 LTS 系统从一张 8GB SD 卡迁移到一张 16GB SD 卡,并实现根分区自动扩容。
本流程不使用 dd,采用 rsync 进行文件系统级复制,并通过 UUID 启动方式避免盘符混乱问题。
该方法适用于:
- Ubuntu for Raspberry Pi
- Raspberry Pi OS
- 任何使用 ext4 的树莓派系统
迁移目标
- 不重装系统
- 保留所有用户数据与服务
- 从 8GB 扩容至 16GB
- 使用 UUID 启动
- 确保启动稳定性
当前环境示例
运行系统盘:
/dev/mmcblk0
├─mmcblk0p1 vfat /boot/firmware
└─mmcblk0p2 ext4 /
目标盘(通过 USB 读卡器接入):
/dev/sda
一、重新分区目标 SD 卡
目标卡必须为:
- p1:FAT32,约 512MB(启动分区)
- p2:ext4,占用剩余全部空间(根分区)
执行:
sudo parted /dev/sda
输入:
mklabel msdos
mkpart primary fat32 1MiB 513MiB
mkpart primary ext4 513MiB 100%
set 1 boot on
quit
二、创建文件系统
sudo mkfs.vfat -F32 /dev/sda1
sudo mkfs.ext4 /dev/sda2
三、挂载新系统
sudo mkdir -p /mnt/newroot
sudo mount /dev/sda2 /mnt/newroot
sudo mkdir -p /mnt/newroot/boot/firmware
sudo mount /dev/sda1 /mnt/newroot/boot/firmware
四、复制整个系统(文件系统级迁移)
使用 rsync 而非 dd。
原因:
- dd 为块级复制,无法跨容量迁移
- rsync 复制文件系统语义层
- 更安全
- 可排除伪文件系统
执行两次:
sudo rsync -aAXHv \
--exclude={"/dev/*","/proc/*","/sys/*","/tmp/*","/run/*","/mnt/*","/media/*","/lost+found"} \
/ /mnt/newroot
第二次执行用于补同步。
五、获取新卡 UUID
sudo blkid /dev/sda1 /dev/sda2
示例:
/dev/sda1 UUID="XXXX-XXXX" TYPE="vfat"
/dev/sda2 UUID="xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" TYPE="ext4"
六、修改新系统 fstab
编辑:
/mnt/newroot/etc/fstab
内容示例:
UUID=新ext4UUID / ext4 defaults 0 1
UUID=新vfatUUID /boot/firmware vfat defaults 0 1
不再使用 LABEL。
七、修改启动参数
编辑:
/mnt/newroot/boot/firmware/cmdline.txt
将:
root=UUID=旧UUID
改为:
root=UUID=新ext4UUID
注意:
- 必须保持单行
- 不允许换行
示例:
console=serial0,115200 console=tty1 root=UUID=新ext4UUID rootfstype=ext4 rootwait fixrtc
八、切换存储卡
sync
sudo poweroff
操作:
- 移除旧 SD 卡
- 插入新 SD 卡
- 开机
九、验证迁移结果
启动后:
lsblk -o NAME,SIZE,FSTYPE,MOUNTPOINT
应显示:
mmcblk0
├─mmcblk0p1 512M vfat /boot/firmware
└─mmcblk0p2 ~14G ext4 /
确认根分区已扩容。
再执行:
df -h
验证可用空间已增加。
十、建议收尾操作
强制一次完整检查:
sudo fsck.ext4 -f /dev/mmcblk0p2
或:
sudo touch /forcefsck
重启后自动检查。
技术原理解析
为什么使用 rsync 而不是 dd?
- dd 是块级复制
- rsync 是文件系统级复制
- 可跨容量迁移
- 可排除伪文件系统
为什么使用 UUID 启动?
- 避免多盘环境挂错分区
- 不依赖设备顺序
- 更稳定
为什么执行两次 rsync?
系统在运行时可能产生新写入数据。
第二次执行用于补同步。
总结
该方法实现:
- 在线迁移
- 无需重装
- 自动扩容
- UUID 稳定启动
- 文件系统级复制
适用于:
- 容量升级
- 更换新 SD 卡
- 预防性维护
- 灾难恢复
这是一种标准的 Linux 系统工程级迁移方法,而非简单复制卡片。