使用tar备份和恢复树莓派系统

树莓派5使用nvme存储启动 设置使用之后,系统的存储性能有了很大提高。但是,我在 树莓派Raspberry Pi 5 上使用 Intel Optane(傲腾) M10 遇到一个棘手的问题: 启动时不能稳定识别Optane(傲腾) M10。参考树莓派论坛的帖子,提到了需要回退到使用SD卡启动,仅将Optane作为数据存储。 我推测原因是:

  • Optane初始化需要在内核就绪之前进行,当使用 NVMe存储 存储启动时,启动速度极快,此时Optane初始化尚未完成,就导致内核没有扫描到设备。

  • 当使用SD卡启动时,由于内核加载启动较慢,此时Optane设备已经完成初始化,就能够被内核识别和使用

  • 之所以 树莓派5使用nvme存储启动 有时候能够识别和使用Optane存储是因为这个初始化时间临界点就在NVMe启动内核左右,当有启动时间波动时,有可能成功识别也可能识别失败

备注

经过验证对比,上述推测并不正确,即使改换为使用SD启动,依然不能解决 Intel Optane(傲腾) M10 识别。我最终解决的方法是采用 树莓派5超频

不过,通过tar备份和恢复树莓派依然是有效的方案,不仅克服了 使用 dd clone树莓派 效率较低的问题( dd 会复制整个磁盘每一bit),而且适合不同存储容量之间复制树莓派系统。

tar 备份树莓派

  • 树莓派操作系统 Raspbery Pi OS(Raspbian) 默认安装使用了2个分区,磁盘分区依然参照之前 Raspbery Pi OS(Raspbian) 安装时分区(但是我会调整整个分区大小限制到 32GB 以空出更多容量用于 ZFS 卷的数据存储),即:

树莓派5使用nvme存储启动 上分区,其中分区1,2是操作系统,也就是复制的源
Disk /dev/nvme0n1: 1.82 TiB, 2000398934016 bytes, 3907029168 sectors
Disk model: KIOXIA-EXCERIA G2 SSD
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x57a11afa

Device         Boot      Start        End    Sectors   Size Id Type
/dev/nvme0n1p1            8192    1056767    1048576   512M  c W95 FAT32 (LBA)
/dev/nvme0n1p2         1056768  124735487  123678720    59G 83 Linux
/dev/nvme0n1p3       124735488 2272219135 2147483648     1T 83 Linux
/dev/nvme0n1p4      2272219136 3907029167 1634810032 779.5G 83 Linux
当前 Raspbery Pi OS(Raspbian) 磁盘分区的挂载
Filesystem      Size  Used Avail Use% Mounted on
udev            3.8G     0  3.8G   0% /dev
tmpfs           806M  5.4M  800M   1% /run
/dev/nvme0n1p2   59G   24G   32G  43% /
tmpfs           4.0G     0  4.0G   0% /dev/shm
tmpfs           5.0M   48K  5.0M   1% /run/lock
/dev/nvme0n1p1  510M   65M  446M  13% /boot/firmware
zpool-data      751G  7.5M  751G   1% /var/lib/docker
tmpfs           806M     0  806M   0% /run/user/1000

需要备份的是 //boot/firmware/var/lib/docker 是一个 ZFS 挂载卷,不需要备份(当 Docker 再次启动时会自动初始化,所以只需要确保目标主机上在启动docker之前先构建好 zpool-data 卷)

  • 将TF卡插入USB读卡器然后插入到需要复制的树莓派运行系统中,使用以下命令构建 /dev/sdb 分区(即TF卡)

划分TF卡分区,分区限制到32GB
Disk /dev/sdb: 119.08 GiB, 127865454592 bytes, 249737216 sectors
Disk model: MassStorageClass
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x57a11afa

Device     Boot    Start       End   Sectors  Size Id Type
/dev/sdb1           8192   1056767   1048576  512M  c W95 FAT32 (LBA)
/dev/sdb2        1056768  68165631  67108864   32G 83 Linux
/dev/sdb3       68165632 249737215 181571584 86.6G 83 Linux
  • 对分区进行格式化,注意第一个分区必须是 FAT32

对SD卡分区进行格式化
mkfs.vfat -F 32 -n EFI /dev/sdb1
mkfs.ext4 /dev/sdb2
# 分区3将使用zfs工具处理
使用 tar 命令备份系统
cd /
tar -cpzf firmware.tar.gz /boot/firmware
tar -cpzf backup.tar.gz --exclude=/backup.tar.gz \
  --exclude=/var/lib/docker \
  --exclude=/var/cache --exclude=/home/admin/.cache \
  --one-file-system /
  • 挂载TF卡分区:

对TF卡分区挂载
mount /dev/sdb2 /mnt
mkdir -p /mnt/boot/firmware
mount /dev/sdb1 /mnt/boot/firmware
  • 将归档的操作系统tar文件复制到TF卡挂载分区中,并解压缩

恢复系统
cp /backup.tar.gz /mnt/
cp /firmware.tar.gz /mnt/
cd /mnt/
tar xfz backup.tar.gz
tar xfz firmware.tar.gz
  • 修订一些配置( 边缘云计算架构(2024) ):

    • /mnt/boot/firmware/cmdline.txt 该文件参数 root=PARTUUID= 决定了启动时挂载的root分区

    • /mnt/etc/hosts

    • /mnt/etc/hostname

    • /mnt/etc/fstab 根据 blkid 输出的磁盘分区 PARTUUID 修订

    • /mnt/etc/NetworkManager/system-connections/eth0.nmconnection

    • /mnt/NetworkManager/system-connections/<wifi_ssid>.nmconnection

  • 现在将恢复好的系统TF卡拿到目标树莓派上,启动新的树莓派,然后验证是否一切正常

  • 构建 树莓派5 NVMe存储ZFS (用于恢复 Docker ZFS 存储驱动 ) - 这个步骤是我的特定运行环境需要,如果你没有使用 ZFS 可以忽略

在新系统上构建ZFS用于恢复 Docker ZFS 存储驱动
# 清理docker目录
rm -rf /var/lib/docker
mkdir /var/lib/docker

# 创建docker的zfs存储目录卷
zpool create -f zpool-data -m /var/lib/docker /dev/mmcblk0p3
zfs set compression=lz4 zpool-data