0%

树莓派备份到img

github(有详细注释):https://github.com/maplesugarr/raspberrypi-backup-to-img

我起先把所有的树莓派代码配置放到一个文件夹里,产生的数据放到另一个文件夹里。这样如果系统崩溃,可以直接拷贝这个文件夹到新系统就行了。但是每次还需要重新配置一遍,非常麻烦。如果把整个系统卡克隆,花费的时间就很长,镜像也很大,和sd卡大小是一样的。一直想要一个能克隆整个系统,同时产生文件只是真正的系统文件总大小的方法。

搜索到了一篇博客,非常好的满足了我的需求:http://conanwhf.github.io/2016/08/25/rpi-cloneimg/

  • dd命令备份,镜像大小就是sd卡大小。
  • tar备份,还要重新建立系统,再恢复。
  • parted, kpartx, dosfstools, rsync脚本备份,可以只备份用到的空间,备份的镜像还能拿到其他机器上使用。

原理

查看磁盘分区

1
2
3
4
root@raspi2:~# fdisk -l
Device Boot Start End Sectors Size Id Type
/dev/mmcblk0p1 8192 98045 89854 43.9M c W95 FAT32 (LBA)
/dev/mmcblk0p2 98304 122814463 122716160 58.5G 83 Linux

博客中把原理说的很明白

树莓派的官方系统是基于Debian的,主要是两个分区:启动分区boot和根分区。

boot分区为fat32格式,挂载在/boot,存放一些系统启动需要的基本文件,包括内核、驱动、firmware、启动脚本等;

根分区文件系统是ext4格式,挂载于/,存放一些安装的软件和库文件、系统配置、用户数据等等;

另外当系统启动时会自动生成和挂载一些必要的其他文件夹,包括temfs、sysfs、proc、debugfs、configfs等(使用mount可以看到他们),这些都是虚拟文件系统,由操作系统自动管理,备份时不需要关注。

日常使用时,修改的文件包括安装的软件都是在根分区中,而如果自行编译内核,需要更新的文件都在/boot中。

所以备份一个系统,实际上是要备份这两个分区,官方发布的烧录镜像,也是包含了这样的两个分区,并保证通过dd的操作,能将其完整写入目标TF卡。首次烧录完毕后,不论你的TF卡容量为多少,启动后的boot和/分区大小都是固定的,然后可以使用raspi-config来扩展根分区的大小,boot分区不变,来达到使用所有卡内容量的目的。

相对应的备份步骤,大致为:创建img,把img当作一个磁盘分区和格式化,mount各个分区,将文件备份至对应的分区中,umount分区结束备份。

克隆前调整swap

克隆到img的文件大小是根据当前系统两个分区大小生成的,如果有swap,一定要先把swap大小改成0,再运行脚本,否则img就会多了额外的swap的大小。

1
2
3
4
5
6
7
8
9
10
#排除掉swapfile,恢复的时候会通过/etc/dphys-swapfile自动计算
#树莓派通过/etc/dphys-swapfile设置swap
if [ -f /etc/dphys-swapfile ]; then
SWAPFILE=`cat /etc/dphys-swapfile | grep ^CONF_SWAPFILE | cut -f 2 -d=`
#没有找到指定的CONF_SWAPFILE,就是默认的/var/swap
if [ "$SWAPFILE" = "" ]; then
SWAPFILE=/var/swap
fi
EXCLUDE_SWAPFILE="--exclude $SWAPFILE"
fi

原代码拷贝分区文件的时候,排除掉了SWAPFILE。但在最开始计算系统大小时没有排除。

克隆后压缩img

如果采用dd命令备份,那么它会把空白的磁盘内容克隆到img文件里,这时候压缩效果非常明显。

这个脚本备份仍然会有很大的压缩空间,本人备份的img文件大概有1.4G,压缩后只有250M-430M。