树莓派是一个很轻量级、低功耗的微型服务器,我在上面搭建了不少服务自用,日积月累的使用上面的数据和配置都需要备份,而且树莓派使用的是MicroSD卡启动和存储,sd卡的稳定性也让我担忧,NAND flash的颗粒除了有擦写次数寿命外,还会有各种意外情况,即便是买到昂贵的mlc颗粒flash也不能保证绝对的安全。所以及时备份系统,数据和配置都很重要。在网上搜索了大量的相关文章后,也尝试和折腾了几天,因此做一个总结和备忘。
1. DD 命令全盘镜像
网上最多的就是这种方法,在linux下使用dd命令备份整个sd卡,这个命令很底层,将sd设备的每一个扇区的数据都备份到了镜像文件,因此原来sd卡上的mbr,分区表,所有分区的数据都原封不动的备份了下来,恢复的时候也会和原设备完全一致。
这种备份方式很强大,缺点在于sd卡容量有多大,生成的镜像体积就有多大。例如一个16g的sd卡,使用了4g,空闲8g,但备份出来后是一个完全一致的16g的镜像文件,空间浪费很大,而且烧写恢复的时候目标设备容量不能小于镜像体积。就这一点不够优雅,查了很多资料后,对这种方式进行了改进,能够裁剪镜像文件的体积。
首先,dd备份整个sd卡,得到一个完整镜像,然后使用losetup挂接此镜像为虚拟磁盘设备,然后使用gparted命令打开此设备,修改和调整设备的分区,挪动文件系统上的数据,使得有效数据靠前,未使用的空白区域全部挪动到设备后面的扇区上,最后使用truncate命令将镜像文件后面的无效数据裁剪掉,就得到一个紧凑的,包含全部有效数据的镜像文件了。恢复到新的sd卡上的时候,先烧写,然后也用gparted打开新sd卡设备,重新调整分区就行了。
这个方法亲测可用,本文只提供思路,具体的细节过程就不多赘述,上面已经贴出了相关命令,其核心就在于挪动和裁减掉sd卡上的空白未使用区域,得到紧凑高效的镜像文件。但需要提醒的是操作风险极高,需要对分区表非常熟悉和了解,什么是主分区、扩展分区,树莓派的所有分区都要了解,否则操作不慎就破坏了分区表。
2. 只备份文件系统
通过对树莓派的引导方式研究,树莓派上电引导的时候第一步是关掉arm从gpu启动,gpu引导启动后已经能够识别文件系统,它寻找sd卡第一分区的bootcode.bin文件,然后根据配置再进入安装模式、恢复模式和正常引导模式。
由此可以看出,树莓派sd卡mbr上并未包含boot trap二进制引导代码,备份的时候可以完全从文件系统的层面备份。例如,对新的sd卡进行和原sd卡一样的分区方式,然后通过rsync/cp/tar等方式逐一备份各个分区上的文件就行了。或者新的sd卡安装新系统,让系统自动分区,然后将备份的每个分区的文件恢复覆盖过去就行了。
不过,这种方式是我猜想的,没有测试过。。
3. 最后一种方式
说了这么多,最后一种方式就是利用系统附件自带的sd card copier程序,自动从源sd复制到目标sd卡。。。
不过需要raspbian 8 jessie及以上系统才会自带,如果附件没有,也可以sudo apt-get install piclone手动安装。
安装失败?那说明你是raspbian 7 wheezy,要么升级系统,要么参考前两章节。
No comments:
Post a Comment