最小化备份树莓派系统镜像

    做工程时希望将树莓派sd卡的系统备份成镜像文件,需要使用时直接烧录至sd卡即可。一些传统方法制作出来的镜像通常为sd卡容量大小,即一张32G的sd卡实际使用空间为4G,但制作出来的镜像为32G。希望制作出来的备份镜像与sd卡实际使用的空间大小一样,都为4G。只通过命令行实现。

    参考文章:https://blog.csdn.net/zhufu86/article/details/78821056。

    准备工具:需要备份的SD卡,读卡器,PC(Linux)

1、安装必备工具软件:

sudo apt-get install dosfstools dump parted kpartx

2、将装载sd卡的读卡器插入PC,查看sd卡使用的空间

df -h

     如图,此次sd卡对应的设备名为/dev/sde,其中sde1为boot文件,sde2为/根目录文件。可见,sd卡使用了7.5G+20M,则镜像预设的大小为8G即可。

最小化备份树莓派系统镜像_第1张图片

3、建立工作目录

mkdir ~/backupimg

cd ~/backupimg/

4、挂载源sd卡

mkdir src_boot

mkdir src_Root

sudo mount -t vfat -o uid=pcl-02,gid=pcl-02,umask=0000 /dev/sde1 ./src_boot/

sudo mount -t ext4 /dev/sde2 ./src_Root/

 

    注意,第三行指令的uid和pid为此次备份我使用的PC的系统的用户id和组id,使用不同的PC或不同的账户需要做相应修改。

最小化备份树莓派系统镜像_第2张图片

5、建立一个8000M的空白img文件。

sudo dd if=/dev/zero of=ardusub-raspbian-ros.img bs=1M count=8000

    建立过程需要时间,可以在新终端通过以下指令观察img文件大小变化可以查看进度。

watch –d –n 5 ls –lh ~/backupimg

 

6、给镜像文件分区

cd ~/backupimg

sudo parted ardusub-raspbian-ros.img --script -- mklabel msdos

sudo parted ardusub-raspbian-ros.img --script -- mkpart primary fat32 8192s 122479s

sudo parted ardusub-raspbian-ros.img -- mkpart primary ext4 122880s -1

 

7、检查分区是否成功

sudo parted ardusub-raspbian-ros.img

 

    输入print free可以显示分区内容,输入quit退出。

最小化备份树莓派系统镜像_第3张图片

8、img文件对应的loop device的设置

sudo losetup -f --show ardusub-raspbian-ros.img

 

    通过输出结果可知此次对应的device号为18。

sudo kpartx -va /dev/loop18

ls /dev/mapper/loop18p*

 

最小化备份树莓派系统镜像_第4张图片

如上图,loop0p1对应的是img文件上的/boot,loop0p2对应的是/根目录。

9、格式化img文件中的两个分区

sudo mkfs.vfat -n boot /dev/mapper/loop18p1

sudo mkfs.ext4 /dev/mapper/loop18p2

 

10、挂载img文件的两个分区

mkdir tgt_boot

mkdir tgt_Root

sudo mount -t vfat -o uid=pcl-02,gid=pcl-02,umask=0000 /dev/mapper/loop18p1 ./tgt_boot/

sudo mount -t ext4 /dev/mapper/loop18p2 ./tgt_Root/

 

    注意,第三行指令的uid和pid为此次备份我使用的PC的系统的用户id和组id,使用不同的PC或不同的账户需要做相应修改。

11、备份/boot

sudo cp -rfp ./src_boot/* ./tgt_boot/

 

12、备份/(根目录文件)

    由于使用dump/restore的方法遇到了不少问题,故采用了tar压缩复制解压的方法。

    首先对目标挂载点设置合适的权限,并清空。

sudo chmod 777 tgt_Root

sudo chown pcl-02.pcl-02 tgt_Root

sudo rm -rf ./tgt_Root/*

 

    注意第二行指令的pid.uid为pcl-02.pcl-02为此次PC的用户ID和组ID,需要根据实际情况更改。

最小化备份树莓派系统镜像_第5张图片

    然后压缩根目录下文件

cd src_Root/

sudo tar pcf ../backup.tar .

 

    压缩过程需要较长时间,可以在新终端通过以下指令观测backup.tar大小估计压缩进度。

watch –d –n 5 ls –lh ~/backupimg/

 

    打包过程结束后将tar包解压缩至img文件的根文件系统。删除压缩文件

cd ../tgt_Root/

sudo tar pxf ../backup.tar

cd ..

sudo rm backup.tar

 

最小化备份树莓派系统镜像_第6张图片

12、修改PARTUUID

    首先获取PARTUUID

sudo blkid

 

最小化备份树莓派系统镜像_第7张图片

    找到loop18p1和loop18p2的PARTUUID。

    修改相应PARTUUID参数:

sudo vim ./tgt_boot/cmdline.txt

sudo vim ./tgt_Root/etc/fstab

    得到结果如下图:

最小化备份树莓派系统镜像_第8张图片

13、卸载各挂载的分区

sudo umount src_boot src_Root tgt_boot tgt_Root

 

14、删除loop device

sudo kpartx -d /dev/loop18

sudo losetup -d /dev/loop18

 

15、删除挂载点目录

rmdir src_boot src_Root tgt_boot tgt_Root

 

16、此时,工作目录下只剩下备份好的img镜像文件,在linux下可以使用dd指令进行烧录,在windows下可以使用etcher进行烧录。

    若是觉得img镜像文件还是太大,可以再进行压缩

zip -r ardusub-raspbian-ros.img.zip ardusub-raspbian-ros.img

 

    得到的zip文件才2G多一点,该zip文件也使用etcher可以直接烧录。

17、使用etcher烧录至sd卡后,开机可能会出现sd卡空间未充分使用的情况。即系统提示只有10G的可用空间,而sd卡有32G的使用空间。此时可参照以下博客。

https://blog.csdn.net/weixin_40490238/article/details/89320293

借助ubuntu下gparted工具,步骤基本为:

①打开gparted;②选择sd卡;③umount  sd卡;④调整sd卡空间大小;⑤应用修改。

你可能感兴趣的:(最小化备份树莓派系统镜像)