准备工具:需要备份的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即可。 微信图片_20201014205844 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或不同的账户需要做相应修改。 微信图片_20201014211231 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 微信图片_20201014211938 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 微信图片_20201014212158 7、检查分区是否成功 sudo parted ardusub-raspbian-ros.img 输入print free可以显示分区内容,输入quit退出。 微信图片_20201014212322 8、img文件对应的loop device的设置 sudo losetup -f --show ardusub-raspbian-ros.img 通过输出结果可知此次对应的device号为18 sudo kpartx -va /dev/loop18 ls /dev/mapper/loop18p* 微信图片_20201014212454 如上图,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/ 微信图片_20201014212658 注意,第三行指令的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,需要根据实际情况更改。微信图片_20201014213416 然后压缩根目录下文件 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 微信图片_20201014213618 13、修改PARTUUID 首先获取PARTUUID sudo blkid 微信图片_20201014213722 找到loop18p1和loop18p2的PARTUUID。 修改相应PARTUUID参数: sudo vim ./tgt_boot/cmdline.txt sudo vim ./tgt_Root/etc/fstab 得到结果如下图: 微信图片_20201014213856 微信图片_20201014214022 14、卸载各挂载的分区 sudo umount src_boot src_Root tgt_boot tgt_Root 15、删除loop device sudo kpartx -d /dev/loop18 sudo losetup -d /dev/loop18 16、删除挂载点目录 rmdir src_boot src_Root tgt_boot tgt_Root 17、此时,工作目录下只剩下备份好的img镜像文件,在linux下可以使用dd指令进行烧录,在windows下可以使用etcher进行烧录 若是觉得img镜像文件还是太大,可以再进行压缩 zip -r ardusub-raspbian-ros.img.zip ardusub-raspbian-ros.img 得到的zip文件才2G多一点,该zip文件也使用etcher可以直接烧录。 微信图片_20201014214322 18、使用etcher烧录至sd卡后,开机可能会出现sd卡空间未充分使用的情况。即系统提示只有10G的可用空间,而sd卡有32G的使用空间。此时可参照以下博客 https://blog.csdn.net/weixin_40490238/article/details/89320293 借助ubuntu下gparted工具,步骤基本为: ①打开gparted;②选择sd卡;③umount  sd卡;④调整sd卡空间大小;⑤应用修改。