树莓派镜像打包

众所周知,树莓派是用来折腾的,但是因为系统跑在SD上以及折腾时手残总是无法避免,这就导致系统很容易崩了,系统蹦了如果从头烧镜像,装环境那简直是生不如死,所以这就体现了备份镜像的必要性。

备份镜像最傻瓜的方式就是在Windows平台下使用[Win32 Disk Image]的Read功能直接把SD卡中的镜像读取到文件中,但是直接读取的文件是与SD卡大小一致的,这就导致不管是备份存储还是重新写入都会有很多麻烦,为了解决这个麻烦就需要调整SD卡的分区大小然后再读出备份。而调整分区的操作在Windows下又会遇到一些问题。而且Linux下有十分便利的脚本可以实现镜像压缩,所以推荐的方式是在Linux平台下操作,比如ubuntu。

具体操作:

先将SD连接到Linux主机,并查看设备名以及分区信息。

xingyong@xingyong-dell-7050:~$ sudo fdisk -l

Disk /dev/sda: 931.5 GiB, 1000204886016 bytes, 1953525168 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes


Disk /dev/nvme0n1: 238.5 GiB, 256060514304 bytes, 500118192 sectors
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: 0x6a4965ff

Device         Boot Start       End   Sectors   Size Id Type
/dev/nvme0n1p1 *     2048 500117503 500115456 238.5G 83 Linux


Disk /dev/sdb: 59.5 GiB, 63864569856 bytes, 124735488 sectors
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: 0xe4b7df54

Device     Boot  Start       End   Sectors  Size Id Type
/dev/sdb1         8192    532479    524288  256M  c W95 FAT32 (LBA)
/dev/sdb2       532480 124735487 124203008 59.2G 83 Linux

此时可以看到SD卡的设备名称,我的是sdb,有两个分区,然后使用dd指令将SD中的镜像拷贝到Linux主机内,注意,此时拷贝的依旧是完整的镜像,大小与SD卡大小一致,这就需要你的主机得有比SD卡容量大的空闲空间,如果不够,就需要先调整SD卡分区大小再操作!

xingyong@xingyong-dell-7050:~$ sudo dd if=/dev/sdb of=./raspberrypi.img bs=512
124735488+0 records in
124735488+0 records out
63864569856 bytes (64 GB, 59 GiB) copied, 779.038 s, 82.0 MB/s

经过上面的操作,我们就将镜像从SD卡打包到img文件中了,但是此时的文件大小还是很大,需要压缩一下,这里推荐一个超级好用的脚本[GitHub链接],关于脚本的详细信息大家可以去仓库查看,这里就不展开了。

xingyong@xingyong-dell-7050:~$ sudo pishrink.sh raspberrypi.img 
pishrink.sh v0.1.2
pishrink.sh: Gathering data ...
Creating new /etc/rc.local
pishrink.sh: Checking filesystem ...
rootfs: 120206/3784416 files (0.4% non-contiguous), 1326501/15525376 blocks
resize2fs 1.44.1 (24-Mar-2018)
pishrink.sh: Shrinking filesystem ...
resize2fs 1.44.1 (24-Mar-2018)
Resizing the filesystem on /dev/loop0 to 1660441 (4k) blocks.
Begin pass 2 (max = 14804)
Relocating blocks             XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Begin pass 3 (max = 474)
Scanning inode table          XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
The filesystem on /dev/loop0 is now 1660441 (4k) blocks long.

pishrink.sh: Shrinking image ...
pishrink.sh: Shrunk imgname.img from 60G to 6.6G ...

可以看到执行完脚本之后镜像从60G变为了6.6G,这样你就可以愉快的使用这个打包并压缩的镜像了。

如果要在Linux下烧录镜像依旧可以使用dd指令,只需要调换上面if/of的内容就好。

xingyong@xingyong-dell-7050:~$ sudo dd if=./raspberrypi.img of=/dev/sdb bs=512
13816009+0 records in
13816009+0 records out
7073796608 bytes (7.1 GB, 6.6 GiB) copied, 873.813 s, 8.1 MB/s


把做好镜像的TF卡插回树莓派上启动,进入系统后使用raspi-config对文件系统扩展使用全部TF卡空间就可以愉快的使用了。

如果不知道如何扩展可以查看树莓派手册Expand Filesystem章节