使用tar或partclone备份树莓派linux系统【备份包600多MB,可网络备份恢复】



前言

  • 我的树莓派3B有两个U盘,速度快的U盘用做日常服务运行,以下简称“业务U盘”。速度慢的U盘用来做救援U盘,救援U盘只是一个Lite版的Raspi OS。救援U盘平常不会插在树莓派上。如果你不用U盘,那就假设自己有两个TF卡,举一反三(无非就是类似于sdb对应mmcblk1, sdb1对应mmcblk1p1,sdb2对应mmcblk1p2)。
  • 备份我是使用windows的git bash(安装git就会有一个unix命令行工具),我使用的是网络备份,操作比较方便。
  • 相比分区克隆(比如dd),备份文件的体积小很多。Raspberry Pi OS Bookworm备份出来600多MB。
  • 备份恢复有两种方法,一种是tar,一种是partclone。tar方法是文件打包,partclone是块级别的备份(只备份有数据的块,所以体积和tar方式差不多)
  • 本博文是作者“进取有乐”原创,仅发布于博客园,其他网站转载请注明出处。



操作注意事项

  1. 下面的命令操作分windows git bash执行树莓派root用户执行树莓派root用户执行是指:使用类似putty、XShell之类的工具登录树莓派的命令行终端,使用root用户执行命令。
  2. 所有操作务必谨慎,结合lsblk -f、 fdisk -l、 blkid之类的命令,通过大小或其他方式确认被操作的存储设备是正确的。
  3. gzip压缩/解压可以放在树莓派端完成,也可以放在windows端完成。windows端cpu性能高一些。两种方式的命令是有差异的。



方法1:tar

备份步骤简述

  1. 插救援U盘启动树莓派,再插入业务U盘,准备好环境。
  2. 备份业务U盘第一分区前面的所有扇区
  3. tar命令备份业务U盘的第一分区(启动分区)和第二分区(根分区)文件系统上的文件

备份的详细操作步骤

1. 插救援U盘启动树莓派,再插入业务U盘,准备好环境。

  • 建立windows主机和树莓派之间的ssh信任关系:

    1. windows git bash执行:
      ssh root@192.168.1.33 # (假设我的树莓派ip地址是192.168.1.33)。 看看是否需要输入密码,如果不用输入密码就能直接登录树莓派,则可以直接跳到步骤 “获取分区情况”。

    2. 检查救援U盘的sshd服务是否可以使用密码、公钥登录root账户,如果不行,则在树莓派的/etc/ssh/sshd_config的末尾增加4行:

         Match User root
             PermitRootLogin yes
             PasswordAuthentication yes
             PubkeyAuthentication yes
      

      然后重启树莓派sshd服务,树莓派root用户执行:
      systemctl restart sshd.service

    3. 如果没有ssh秘钥,可以在windows的git bash执行ssh-keygen命令来生成一个ssh密钥对,提示输入密码的时候,记得留空。

    4. 建立windows主机和树莓派之间的ssh信任关系,使用公钥免root密码登录树莓派。操作如下:
      使用windows的git bash执行:
      ssh-copy-id root@192.168.1.33 # 输入root密码,那么两者之间的信任关系就建立了,此时后续执行任何ssh命令都不用输入root密码。
      如果执行上面命令的时候出现类似以下的"中间人攻击"提示,而导致命令执行失败:

         @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
         @    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
         @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
         IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
         Someone could be eavesdropping on you right now (man-in-the-middle attack)!
         It is also possible that a host key has just been changed.
         The fingerprint for the ED25519 key sent by the remote host is
         SHA256:MKshLA8/djHM3kxCi9S94Mak+YIOIKbP4p+fafZcGIM.
         Please contact your system administrator.
         Add correct host key in /c/Users/XXX/.ssh/known_hosts to get rid of this message.
         Offending ECDSA key in /c/Users/XXX/.ssh/known_hosts:3
         Host key for pi has changed and you have requested strict checking.
         Host key verification failed.
      

      则可以清空known_hosts文件,消除该提示,操作如下:
      windows的git bash执行:>/c/Users/XXX/.ssh/known_hosts #注意这里的XXX请替换成你的提示中实际出现的名字。

  • 获取分区情况:
    树莓派root用户执行:fdisk -l /dev/sdb # 我的是U盘,所以这里是/dev/sdb,如果插的是TF卡,则使用fdisk -l /dev/mmcblkX, (X表示数字)。
    回显如下:

      Disk /dev/sdb: 115.5 GiB, 124017180672 bytes, 242221056 sectors
      Disk model: DataTraveler 3.0
      Units: sectors of 1 * 512 = 512 bytes
      Sector size (logical/physical): 512 bytes / 512 bytes
      I/O size (minimum/optimal): 512 bytes / 512 bytes
      Disklabel type: dos
      Disk identifier: 0xdf3f5459
    
      Device     Boot   Start       End   Sectors  Size Id Type
      /dev/sdb1         16384   1064959   1048576  512M  c W95 FAT32 (LBA)
      /dev/sdb2       1064960 242221055 241156096  115G 83 Linux    
    

    我们发现:业务U盘第一分区的范围是16384~1064959扇区,第二分区起始于1064960扇区,第一分区是FAT32文件系统,第二分区根分区使用blkid查看,发现是ext4文件系统。
    上面的回显我们把他存在windows主机中的fdisk.txt,方便后面查看。

