备份树莓派数据到镜像文件并挂载查看的全流程

最近买了一个树莓派4b换下了陪伴我7年的旧3b,由于新款用的是64位处理器,旧系统不能发挥全部性能,遂决定备份后重新刷系统。备份的目标是不仅全盘备份而且方便读取,经过仔细比对决定采用备份为img格式的方法,这种文件通过一些操作可以挂载为磁盘随时读取内容。

为了方便,以下均在装有Ubuntu的虚拟机中操作。树莓派系统的SD卡通过读卡器连接到电脑上。

首先查看SD卡的设备名

1
sudo fdisk -l

找到和SD卡相同大小的磁盘所对应的设备名,我这里是/dev/sdb

然后备份到img文件

1
sudo dd if=/dev/sdb of=rpi.img status=progress bs=16M

ifof一个是输入一个是输出,status=progress让程序实时报告已完成的量和速度等信息(我第一次没加,结果快复制完时手贱按了停止,全部木大),bs指定块大小(从源中读取到指定大小的内存内存再写入硬盘),默认的512字节过小,实测几M至十几M即可,过大则花费大量时间读取到内存得不偿失。

耐心等待复制完成之后,可以在当前目录看到rpi.img。如果半途提示空间不足,可参照这篇文章的指引扩展虚拟机磁盘容量。

然后查看备份的镜像文件信息,输出示例如下

1
2
3
4
5
6
7
8
9
10
11
~$ fdisk -l rpi.img
Disk rpi.img:28.91 GiB,31016878080 字节,60579840 个扇区
单元:扇区 / 1 * 512 = 512 字节
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x738a4d67

设备 启动 起点 末尾 扇区 大小 Id 类型
rpi.img1 8192 532479 524288 256M c W95 FAT32 (LBA)
rpi.img2 532480 60579839 60047360 28.6G 83 Linux

第一个是引导分区,第二个是主要的数据分区,要挂载的一般是后者。首先在/mnt目录创建一个文件夹,如/mnt/rpi,然后将镜像文件挂载到上面。

1
sudo mount -o loop,offset=272629760 rpi.img /mnt/rpi

-o后面的内容是以逗号分隔的选项列表。loop为显式指定以回环形式挂载img文件,省略一般没后果但是在旧系统上可能报错。offset后的数字为前文中单元的值(512)乘以rpi.img2起点的值(532480),应根据实际情况自行计算。举一反三,如果要查看引导分区的内容,offset后的值应改为512x8192=4194304。如果不设置offset,会报错“mount: /mnt/rpi: wrong fs type, bad option, bad superblock on /dev/loop10, missing codepage or helper program, or other error.”。本操作参考了这个问答

挂载后,就能在/mnt/rpi处访问树莓派SD卡中的文件了。不需要时,输入sudo umount /mnt/rpi卸载镜像。