在做petalinux系统时,sd卡里包含了bootloader以及rootfs两个分区。
完成系统定制后,每次换一张sd卡都需要全流程走一遍,于是想能否将sd卡所有内容制作成镜像,能够直接写入镜像到新卡中。
大致有两种方案。
windows环境备份与还原
使用Win32DiskImager备份和还原
- 优点是方便直接
- 缺点是备份文件是整张sd卡直接拷贝,例如,不管sd卡里实际文件多大,32G的卡备份出来的镜像也是32G的大小,耗时耗力。并且写入镜像到新sd卡的时候,新卡不能小于32G。
Linux环境备份,windows环境还原
为了解决备份文件过大问题,可以在Linux环境进行备份。
获取sd卡分区
df -h
找到sd卡的分区
如上所示,复制整张sd卡的路径就是/dev/sdb
sudo dd if=/dev/sdb | gzip>~/Documents/sd_backup.gz
如果想看到复制进度,添加progress参数
sudo dd if=/dev/sdb status=progress | gzip>~/Documents/sd_backup.gz
在window环境下解压后,依然可以使用Win32DiskImager还原镜像到新sd卡中。
最优方法更新
以上方法虽然可以进行压缩,但是还原的时候还是需要解压,解压后文件依然是整张sd卡的大小。
最大的缺点还是备份和还原的时候依然是备份整张sd。
例如128G的sd卡,备份的时候读取128G,还原的时候也是写入128G,然而实际有效文件可能只有10G,十分浪费时间。
于是想到备份时先压缩分区容量,去掉空闲空间,这样就可以大大减少备份容量。
通常来说,BootLoader分区只有几百兆,可以全部备份。于是在ubuntu中压缩rootfs分区。
使用磁盘工具中把rootfs分区压缩到允许的最小。
此时,整张sd卡从128G变为只有13G。
使用Win32DiskImager备份,注意勾选仅读取已分配分区。
这样,备份出来的img文件就只有13G了,相对于备份128G容量,无论是备份还是还原的时间都显著的减少。
同理,使用Win32DiskImager还原sd后,使用磁盘工具,将rootfs分区容量重新调整为最大,这样就不影响实际使用了。