我通过 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
.您还应该注意,它不会包含非文件系统启动映像或分区表;我将在本答案的末尾提供单独支持这一点的建议。
您可以使用
rsync
。这将为您提供备份介质上文件系统的副本,而不是单个映像文件。rsync -avzHP --exclude '/proc/' --exclude '/sys/' root@pi:/ /backup/pi.$(date +'%Y%m%d')
如果您的本地帐户不是 root,您可能需要包含
--fake-super
备份和恢复选项。 (它保存远程所有权详细信息,尽管它实际上无法将它们应用到本地备份。)如果您确实决定走这条路,我强烈建议您也考虑为
rsnapshot
您提供 GFS 备份,而无需使用太多额外的磁盘空间。您可以使用
tar
、pax
或其他一些归档工具。这将为您提供压缩图像ssh root@pi 'cd / && tar --exclude '/proc/' --exclude '/sys/' -czvf - .' > /path/to/backup.pi.$(date +'%Y%m%d').tgz
您可以使用其他选项,例如
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的。