0%

树莓派的备份与还原

全卡备份

就是把当前的SD卡全部复制到另一张新的SD卡上。要求新卡的容量大于等于旧卡。(并不适用于我。。)

原卡备份

参考:https://blog.csdn.net/qingtian11112/article/details/99825257

https://github.com/BigBubbleGum/RaspberryBackup

安装所需的软件

1
sudo apt install dosfstools dump parted kpartx

dosfstools:fat32分区格式化工具

dump:dump & restore 备份工具

parted & kpartx:虚拟磁盘工具

要求当前树莓派所占空间小于 SD 卡空间的 50%,就可以在树莓派内部直接生成镜像。否则要将备份的镜像生成到挂载的外置 SD 卡里面。df -h查看一下空间使用。

1
2
3
4
5
6
7
8
9
10
Filesystem      Size  Used Avail Use% Mounted on
/dev/root 29G 2.5G 26G 9% /
devtmpfs 3.7G 0 3.7G 0% /dev
tmpfs 3.9G 0 3.9G 0% /dev/shm
tmpfs 1.6G 3.0M 1.6G 1% /run
tmpfs 5.0M 4.0K 5.0M 1% /run/lock
/dev/mmcblk0p1 253M 30M 223M 12% /boot
/dev/sdb1 3.6T 3.4T 81G 98% /home/pi/DiskShare
/dev/sda1 7.3T 3.2T 3.7T 47% /home/pi/share
tmpfs 782M 0 782M 0% /run/user/1000

重点看/dev/root/dev/mmcblk0p1,分别对应root区和boot区。这两个分区就是我们要备份的。可以看到我的树莓派使用的总空间不到2.6GB。

创建一个空白镜像

命令

1
sudo dd if=/dev/zero of=./DiskShare/raspberrypi.img bs=1M count=3000

dd 可从标准输入或文件中读取数据,根据指定的格式来转换数据,再输出到文件、设备或标准输出。

参数说明:

  • if=文件名:输入文件名,默认为标准输入。即指定源文件。
  • ibs=bytes:一次读入bytes个字节,即指定一个块大小为bytes个字节。
    obs=bytes:一次输出bytes个字节,即指定一个块大小为bytes个字节。
    bs=bytes:同时设置读入/输出的块大小为bytes个字节。
  • bs=bytes:同时设置读入/输出的块大小为bytes个字节。
  • count=blocks:仅拷贝blocks个块,块大小等于ibs指定的字节数。

/dev/zero随意,不存在都行。./DiskShare/raspberrypi.img是你要创建的镜像的路径。

我创建的镜像大小为 3000 * 1MB,就是3GB,只要大小大于树莓派使用的总空间即可。

分割创建好的镜像文件

首先要看一下树莓派的磁盘结构

1
sudo fdisk -l

找到树莓派所在的磁盘,其实通过之前的df -h命令可以看到boot分区在/dev/mmcblk0p1分区里,只要没有什么特殊设置,树莓派所在磁盘肯定有/dev/mmcblk0p1分区。

1
2
3
4
5
6
7
8
9
10
Disk /dev/mmcblk0: 29.72 GiB, 31914983424 bytes, 62333952 sectors
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: 0xea382736

Device Boot Start End Sectors Size Id Type
/dev/mmcblk0p1 8192 532479 524288 256M c W95 FAT32 (LBA)
/dev/mmcblk0p2 532480 62333951 61801472 29.5G 83 Linux

第一个分区为 boot 分区,采用 FAT32 格式,从第8192个扇区到第532479 个扇区;第二个分区采用 EXT4,由第532480个扇区到结尾。

1
2
3
sudo parted DiskShare/raspberrypi.img --script -- mklabel msdos
sudo parted DiskShare/raspberrypi.img --script -- mkpart primary fat32 8192s 532479s
sudo parted DiskShare/raspberrypi.img --script -- mkpart primary ext4 532480s -1

-1表示到文件末尾。

检查是否成功

1
2
3
4
sudo parted DiskShare/raspberrypi.img
GNU Parted 3.4
Using /home/pi/DiskShare/raspberrypi.img
Welcome to GNU Parted! Type 'help' to view a list of commands.

