是否可以即时挂载gzip压缩的dd映像?


66

我喜欢第一次备份系统时创建映像备份。第一次之后,我使用rsync进行增量备份。

我通常的映像备份如下:

安装并清零空白空间:

dd if=/dev/zero of=temp.dd bs=1M

rm temp.dd

压缩驱动器时将其挂载并dd

dd if=/dev/hda conv=sync,noerror bs=64K | gzip -c > /mnt/sda1/hda.ddimg.gz

为了使系统恢复正常,我通常会

gunzip -c /mnt/sda1/hda.img.gz | dd of=/dev/hda conv=sync,noerror bs=64K

这确实很简单,可以节省“整个驱动器”,但实际上只是节省了使用空间。

这是问题所在。可以说我执行了上述操作,但是没有在干净的系统上执行此操作,并且没有使rsync备份足够快地进行,并且映像上有我要访问的文件。假设我没有存储空间,实际上没有将图像解压缩并dd到驱动器上,但想挂载该图像以从中取出单个文件。...这可能吗?

通常,不会压缩dd映像,这将允许您使用-o loop... 挂载映像,但这不是我的情况...

关于动态安装压缩img的任何建议?

会使用AVFS来“挂载” gz文件,然后挂载内部dd.img工作吗(我认为不是...但是需要验证...)?


您应该使用SquashFS这种东西。它还会删除重复文件的重复数据。
Avio 2012年

这位研究员似乎在做您要问的事情:blogs.gnome.org/muelli/2012/10/…–
Joshua

我支持Avio的建议。squashfs唯一不存档的就是ACL。它存档了xattrs,selinux属性等。如果您不使用acls,那么squashfs是进行IMHO的方式。最近,我不得不存档“以防万一”一些已经迁移到新存储中的旧驱动器,而squashfs非常适合这项工作。
库巴·奥伯

Answers:


66

这取决于磁盘映像是完整磁盘映像还是仅仅是分区。

清洗隔板

如果磁盘处于良好的工作状态,则用零清洗磁盘上的空白空间将获得更好的压缩效果。如果磁盘出现故障,请跳过此步骤。

如果要映像整个磁盘,则需要清洗磁盘上的每个分区。

注意:请小心,您要将设置为已安装分区中of文件,而不是分区本身!

mkdir image_source
sudo mount /dev/sda1 image_source
dd if=/dev/zero of=image_source/wash.tmp bs=4M
rm image_source/wash.tmp
sudo umount image_source

制作分区图像

mkdir image
sudo dd if=/dev/sda1 of=image/sda1_backup.img bs=4M

其中sda,设备的名称1是分区号。如果要映像其他设备或分区,请针对您的系统进行相应调整。

制作整个磁盘映像

mkdir image
sudo dd if=/dev/sda of=image/sda_backup.img bs=4M

sda设备的名称在哪里。如果要对其他设备进行映像,请针对您的系统进行相应调整。

压缩

制作一个“ squashfs”图像,其中包含完整的未压缩图像。

sudo apt-get install squashfs-tools
mksquashfs image squash.img

流压缩

为了避免使单独的临时文件成为磁盘的全部大小,可以将其流式传输为squashfs映像。

mkdir empty-dir
mksquashfs empty-dir squash.img -p 'sda_backup.img f 444 root root dd if=/dev/sda bs=4M'

挂载压缩分区映像

首先挂载squashfs映像,然后挂载存储在已挂载的squashfs映像中的分区映像。

mkdir squash_mount
sudo mount squash.img squash_mount

现在,您已经安装了压缩映像,请安装映像本身(即squashfs映像内部)

mkdir compressed_image
sudo mount squash_mount/sda1_backup.img compressed_image

现在,您的映像已安装在下compressed_image

编辑:如果您现在只想将磁盘映像还原到分区上(而不是将其挂载以浏览/读取内容),只需dd将映像squash_mount/sda1_backup.img放在目标位置即可,而不是这样做mount

挂载压缩的完整磁盘映像

