制作树莓派 (Raspberry Pi) 系统备份

  1. 查看树莓派空间使用情况及分区信息来建立 IMG 文件
1
2
df -h
sudo fdisk -l
  1. 安装必要软件
1
sudo apt-get install dosfstools dump parted kpartx
  1. 建立空白 IMG 文件并分区
1
2
3
4
dd if=/dev/zero of=raspberrypi.img bs=1MB count=3072
parted -s raspberrypi.img -- mklabel msdos
parted -s raspberrypi.img -- mkpart primary fat32 8192s 212991s
parted -s raspberrypi.img -- mkpart primary ext4 212992s -1
  1. 挂载镜像到 loop 设备
1
sudo losetup --show -f raspberrypi.img

命令会返回链接后的设备路径,本例中为/dev/loop0

  1. 映射分区
1
sudo kpartx -va /dev/loop0

kpartx 运行成功将打印映射后的信息,在 /dev/mapper 目录下可以找到两个分区

  1. 格式化分区
1
2
sudo mkfs.vfat /dev/mapper/loop0p1
sudo mkfs.ext4 /dev/mapper/loop0p2
  1. 插入待备份的 SD 卡

重要:卸载桌面的自动挂载盘符,否则 dump 数据时会出错

手动挂载磁盘

1
2
3
4
sudo mkdir /mnt/usb1
sudo mkdir /mnt/usb2
sudo mount -t vfat /dev/sdc1 /mnt/usb1
sudo mount -t ext4 /dev/sdc2 /mnt/usb2
  1. 备份数据

创建一个用来挂载 img 镜像中分区的目录

1
sudo mkdir /mnt/image

挂载 img 中的 fat 分区

1
sudo mount -t vfat /dev/mapper/loop0p1 /mnt/image

用 cp 命令拷贝 SD 卡的 fat 分区数据到镜像的 fat 分区:

1
sudo cp -rf /mnt/usb1/* /mnt/image

拷贝完成,卸载 img 的 fat 分区

1
sudo umount /mnt/image

挂载 img 的 ext4 分区

1
sudo mount -t ext4 /dev/mapper/loop0p2 /mnt/image

切换到 /mnt/image 目录,ext4 文件系统需要使用 dump 和 restore 来完整拷贝数据

1
2
3
4
cd /mnt/image
sudo rm -rf lost+found
sudo dump -0uaf - /mnt/usb2 | sudo restore -rf -
sudo rm restoresymtable

dump 的参数

  • 0: 完全备份;
  • u: 当成功备份后信息写入/var/lib/dumpdates
  • a: 自动大小
  • f: 指定备份设备,后跟 - 表明写到标准输入
  1. 修改 PARTUUID

查看 mapper 设备的 PARTUUID (/dev/mapper/loop0p1 & /dev/mapper/loop0p2)

1
sudo blkid

修改/mnt/image/etc/fstab 中对应分区的 PARTUUID

再次挂载 boot 分区到/mnt/image

1
2
sudo umount /mnt/image
sudo mount -t vfat /dev/mapper/loop0p1 /mnt/image

修改/mnt/image/cmdline.txt 中 root 的 PARTUUID

  1. 清理

镜像备份制作完成,需要卸载镜像

1
2
3
4
5
cd
sudo umount /mnt/image
sudo umount /mnt/usb1
sudo umount /mnt/usb2
sudo kpartx -d /dev/loop0

现在 raspberrypi.img 中已包含了完整的系统备份,可使用 Win32 Disk Imager 等工具烧录到 TF 卡中。首次成功启动后,执行 sudo raspi-config,选择 Advanced Options -> Expand Filesystem 扩展 TF 卡可用空间。

0%