输入print free

1
2
3
4
5
6
7
8
9
10
11
12
Model:  (file)
Disk /home/pi/DiskShare/raspberrypi.img: 3146MB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags:

Number Start End Size Type File system Flags
16.4kB 4194kB 4178kB Free Space
1 4194kB 273MB 268MB primary lba
2 273MB 3145MB 2872MB primary
3145MB 3146MB 1049kB Free Space

输入quit退出

挂载镜像并且格式化

1
2
sudo losetup -f --show DiskShare/raspberrypi.img
/dev/loop0

注意这里输出的loop0,如果你输出的是其他,把下面步骤的loop0都替换成你所输出的。

1
sudo kpartx -va /dev/loop0

接着

1
2
3
sudo kpartx -va /dev/loop0
add map loop0p1 (254:0): 0 524288 linear 7:0 8192
add map loop0p2 (254:1): 0 5609472 linear 7:0 532480

此时 loop device 就设置好了,loop0p1 对应的是镜像文件分区上的 /bootloop0p2 对应的是 /

然后格式化镜像文件文件中的两个分区。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
sudo mkfs.vfat -n boot /dev/mapper/loop0p1
mkfs.fat 4.2 (2021-01-31)
mkfs.fat: Warning: lowercase labels might not work properly on some system

sudo mkfs.ext4 /dev/mapper/loop0p2
mke2fs 1.46.2 (28-Feb-2021)
Discarding device blocks: done
Creating filesystem with 701184 4k blocks and 175296 inodes
Filesystem UUID: e41b54ae-ee95-42e5-b4df-df1a32a21859
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912

Allocating group tables: done
Writing inode tables: done
Creating journal (16384 blocks): done
Writing superblocks and filesystem accounting information: done

格式化成功,将两个分区挂载。

创建两个临时文件用于挂载

1
2
mkdir DiskShare/backup_boot
mkdir DiskShare/backup_roo

先挂载/boot

1
sudo mount -t vfat -o uid=pi,gid=pi,umask=0000 /dev/mapper/loop0p1 DiskShare/backup_boot/

uid=pi,gid=pi,umask=0000 /dev/mapper/loop0p1 DiskShare/backup_boot/根据自己的情况修改

再挂载/

1
sudo mount -t ext4 /dev/mapper/loop0p2 DiskShare/backup_root/

df -h查看是否成功

1
2
3
4
5
6
7
8
9
10
11
12
Filesystem           Size  Used Avail Use% Mounted on
/dev/root 29G 2.5G 26G 9% /
devtmpfs 3.7G 0 3.7G 0% /dev
tmpfs 3.9G 0 3.9G 0% /dev/shm
tmpfs 1.6G 3.0M 1.6G 1% /run
tmpfs 5.0M 4.0K 5.0M 1% /run/lock
/dev/mmcblk0p1 253M 30M 223M 12% /boot
/dev/sdb1 3.6T 3.4T 81G 98% /home/pi/DiskShare
/dev/sda1 7.3T 3.2T 3.7T 47% /home/pi/share
tmpfs 782M 0 782M 0% /run/user/1000
/dev/mapper/loop0p1 256M 0 256M 0% /home/pi/DiskShare/backup_boot
/dev/mapper/loop0p2 2.6G 24K 2.5G 1% /home/pi/DiskShare/backup_root

可以看到已经成功挂载上去了。

