如何只备份使用过的数据而不备份空白区域的img?

如何只备份使用过的数据而不备份空白区域的img?

我想备份我的Raspbian系统文件,以防它损坏并永远消失。但是SD卡的内存是32G,通过使用传统方式dd通常最终会创建一个具有32G存储空间的img。但实际上只有4G存储空间已经用了,另外28G是空白的。而使用win32imager工具,结果是一样的。

我的问题是:是否可以只备份使用过的数据的img,以便img可以更小,这样我只需要更小的空间来保存img?

我在网上看到有人声称这是可能的,这是脚本:

#!/bin/sh
sudo dd if=/dev/zero of=raspberrypi.img bs=1MB count=2500
sudo parted raspberrypi.img --script -- mklabel msdos
sudo parted raspberrypi.img --script -- mkpart primary fat32 8192s 122879s
sudo parted raspberrypi.img --script -- mkpart primary ext4 122880s -1

loopdevice=`sudo losetup -f --show raspberrypi.img`
device=`sudo kpartx -va $loopdevice | sed -E 's/.*(loop[0-9])p.*/\1/g' | head -1`
device="/dev/mapper/${device}"
partBoot="${device}p1"
partRoot="${device}p2"
sudo mkfs.vfat $partBoot
sudo mkfs.ext4 $partRoot
sudo mount -t vfat $partBoot /media
sudo cp -rfp /boot/* /media/
sudo umount /media
sudo mount -t ext4 $partRoot /media/
cd /media
sudo dump -0uaf - / | sudo restore -rf -
cd
sudo umount /media
sudo kpartx -d $loopdevice
sudo losetup -d $loopdevice

不幸的是,这个脚本对我不起作用,因为无法完全创建 img 并且该脚本完成时出现错误。

有人有什么想法吗?非常感谢!

真挚地,

海伦

答案1

使用系统一段时间后,您需要准确分析这 4 GB 存储在 SD 卡上的位置,因此仅从dd设备的开头进行操作是有风险的。

我建议通过压缩实用程序传输图像。即使没有内容的大空间也几乎不会占用压缩图像中的空间:

dd if=/dev/sdxxx conv=sync,noerror bs=64K | gzip -c > sdxxx.image.gz

答案2

除非您可以接受shrink filesystem -> backup -> grow filesystem每次执行循环(假设文件系统支持收缩和增长,并且足够强大,可以承受这样的重复循环而不会中断),否则您不应该考虑块级备份(即分割由 dd 创建的映像)但文件系统级备份(例如文件系统由partclone等创建的图像,它将跳过a中未使用的块文件系统感知方式)或基于文件的备份(例如tar、rsync...)。

答案3

使用 Ghost(付费)或 Clonezilla(免费且免费)等系统映像工具。

要克隆 Pi 映像,您需要将 SD 卡放入计算机中,启动 clonezilla,然后将整个 SD 卡的映像转储到硬盘驱动器上某处的文件中。恢复是相反的过程。

答案4

答案是肯定的。

您必须了解要备份的确切数据。假设您的 32G 存储磁盘中有 4G 数据。

使用:seek and count与 dd 一起使用。

从驱动器复制 4G

dd=if/dev/sdb1 of=mybackup.iso bs=1M count=4096 conv=noerror,sync

上面将从分区 /dev/sdb1 复制 4G。但是您可以决定将数据从 xMB 复制到 xGB

dd=if/dev/sdb1 of=mybackup.iso bs=1M seek=xMB count=x noerror,sync

我们使用seek前进,所以seek=2G会从2G开始复制而不是从头开始,count=x,是需要复制的数据量,所以count=4096会复制4096 x 1MB = 4G

不要忘记使用来lsblk显示您的区块

NAME   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
sda      8:0    0  37.3G  0 disk
|-sda1   8:1    0  19.5G  0 part /
|-sda2   8:2    0  17.2G  0 part /home
`-sda3   8:3    0   511M  0 part [SWAP]

fdisk /dev/sdb
Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *        4096    40962047    20478976   83  Linux
/dev/sda2        40962048    77111295    18074624   83  Linux
/dev/sda3        77111296    78157823      523264   82  Linux swap / Solaris

相关内容