2. 备份业务U盘第一分区之前的所有扇区

  • 其实树莓派3B只需要备份业务U盘0号扇区就可以了,因为MBR分区表就是存储在磁盘第0号扇区的后64字节。树莓派3B的OS不像PC的linux系统,没有grub2在LBA1-62逻辑扇区写入数据。至于树莓派4、5我不清楚,所以建议大家保守点,把第一分区之前的扇区都备份下来。windows的git bash执行:ssh root@192.168.1.33 "dd if=/dev/sdb count=16384" |dd of=udisk.dd

  • 注意,上面命令中/dev/sdb后没有数字,如果你的是TF卡,/dev/sdb就替换成类似于/dev/mmcblkX,千万不能写成/dev/mmcblkXpY (这里的X和Y表示数字)。
    此时windows主机上,就出现了一个udisk.dd的文件,这个文件是业务U盘第一分区之前的16384个扇区的备份,也就是U盘的第0扇区到第16384扇区的备份
    此处16384这个数字怎么来的,请看前面步骤。树莓派使用不同操作系统这个数字会有差异,有些操作系统是8192个扇区。

3. tar命令备份业务U盘的第一分区和第二分区文件系统上的所有文件

  1. 树莓派上挂载好业务U盘的第一分区和第二分区,树莓派root用户执行:
    cd /mnt
    mkdikr bootfs rootfs
    mount /dev/sdb1 bootfs
    mount /dev/sdb2 rootfs

  2. 备份业务U盘的第一分区文件:
    windows的git bash执行:
    ssh root@192.168.1.33 "tar -C /mnt/bootfs --one-file-system -zcpf - ." |dd of=bootfs.tar.gz bs=4K # 此时,windows主机上,就出现了一个文件bootfs.tar.gz, 该文件是业务U盘第一分区里面所有文件的tar.gz压缩包(压缩是在树莓派端完成的)。当然你也可以把gzip压缩放在windows电脑端完成(tar命令去掉-z选项,不用dd命令):ssh root@192.168.1.33 "tar -C /mnt/bootfs --one-file-system -cpf - ." |gzip -c >bootfs.tar.gz

  3. 备份业务U盘的第二分区(根分区)文件:
    windows的git bash执行:
    ssh root@pi "tar -C /mnt/rootfs --one-file-system --exclude=./dev/* --exclude=./lost+found -zcpf - ." |dd of=rootfs.tar bs=4K # 此处的--exclude=./dev/*的星号是指排除业务U盘根分区/dev目录下的所有文件,而不排除/dev目录本身
    此时,windows主机上,就出现了一个文件rootfs.tar.gz, 该文件是业务U盘第二分区(根分区)里面所有文件的tar.gz压缩包
    至此,备份完成!!,windows主机上,存在4个文件:

        fdisk.txt   # 业务U盘的分区信息
        udisk.dd    # 业务U盘第0个扇区至第一个分区之前的所有扇区备份文件
        bootfs.tar.gz  # 业务U盘第一分区的所有文件压缩包
        rootfs.tar.gz  # 业务U盘第二分区,也就是根分区的所有文件压缩包

