是否可以动态安装 gzip 压缩的 dd 图像?

g19*_*tic 83 command-line backup compression mount dd

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

我平时的镜像备份如下:

安装并清零空白空间:

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

rm temp.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 工作(我不这么认为......但需要验证......)?

dou*_*536 82

这取决于磁盘映像是完整磁盘映像还是只是一个分区。

清洗隔板

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

如果您正在对整个磁盘进行映像,那么您将需要清洗磁盘上的每个分区。

注意:小心,您想将 设置为挂载分区中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
Run Code Online (Sandbox Code Playgroud)

制作分区图像

mkdir image
sudo dd if=/dev/sda1 of=image/sda1_backup.img bs=4M
Run Code Online (Sandbox Code Playgroud)

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

制作整个磁盘映像

mkdir image
sudo dd if=/dev/sda of=image/sda_backup.img bs=4M
Run Code Online (Sandbox Code Playgroud)

sda设备名称在哪里。如果您想对不同的设备进行映像,请根据您的系统进行相应调整。

压缩

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

sudo apt-get install squashfs-tools
mksquashfs image squash.img
Run Code Online (Sandbox Code Playgroud)

流压缩

为了避免将单独的临时文件制作成磁盘的完整大小,您可以流式传输到一个 squashfs 映像。

mkdir empty-dir
mksquashfs empty-dir squash.img -p 'sda_backup.img f 444 root root dd if=/dev/sda bs=4M'
Run Code Online (Sandbox Code Playgroud)

挂载压缩分区映像

先挂载squashfs镜像,然后挂载挂载的squashfs镜像中存储的分区镜像。

mkdir squash_mount
sudo mount squash.img squash_mount
Run Code Online (Sandbox Code Playgroud)

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

mkdir compressed_image
sudo mount squash_mount/sda1_backup.img compressed_image
Run Code Online (Sandbox Code Playgroud)

现在您的图像安装在compressed_image.

编辑:如果此时您只想将磁盘映像还原到分区上(而不是安装它以浏览/读取内容),只需dd将映像squash_mount/sda1_backup.img放在目标上,而不是执行mount.

挂载压缩的全盘映像

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

sudo apt-get install kpartx
Run Code Online (Sandbox Code Playgroud)

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

mkdir compressed_image
sudo mount squash.img compressed_image
Run Code Online (Sandbox Code Playgroud)

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

sudo kpartx -a compressed_image/sda_backup.img
Run Code Online (Sandbox Code Playgroud)

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

现在您可以在完整磁盘映像中安装各个分区:

mkdir fulldisk_part1
sudo mount /dev/mapper/loop0p1 fulldisk_part1
Run Code Online (Sandbox Code Playgroud)

  • @g19fanatic 您可以使用 `-p` 或 `-pf` 标志将伪文件传递给 squashfs。伪文件可用于制作设备节点等事情,否则您无法在没有 root 的情况下完成(用于构建图像作为构建过程的一部分)或用于将某些命令的输出流式传输到图像中。文档中给出的示例之一(Debian/Ubuntu 上的`/usr/share/doc/squashfs-tools/examples/pseudo-file.example`)是`input f 444 root root dd if=/dev/sda1 bs= 1024 count=10` 将磁盘映像中的前 10K 复制到 squashfs 映像中名为“input”的文件中。 (3认同)
  • @g19fanatic 未压缩的磁盘映像位于 squashfs 映像的“内部”。您挂载 squashfs 映像,然后将其中的映像 dd 到目标磁盘。 (2认同)

eri*_*eri 28

尝试 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)
Run Code Online (Sandbox Code Playgroud)

archivemount 是一个基于 FUSE 的文件系统,适用于 Unix 变体,包括 Linux。它的目的是将档案(即 tar、tar.gz 等)挂载到一个挂载点,在那里它可以像任何其他文件系统一样读取或写入。这使得访问可能被压缩的存档内容对其他程序透明,而无需解压缩它们。

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

挂载存档后,您可以像常规文件一样使用它的内容。也许获取分区表,或使用 qemu 工具转换、挂载映像。

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

  • archivemount 不允许挂载由命令 `dd if=/dev/hda conv=sync,noerror bs=64K | 创建的映像 gzip -c > /mnt/sda1/hda.ddimg.gz` (4认同)
  • 同意 - 在撰写本文时,archivemount 支持 gzip 压缩的 tar 存档,但不支持普通 gzipped 文件。 (3认同)
  • 这个答案也很有趣。我相信 squashfs 得到更多的爱,因为它有更多的意识。我立刻认出了这个名字,但从未听说过存档挂载。我也得试一试! (2认同)

Cri*_*itu 16

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

创建压缩分区映像

dd if=/dev/sda1 bs=16M | xz -9 --block-size=16MiB - > sda1.img.xz
Run Code Online (Sandbox Code Playgroud)

--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
Run Code Online (Sandbox Code Playgroud)

连接到 NBD 服务器

nbd-client 127.0.0.1 10809 /dev/nbd0 -nofork
Run Code Online (Sandbox Code Playgroud)

以只读方式挂载

mount -o ro /dev/nbd0 sda1
Run Code Online (Sandbox Code Playgroud)

完成后

umount /dev/nbd0
nbd-client -d /dev/nbd0
Run Code Online (Sandbox Code Playgroud)

按+ (或使用kill)停止nbdkitCtrlC


小智 11

这个答案补充了Cristian Ciupitu 的答案如果使用具有合理块大小的 xz 压缩,则可以使用guestfish或其他libguestfs工具访问磁盘映像,如下所示:

nbdkit xz file=disk.img.xz --run 'guestfish --format=raw -a $nbd -i'
Run Code Online (Sandbox Code Playgroud)

更新:由于 xz 不再是插件,而是变成了过滤器,命令现在是:

nbdkit file disk.img.xz --filter xz --run 'guestfish --format=raw -a $nbd -i'
Run Code Online (Sandbox Code Playgroud)


lar*_*sks 9

并不真地。如果不先解压缩整个文件,就无法真正找到压缩文件中的特定块,这使得将压缩图像用作块设备变得困难。

您可以使用dumprestore(或tar,真的)之类的东西,所有这些都使用流格式……因此您可以通过有效地扫描未压缩的流来访问单个文件。这意味着如果您想要的文件位于压缩存档的末尾,您可能需要等待很长时间,但它不需要您将所有内容实际解压缩到磁盘上。

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