西区代码小仓库 - bash
type: channel
link: https://www.lisper517.top/tag/bash/
items: 树莓派备份-RaspberryBackup详解

树莓派备份-RaspberryBackup详解
type: item
date: 2022-02-06T16:00:00+00:00
description: 步骤/目录： 1.rpi-backup.sh详解 （1）准备工作 （2）挂载img文件并备份 （3）修改PARTUUID （4）收尾工作 （5）使用备份镜像 2.编写脚本文件 （1）dump/store法 （2）tar法 3.验证 （1）备份系统 （2）还原系统本文首发于个人博客https://lisper517.top/index.php/archives/10/，转载请注明出处。本文实验日期为2022年2月7日。使用的是树莓派4B（内存8G版），cat /etc/os-release查看系统为Raspbian GNU/Linux 10 (buster)；待备份系统为Pi OS 32位桌面版（即raspbian。2022年1月28日更新，镜像名 2022-01-28-raspios-bullseye-armhf.img ）。步骤参考了制作树莓派img镜像文件，脚本在RaspberryBackup项目原址基础上略微改动。1.rpi-backup.sh详解（1）准备工作注意，如果手动挂载读卡器前，读卡器已自动挂载（用df -h查看时发现挂载到/media/pi/boot和/media/pi/rootfs等位置），那么可能需要umount一下，并新建文件夹、手动挂载。如果备份/boot区时出现cp: 无法保留'./tgt_boot/文件名' 的所有者: 不允许的操作，就可能是这个原因。待备份系统sd卡用读卡器接上树莓派，使用lsblk查看，待备份系统的/boot目录在设备/dev/sdb1（大小为256M）、/目录在/dev/sdb2（大小为58.2G），但是还没挂载。在media下新建文件夹并挂载：mkdir /media/boot1 /media/root1 mount /dev/sdb1 /media/boot1 mount /dev/sdb2 /media/root1用df -h查看，已经挂载上了。接下来安装需要的软件：apt install dosfstools dump parted kpartx创建工作目录并进入：mkdir ~/backupimg cd ~/backupimg创建空白img文件（待备份系统大概使用了4G空间，img文件使用5000M）：dd if=/dev/zero of=raspi.img bs=1M count=5000简单介绍一下dd命令：用于复制文件，复制时可转换格式。这里的bs是指定读取输入文件、写入输出文件时的字节大小，注意这里带不带B的区别（不带B是1024进制，带B是1000进制。img文件大小必须是512 bytes的整数倍）；count指定大小。经过一段时间后，img文件创建完毕。接下来看看待备份sd卡的分区：fdisk -l #显示信息如下 ... Device Boot Start End Sectors Size Id Type /dev/sdb1 8192 532479 524288 256M c W95 FAT32 (LBA) /dev/sdb2 532480 122138623 121606144 58G 83 Linux本例中待备份的sd卡为64GB。接下来使用parted给img文件分区（注意分区的起点扇区号是8192的倍数，4K对齐。这里的8192单位是512 bytes）：parted raspi.img --script -- mklabel msdos parted raspi.img --script -- mkpart primary fat32 8192s 532479s parted raspi.img --script -- mkpart primary ext4 532480s -1然后parted raspi.img进入parted命令行，print free检查一下分区并quit。准备工作已完成，接下来挂载img文件并开始备份。（2）挂载img文件并备份使用losetup把img文件虚拟成区块设备：losetup -f --show raspi.img #显示/dev/loop0 kpartx -av /dev/loop0 #这时find /dev/mapper -name "loop0p*"可以找到loop0p1（/boot）和loop0p2（/）接下来格式化，创建文件夹并挂载到文件夹：mkfs.vfat -n boot /dev/mapper/loop0p1 mkfs.ext4 -L rootfs /dev/mapper/loop0p2 mkdir tgt_boot tgt_Root mount -t vfat -o uid=root,gid=root,umask=0000 /dev/mapper/loop0p1 ./tgt_boot …