这要求您使用一个名为kpartx的软件包。kpartx允许您将单个分区安装在完整的磁盘映像中。

sudo apt-get install kpartx

首先,挂载包含完整磁盘映像的压缩分区

mkdir compressed_image
sudo mount squash.img compressed_image

现在,您需要为整个磁盘映像中的每个分区创建设备:

sudo kpartx -a compressed_image/sda_backup.img

这将为整个磁盘映像中的分区创建设备,/dev/mapper/loopNpP其中N是为回送设备分配的编号,P是分区编号。例如:/dev/mapper/loop0p1

现在,您可以在整个磁盘映像中挂载各个分区:

mkdir fulldisk_part1
sudo mount /dev/mapper/loop0p1 fulldisk_part1

这个问题(用squashfs代替gzip)很有意思。我非常不熟悉squashfs工具...您可以像使用gzip分区一样通过管道输出dd的输出来动态创建一个南瓜分区吗?压缩率是多少(gzip可以/很好,特别是考虑到我要清除“带零的空空间”的事实)?
g19fanatic

您如何将图像dd返回硬盘?
g19fanatic

2
@ g19fanatic未压缩的磁盘映像位于squashfs映像“内部”。装入squashfs映像,然后将其中的映像dd到目标磁盘。
doug65536

@ g19fanatic压缩效果非常好(在我的情况下,与gzip几乎一样)。mksquashfs也很快,它是并行的。在我的990x(6核)上,它实际上受目标磁盘写入速度(大约100MB /秒)的限制。
doug65536

3
@ g19fanatic您可以使用-p-pf标志将其流式传输为squashfs,以将其传递给伪文件。伪文件可用于制作设备节点,而如果没有root,则无法创建设备节点(用于在构建过程中构建映像)或将某些命令的输出流式传输到映像中。docs(/usr/share/doc/squashfs-tools/examples/pseudo-file.example在Debian / Ubuntu上)上给出的示例之一是input f 444 root root dd if=/dev/sda1 bs=1024 count=10将磁盘映像中的前10K复制到squashfs映像中名为“ input”的文件中。
布莱恩·坎贝尔2014年

15

如果图像是只读的,则还可以使用nbdkit手册页)及其xz插件(xz应该比gzip提供更好的压缩和随机访问时间)。

创建压缩的分区映像

dd if=/dev/sda1 bs=16M | xz -9 --block-size=16MiB - > sda1.img.xz

--block-size16 MiB 的选项应提供良好的随机访问性能。

注意:您可以使用替代的xz压缩程序,例如提供并行压缩的pixz,只需确保将输出分成多个小块即可,否则nbdkit必须解压缩大量数据。例如,自2015年9月起,pxz不支持此功能。

与nbdkit一起使用

nbdkit --no-fork --user nobody --group nobody -i 127.0.0.1 \
       xz file=sda1.img.xz

连接到NBD服务器

nbd-client 127.0.0.1 10809 /dev/nbd0 -nofork

挂载为只读

mount -o ro /dev/nbd0 sda1

完成后

umount /dev/nbd0
nbd-client -d /dev/nbd0

通过按+ (或使用kill)停止nbdkitCtrlC


15

尝试 archivemount

root@srv1:/backup# archivemount windows-2003-S.gz /target/
Unrecognized archive format
root@srv1:/backup# archivemount -o formatraw windows-2003-S.gz /target/
Calculating uncompressed file size. Please wait.
root@srv1:/backup# ls /target/
data
root@srv1:/backup# file /target/data
/target/data: DOS/MBR boot sector; partition 1 : ID=0x7, start-CHS (0x0,1,1), end-CHS (0x3ff,254,63), startsector 63, 58717512 sectors, extended partition table (last)

archivemount是适用于Unix变体(包括Linux)的基于FUSE的文件系统。其目的是将归档文件(即tar,tar.gz等)挂载到挂载点,在该挂载点可以与任何其他文件系统一样读取或写入归档文件。这使得可以访问归档文件的内容,而压缩文件的内容对于其他程序而言是透明的,而无需对其进行解压缩。

