摘要

本文记录一次在线系统迁移过程:
在系统正常运行的前提下,将 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

操作:

  1. 移除旧 SD 卡
  2. 插入新 SD 卡
  3. 开机

九、验证迁移结果

启动后:

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 系统工程级迁移方法,而非简单复制卡片。

Leave a Reply

Your email address will not be published. Required fields are marked *