恢复步骤简述

  1. 插救援U盘启动树莓派,再插入业务U盘,准备好环境。
  2. dd恢复业务U盘第一分区之前的所有扇区
  3. 在业务U盘的第一分区和第二分区上创建文件系统
  4. 挂载分区,并用tar命令恢复业务U盘两个分区的文件
  5. 修复cmdline.txt和fstab中的UUID

恢复的详细操作步骤

1. 查看业务U盘情况

插救援U盘启动树莓派,再插入业务U盘,准备好环境。
树莓派上,确认业务U盘已经识别。树莓派root用户执行:
fdisk -l /dev/sdb # 回显如下:

        Disk /dev/sdb: 115.5 GiB, 124017180672 bytes, 242221056 sectors
        Disk model: DataTraveler 3.0
        Units: sectors of 1 * 512 = 512 bytes
        Sector size (logical/physical): 512 bytes / 512 bytes
        I/O size (minimum/optimal): 512 bytes / 512 bytes
        Disklabel type: dos
        Disk identifier: 0xdf3f5459
        
        Device     Boot Start       End   Sectors   Size Id Type
        /dev/sdb1        8192 242221055 242212864 115.5G  7 HPFS/NTFS/exFAT

树莓派root用户执行:
blkid # 命令回显如下:

           /dev/sda2: UUID="e85df659-e51e-41f4-8cec-6954e76db4e1" BLOCK_SIZE="4096" TYPE="ext4" PARTUUID="eaf036ba-02"
           /dev/sda3: UUID="7DEF-F9C3" BLOCK_SIZE="512" TYPE="exfat" PTTYPE="dos" PARTUUID="eaf036ba-03"
           /dev/sda1: UUID="A039-117D" BLOCK_SIZE="512" TYPE="vfat" PARTUUID="eaf036ba-01"
           /dev/sdb1: UUID="7ECD-3E3C" BLOCK_SIZE="512" TYPE="exfat" PTTYPE="dos" PARTUUID="df3f5459-01"

从回显看,我的业务U盘被借走,居然全部格式化了,整个业务U盘变成一个exfat分区了。

2.恢复U盘第一分区之前的所有扇区

windows的git bash执行:
dd if=udisk.dd |ssh root@192.168.1.33 "dd of=/dev/sdb" # 从windows主机的udisk.dd文件恢复到树莓派的/sdb,这里sdb后面没有数字,因为这里对整个U盘的前16384个扇区进行操作。
树莓派root用户执行:
lsblk # 执行lsblk,我们发现业务U盘的分区变成了两个了, 命令回显如下:

           NAME   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS
           sda      8:0    1   233G  0 disk
           ├─sda1   8:1    1   512M  0 part /boot/firmware
           ├─sda2   8:2    1    21G  0 part /
           └─sda3   8:3    1 211.5G  0 part
           sdb      8:16   1 115.5G  0 disk
           ├─sdb1   8:17   1   512M  0 part
           └─sdb2   8:18   1   115G  0 part

3.在业务U盘的第一分区和第二分区上创建文件系统:

树莓派上root用户执行:
mkfs.vfat /dev/sdb1 # 业务U盘第一个分区建立vfat文件系统
mkfs.ext4 /dev/sdb2 # 业务U盘第二个分区建立ext4文件系统

4.tar命令恢复两个分区的文件:

先挂载两个分区,树莓派上用root用户执行:
cd /mnt
mount /dev/sdb1 bootfs
mount /dev/sdb2 rootfs
使用tar命令恢复分区文件,windows的git bash执行:
dd if=bootfs.tar.gz bs=4K |ssh root@192.168.1.33 "tar --numeric-owner -C /mnt/bootfs -zpxf -" # 恢复第一分区, gzip解压是在树莓派端完成,如果想在windows端完成解压,则应该写成 gzip -dc bootfs.tar.gz |ssh root@192.168.1.33 "tar --numeric-owner -C /mnt/bootfs -pxf -"
dd if=rootfs.tar.gz bs=4K |ssh root@192.168.1.33 "tar --numeric-owner -C /mnt/rootfs -zpxf -" # 恢复第二分区, 时间有点久,gzip解压是在树莓派端完成的。如果想要在windows端做gzip解压,请参考上一条命令注释。