http://linuxaria.com/howto/how-to-mounts-an-archive-for-access-as-a-file-system

装入归档文件后,您可以使用其内容,例如常规文件。也许获取分区表,或使用qemu工具转换,挂载映像。

squashfs可用于从映像启动,但备份则非常复杂。


完善!到目前为止,这是最简单,最优雅的解决方案。我不知道为什么这里没有选票。
2015年

我认为这是因为,如果在具有archivemount的文件夹(例如/ mnt /)上安装disk.img.gz之类的存档,则会得到一个/mnt/disk.img文件,然后必须将其安装在其他位置。相反,问题是希望某个东西能够在一个步骤中同时解包(而archivemount似乎能够在.tar.gz上做到这一点,但不能在gzip压缩的原始图像上做到这一点)。
p91paul 2015年

2
这个答案也很有趣。我相信南瓜会获得更多的爱,因为它具有更多的意识。我立即认出了这个名字,但从未听说过archivemount。我也必须试一试!
g19fanatic 2015年

2
archivemount不允许挂载命令创建的映像dd if=/dev/hda conv=sync,noerror bs=64K | gzip -c > /mnt/sda1/hda.ddimg.gz
Sergei,

3
同意-撰写本文时,archivemount支持zip压缩的tar归档文件,但不支持gzip压缩的文件。
mwfearnley '17


8

并不是的。如果不先对整个文件进行解压缩,就无法真正在压缩文件中寻找特定的块,这使得很难将压缩图像用作块设备。

您可以使用诸如dumprestore(或tar,实际上)之类的东西,它们全部使用流格式...因此您可以通过有效扫描未压缩的流来访问单个文件。这意味着,如果所需文件位于压缩归档文件的末尾,则可能需要等待很长时间,但这并不要求您实际将所有文件解压缩到磁盘上。

使用tar备份可能看起来有点老土,但你得到了很多的flexability的。


1
问题在于,我什至不知道感兴趣的文件是否实际上在此压缩备份上。内存中的结构,提供结构的简单视图,并允许您“拾取”文件(现在知道文件存在的位置)以提取?这是一个非常特殊的规范...但是如果存在的话,我可以看到很多类似的用途。
g19fanatic

1
如果不是这样,您能否指出一些有关如何从gz图像中提取结构的说明?我将能够创建这样的程序(用于生活的程序...),但是对解压缩图像数据和不同文件系统的细节一无所知。
g19fanatic

我怀疑构建自己的工具将是一个比您真正想承担的更大的项目。但是...假设您有一个ext [234]文件系统,我建议您使用e2fsprogs软件包,或者使用诸如fuse-ext2之类的软件包。两者都提供了用于与ext [234]文件系统进行交互的用户空间工具。
larsks 2012年

还要注意,您所拥有的似乎不是文件系统映像,而是整个磁盘映像,这意味着您首先必须解析出分区表并找到适当的分区。
larsks 2012年

我在上述问题中输入了错误的字,并将予以解决。我通常会做一个基于分区的dd映像,并保存分区表的副本​​。我曾经做过完整的磁盘复制,但是讨厌需要挂载选项才能到达正确的位置。
g19fanatic 2012年

3

克里斯蒂安·丘皮图(Cristian Ciupitu)回答的另一个附录:

如果nbdkit用于装载完整的磁盘映像(相对于分区映像),则在连接到NBD服务器时可能需要指定块大小(磁盘的扇区大小),因为它默认为1024字节。要使用512字节代替:

nbd-client 127.0.0.1 /dev/nbd0 -b 512 -n

之后,磁盘将显示为/dev/nbd0,并且您应该能够使用来查看分区表fdisk -l。但是,分区尚未安装-使用kpartx(来自doug65536的答案)为分区创建设备,例如:

kpartx -arv /dev/nbd0

最后,分区将显示在中/dev/mapper/,您可以照常安装它们。确保使用只读模式(-o ro),因为xz插件仅支持读取:

mount -o ro /dev/mapper/nbd0p3 /mnt
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.