通过 ssh 使用 gzip 压缩对树莓派进行 dd 备份

通过 ssh 使用 gzip 压缩对树莓派进行 dd 备份

我通过 ssh 使用 gzip 压缩从另一台 Linux 计算机上“实时”备份我的树莓派。我使用这个脚本:

#!/bin/bash
dt=`date +%y%m%d`
ssh [email protected] "sudo dd if=/dev/mmcblk0 bs=1M | gzip -" | dd of=./pibackup-$dt.gz

它工作得很好,但生成的文件是 26Gb,这太多了(我认为)。我只想备份系统的内容,而不备份空闲集群。我知道 dd 会进行整个备份,包括空闲集群,但我认为通过使用 gzip 我可以减小生成文件的大小。

因此,当我输入 df -h 时,请查看我的系统:

Filesystem      Size  Used Avail Use% Mounted on
/dev/root        29G  3.1G   24G  12% /
devtmpfs        459M     0  459M   0% /dev
tmpfs           464M     0  464M   0% /dev/shm
tmpfs           464M   49M  415M  11% /run
tmpfs           5.0M  4.0K  5.0M   1% /run/lock
tmpfs           464M     0  464M   0% /sys/fs/cgroup
/dev/mmcblk0p1  253M   52M  201M  21% /boot
tmpfs            93M     0   93M   0% /run/user/1000
/dev/sda1       932G  184G  749G  20% /media/HDD

答案1

“冷”备份比“活”备份安全得多。

在正在运行的 PI 上,运行以下命令

cd $HOME; dd if=/dev/zero of=zero bs=8M; rm zero

它将在所有可用空间上写入零,这将提供高压缩率。然后将树莓派的microSD放到另一个系统上,例如运行ubuntu的桌面上并运行

fdisk -l

我将 microSD 视为 /dev/sdb,然后以下命令将使用以下命令压缩整个 SD:

gzip -c /dev/sdb > /backup/raspberry-pi.gz

要恢复,请运行以下命令:

gzip -cd /backup/raspberry-pi.gz > /dev/sdb

建议在尝试上述过程之前先进行完整备份。

答案2

正如评论中所建议的,您有许多用于备份 Pi 的文件系统级选项。如果这样做,您将需要排除虚拟文件系统/proc/sys.您还应该注意,它不会包含非文件系统启动映像或分区表;我将在本答案的末尾提供单独支持这一点的建议。

  1. 您可以使用rsync。这将为您提供备份介质上文件系统的副本,而不是单个映像文件。

    rsync -avzHP --exclude '/proc/' --exclude '/sys/' root@pi:/ /backup/pi.$(date +'%Y%m%d')
    

    如果您的本地帐户不是 root,您可能需要包含--fake-super备份和恢复选项。 (它保存远程所有权详细信息,尽管它实际上无法将它们应用到本地备份。)

    如果您确实决定走这条路,我强烈建议您也考虑为rsnapshot您提供 GFS 备份,而无需使用太多额外的磁盘空间。

  2. 您可以使用tarpax或其他一些归档工具。这将为您提供压缩图像

    ssh root@pi 'cd / && tar --exclude '/proc/' --exclude '/sys/' -czvf - .' > /path/to/backup.pi.$(date +'%Y%m%d').tgz
    
  3. 您可以使用其他选项,例如duplicity.我没有认真使用过它,所以我认为我没有资格举例说明如何使用它。


获得文件系统备份后,您可能还希望能够恢复最小的启动映像。

在我的 Pi 上,我们有这样的结构(我忽略了分区 3;您可能有一个,但它可能已作为文件系统的一部分进行备份):

fdisk -l /dev/mmcblk0
Disk /dev/mmcblk0: 29.7 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: 0x42913321

Device         Boot   Start      End  Sectors  Size Id Type
/dev/mmcblk0p1         8192   137215   129024   63M  c W95 FAT32 (LBA)
/dev/mmcblk0p2       137216  8388607  8251392    4G 83 Linux

您需要从磁盘开头到分区 1 ( /boot) 开头的所有内容。在此特定显示中,扇区采用 512 字节块,但我们需要读取 4KiB 块(SSD 块大小),因此我们将所有数字除以 8:

# Copy the boot segment from the beginning of the disk
dd bs=4k count=$((8192/8)) if=/dev/mmcblk0 | gzip >img0.gz

/dev/mmbclk0您可以使用如下命令将此保存的段恢复到 SSD 卡。请注意,它会不可挽回地覆盖目标设备,因此在使用之前请多次检查,并且不要盲目复制这个例子:

zcat img0.gz | dd bs=4k iflag=fullblock of=/dev/mmcblk0
partprobe /dev/mmcblk0

答案3

这是我的(简单的)基于 dd 的 Raspberry Pi SD 卡映像备份脚本(要在另一台机器上运行!):

#!/bin/sh

in=$1
out=$2

echo "Copying . . ."
time -p dd if=$in of=$out bs=4M status=progress

echo "Checking Source . . ."
set $(md5sum $in)
sum_in=$1
echo $sum_in

echo "Checking Destination . . ."
set $(md5sum $out)
sum_out=$1
echo $sum_out

if [ $sum_in = $sum_out ]
then
    echo "Compressing . . . "
    xz -6 --threads=2 --verbose $out && echo "DONE"
else
    echo "Checksum mismatch!"
fi

将其另存为例如 sd-verify-compress。

使其可执行:

$ chmod +x sd-verify-compress

运行它(例如):

$ ./sd-verify-compress /dev/sdx bookworm64

使用 lsblk 查找使用什么来代替 /dev/sdx:

$ lsblk -fmp

这是它创建的文件:

-rw-r--r-- 1 pi pi 2.8G Nov 13 12:38 bookworm64.xz

我的SD卡是32GB的。

相关内容