5. 修复cmdline.txt和fstab中的UUID

  1. 树莓派root用户执行:
    blkid # 查看分区的UUID或PARTUUID。回显如下:

     /dev/sdb2: UUID="0a6f7f53-6091-4310-9adf-c1704a8991a6" BLOCK_SIZE="4096" TYPE="ext4" PARTUUID="df3f5459-02"
     /dev/sdb1: PARTUUID="df3f5459-01"
    
  2. 查看业务U盘第一分区的cmdline.txt文件和第二分区的fstab文件
    树莓派使用root用户执行:
    cat /mnt/bootfs/cmdline.txt # 回显如下:

         console=serial0,115200 console=tty1 root=PARTUUID=eaf036ba-02 rootfstype=ext4 fsck.repair=yes rootwait cfg80211.ieee80211_regdom=CN
    

    我们发现/mnt/bootfs/cmdline.txt和/etc/fstab文件中的PARTUUID值和blkid显示的值不同。那么我们只需要把上面文件中的PARTUUID修改成blkid命令显示的真实值就可以了。
    /mnt/bootfs/cmdline.txt文件中的root=PARTUUID=XXXXXXXX-YY表示过了initrd启动阶段后,找PARTUUID值为XXXXXXXX-YY的分区作为根分区来启动操作系统。文件中的这部分内容要修改成blkid命令回显的实际值。所以修改后如下:
    root=PARTUUID=df3f5459-02。 #当然,如果你不想要PARTUUID,而是想要使用UUID来指定操作系统根分区也可以:root=UUID=0a6f7f53-6091-4310-9adf-c1704a8991a6
    /mnt/rootfs/etc/fstab文件的修改同理。至此树莓派操作系统的恢复操作全部完成



方法2:partclone

备份

备份步骤的前两步(建立windows主机和树莓派信任关系、dd备份业务U盘第一分区之前的所有扇区)和方法1的操作一样,可以参考前面。
树莓派上root用户执行:
lsblk -f # 确认业务U盘是否挂载,如果挂载了,就用umount卸载业务U盘,防止后面的备份过程中有写入操作。同时这里我们也能看出业务U盘第一个分区是vfat文件系统。所以备份第一个分区我们要使用partclone.vfat命令

windows的git bash执行:
ssh root@192.168.1.33 "partclone.vfat -c -s /dev/sdb1" |gzip -c >bootfs.vfat.partclone.gz # 备份业务U盘第一分区,gzip压缩是在windows端完成的。如果你想在树莓派端完成gzip压缩,则要写成:ssh root@192.168.1.33 "partclone.fat32 -c -s /dev/sdb1 |gzip -c " | dd of=bootfs.fat32.partclone.gz bs=4K
ssh root@192.168.1.33 "partclone.ext4 -c -s /dev/sdb2" |gzip -c >rootfs.ext4.partclone.gz # 备份业务U盘第二分区

恢复

恢复的前3个步骤和方法1的一样,可以参考前面。
windows的git bash执行:
gzip -dc bootfs.vfat.partclone.gz |ssh root@192.168.1.33 "partclone.vfat -Cr -o /dev/sdb1" # 恢复业务U盘第一分区,解压缩是在windows端完成的
gzip -dc rootfs.ext4.partclone.gz |ssh root@192.168.1.33 "partclone.ext4 -r -o /dev/sdb2" # 恢复业务U盘第二分区
修复业务U盘的UUID或PART-UUID可以参考方法1的步骤,这里不赘述。



业务U盘坏了,怎么办?

简单,自己找一个好的U盘或TF卡,然后使用parted建一个fat32分区和一个ext4分区,分别用于启动分区和根分区,挂载好两个分区,然后把备份文件用tar命令释放到这两个新分区,修复uuid即可。(我的是树莓派3B,没用到grub2。树莓派4、5是否用到grub2?如果用到grub2,那么最后要记得重新安装grub2)

posted on 2025-06-14 18:21  进取有乐  阅读(155)  评论(0)    收藏  举报

导航