开始备份

  1. 先备份/boot

    1
    sudo cp -rfp /boot/* DiskShare/backup_boot/

    大致会报错

    1
    cp: failed to preserve ownership for 'DiskShare/backup_boot/System Volume Information': Operation not permitted

    不管他,只要文件复制过来就好。

    查看一下文件大小是否对应

    1
    df -h DiskShare/backup_boot/

    输出

    1
    2
    Filesystem           Size  Used Avail Use% Mounted on
    /dev/mapper/loop0p1 256M 31M 226M 12% /home/pi/DiskShare/backup_boot

    和原来的/boot大小一致。

  2. 备份根目录

    先变更一下权限

    1
    2
    sudo chmod 777 DiskShare/backup_root
    sudo chmod pi:pi DiskShare/backup_root

    开始备份

    1
    2
    cd DiskShare/backup_root
    sudo dump -0uaf - / | sudo restore -rf -s

    报了一堆错,不过好在出现了

    1
    DUMP: DUMP IS DONE

    就说明完成了

  3. 修改相应的 PARTUUID

    此时备份已经完成,还需要修改下 Raspbian 启动对应分区的 PARTUUID。

    首先查看两个分区的 PARTUUID

    1
    2
    3
    4
    sudo blkid
    /dev/loop0: PTUUID="e2cf4a8e" PTTYPE="dos"
    /dev/mapper/loop0p1: SEC_TYPE="msdos" LABEL_FATBOOT="boot" LABEL="boot" UUID="0B9E-4FAD" BLOCK_SIZE="512" TYPE="vfat" PARTUUID="e2cf4a8e-01"
    /dev/mapper/loop0p2: UUID="e41b54ae-ee95-42e5-b4df-df1a32a21859" BLOCK_SIZE="4096" TYPE="ext4" PARTUUID="e2cf4a8e-02"

    /boot对应e2cf4a8e-01/对应e2cf4a8e-02

    修改cmdline.txt

    1
    sudo nano /home/pi/DiskShare/backup_boot/cmdline.txt

    找到root=PARTUUID=把等号后面的值改为e2cf4a8e-02。(/对应e2cf4a8e-02

    修改fstab

    1
    sudo nano /home/pi/DiskShare/backup_root/e

    输出

    1
    2
    3
    4
    5
    6
    7
    proc            /proc           proc    defaults          0       0
    PARTUUID=ea382736-01 /boot vfat defaults 0 2
    PARTUUID=ea382736-02 / ext4 defaults,noatime 0 1
    # a swapfile is not a swap partition, no line here
    # use dphys-swapfile swap[on|off] for that
    /dev/sda1 /home/pi/share ext4 defaults 1 1
    /dev/sdb1 /home/pi/DiskShare ext4 defaults 1 1

    这里我挂载了两个外置硬盘,先删这两个。

    1
    2
    3
    4
    5
    proc            /proc           proc    defaults          0       0
    PARTUUID=ea382736-01 /boot vfat defaults 0 2
    PARTUUID=ea382736-02 / ext4 defaults,noatime 0 1
    # a swapfile is not a swap partition, no line here
    # use dphys-swapfile swap[on|off] for that

    PARTUUID=后面的值改为对应的值

    1
    2
    3
    4
    5
    proc            /proc           proc    defaults          0       0
    PARTUUID=e2cf4a8e-01 /boot vfat defaults 0 2
    PARTUUID=e2cf4a8e-02 / ext4 defaults,noatime 0 1
    # a swapfile is not a swap partition, no line here
    # use dphys-swapfile swap[on|off] for that
  4. 收尾

    卸载各挂载分区

    1
    2
    sudo umount /home/pi/DiskShare/backup_boot
    sudo umount /home/pi/DiskShare/backup_root

    删除loop device

    1
    2
    sudo kpartx -d /dev/loop0
    sudo losetup -d /dev/loop0

    删除挂载目录

    1
    2
    rmdir /home/pi/DiskShare/backup_boot
    rmdir /home/pi/DiskShare/backup_root

使用OMV插件backup备份

Failed to execute command ‘export PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin; export LANG=C.UTF-8; /usr/sbin/omv-backup 2>&1’: No backup volume set. Please choose a backup volume.

OMV\ExecException: Failed to execute command ‘export PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin; export LANG=C.UTF-8; /usr/sbin/omv-backup 2>&1’: No backup volume set. Please choose a backup volume. in /usr/share/openmediavault/engined/rpc/backup.inc:72
Stack trace:

安装backup插件

openmediavault-backup 6.0

安装

创建用于备份的文件夹

存储器->共享文件夹->创建

开始备份

安装完插件后应该可以看到导航

系统->备份

选择备份文件夹,方式我选择dd备份。

点击备份等待即可。