是否可以动态挂载 gzip 压缩的 dd 映像?

是否可以动态挂载 gzip 压缩的 dd 映像?

我喜欢在第一次备份系统时创建映像备份。第一次之后我习惯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
    
  • 为了让系统恢复正常,我通常会这样做

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

这非常简单,允许我保存“整个驱动器”,但实际上只是节省已用空间。

问题就在这里。假设我执行了上述操作,但不是在干净的系统上进行的,并且rsync备份速度不够快,并且图像上有我想要访问的文件。假设我没有存储空间来实际解压缩并将dd映像保存到驱动器,但想要安装映像以从中获取单个文件......这可能吗?

通常情况下,人们不会压缩图像dd,这将允许您只使用...安装图像,-o loop但这不是我的情况...

对于即时安装压缩的 img 有什么建议吗?

会使用AVFS“安装”gz 文件然后安装内部 dd.img 工作(我不这么认为......但需要验证......)?

答案1

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

清洗隔板

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

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

警告:小心,你想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.

挂载压缩的完整磁盘映像

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

sudo apt-get install kpartx
  • 首先,安装包含完整磁盘映像的压缩分区

    mkdir compressed_image
    sudo mount squash.img compressed_image
    
  • 现在您需要为完整磁盘映像中的每个分区创建设备:

    sudo kpartx -a compressed_image/sda_backup.img
    

    这将为完整磁盘映像中的分区创建设备,其中/dev/mapper/loopNpPN是分配给环回设备的编号,并且P是分区号,例如 /dev/mapper/loop0p1。你可以找到这个号码N在 的输出中losetup --list。最近创建的环回设备应该具有最大的N 数字。

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

    mkdir fulldisk_part1
    sudo mount /dev/mapper/loop0p1 fulldisk_part1
    

答案2

尝试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 是一个基于 FUSE 的文件系统,适用于 Unix 变体,包括 Linux。其目的是将存档(即 tar、tar.gz 等)挂载到一个挂载点,在该挂载点上可以像任何其他文件系统一样对其进行读取或写入。这使得访问可能被压缩的存档内容对于其他程序来说是透明的,而无需解压缩它们。

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

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

squashfs 对于从映像启动很有用,但对于备份来说非常复杂。

答案3

如果图像是只读你也可以使用NBD套件手册页)及其xz过滤器(xz 应该提供比 gzip 更好的压缩和随机访问时间)。如果你需要暂时地写访问,奶牛(写入时复制)过滤器可能有用。

创建压缩分区映像

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

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

注意:您可以使用替代的 xz 压缩程序,例如像素它提供并行压缩,只需确保它将输出分成多个小块,否则NBD套件必须解压大量数据。例如截至 2015 年 9 月,像素不支持这个。

与 nbdkit 一起使用

nbdkit --no-fork --user nobody --group nobody -i 127.0.0.1 \
       --filter 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

停止NBD套件通过按Ctrl+ C(或使用)。

答案4

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

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

用于tar备份可能看起来有点过时,但您可以获得很大的灵活性。

相关内容