我想备份我的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