如何挂载压缩的磁盘映像?

Xen*_*050 13 partitioning backup mount dd disk-image

如果我制作一个磁盘映像并用 gzip/xz/etc压缩它,有没有办法直接安装它而无需先解压缩它?

说我用过

sudo dd if=/dev/sdc1 | gzip -9 > image1.dd.gz
Run Code Online (Sandbox Code Playgroud)

如何在不先创建未压缩副本的情况下安装原始图像?

或者我用过

sudo dd if=/dev/sdc | gzip -9 > wholedisk.dd.gz
Run Code Online (Sandbox Code Playgroud)

并且磁盘有多个分区,这会使其变得更难吗?

使用整个磁盘的未压缩映像,然后使用它的标志kpartx或更新版本losetup-P标志应该为每个分区创建一个循环。

但是有没有办法挂载/丢失/读取压缩图像?

如果它不适用于 gzip/xz,是否有任何压缩方法可以使用?


关于重复 Q 的注意事项

当前建议的副本

不使用压缩,并且不是重复的

mount 不会自行安装压缩图像。

Ebo*_*bob 11

您可以使用squashfs压缩磁盘映像然后挂载它们。

创建磁盘映像

如果您还没有磁盘映像,请使用dd创建一个:

dd if=/dev/sda1 of=/tmp/sda1.img bs=4M
Run Code Online (Sandbox Code Playgroud)

使用 squashfs 压缩图像

安装squashfs

apt-get install squashfs-tools
Run Code Online (Sandbox Code Playgroud)

压缩图像:

mksquashfs /tmp/sda1.img /tmp/sda1.squash.img
Run Code Online (Sandbox Code Playgroud)

或 Stream 压缩(不需要临时 dd 文件)

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)

UbuntuForums.org 上terminator14 的赞美。定义/解释:

  • empty-dir- “源”目录。基本上在我们的例子中,只是一个空目录来满足 mksquashfs 的输入 arg 格式
  • squash.img - 输出 squashfs 文件的目的地和文件名
  • sda_backup.img - squashfs 文件中 dd 备份的名称
  • f - 指定 sda_backup.img 是常规文件(与目录、块设备或字符设备相对)
  • 444 - squashfs 映像中 sda_backup.img 文件的权限
  • root root- squashfs 映像中 sda_backup.img 文件的 UID 和 GID。可以由十进制数或名称指定
  • dd if=/dev/sda bs=4M - dd 命令用于读取我们要备份的设备

挂载镜像

首先挂载squashfs镜像:

mkdir /mnt/squash
mount /tmp/sda1.squash.img /mnt/squash
Run Code Online (Sandbox Code Playgroud)

这将显示未压缩的磁盘映像供您安装:

mkdir /mnt/sda1
mount /mnt/squash/sda1.img /mnt/sda1
Run Code Online (Sandbox Code Playgroud)

或者,如果它是一个完整的驱动器映像(分区),你可以使用losetup的DD图像附加到一个循环设备(可能是可选),然后kpartx -apartprobe找到与分区分开,单独的设备,甚至vgscan/vgchange -ay如果有LVM。

  • 我添加了一些即时的 squashfs 信息,以避免需要临时的普通 dd 文件。squashfs 很好的答案,只是没有做更适合管道的 xz/gz 格式 (2认同)

Xen*_*050 7

我能够让 NBD 服务器“提供”未压缩版本的 .gz 或 .xz 文件。我不确定它是否必须经常读取整个压缩文件(到目前为止仅使用 ram 中的小文件进行了测试),但至少它无需提取整个未压缩副本即可工作。

“即时”查看 gz / xz 压缩的 dd 图像

  1. 安装 nbdkit 和客户端

    apt install nbdkit nbd-client
    
    Run Code Online (Sandbox Code Playgroud)
  2. 创建演示“dd”样式文件 - 一个空的 50M 文件,带有 ext 文件系统并压缩它(仅用于测试可选)

    fallocate -l 50M 50m
    mkfs.ext3 -v 50m
    
    Run Code Online (Sandbox Code Playgroud)

    然后用 gzip 或 xz 压缩

    gzip -vk9 50m
    xz -v9k 50m
    
    Run Code Online (Sandbox Code Playgroud)

    注意: 一个xz选项--block-size=16MiB应该提供更好的随机访问性能,但以较少的压缩为代价(可能是 1%?)。请参阅nbdkit 的 xz 插件说明

  3. 在压缩图像上运行服务器

    nbdkit -v --no-fork -i 127.0.0.1 /usr/lib/i386-linux-gnu/nbdkit/plugins/nbdkit-gzip-plugin.so file=~/Downloads/50m.gz
    
    Run Code Online (Sandbox Code Playgroud)

    或 xz

    nbdkit -v --no-fork -i 127.0.0.1 /usr/lib/i386-linux-gnu/nbdkit/plugins/nbdkit-xz-plugin.so file=~/Downloads/50m.xz
    
    Run Code Online (Sandbox Code Playgroud)

    --no-fork告诉服务器“不进叉的背景”等等看可能的错误消息和与CTRL-C杀死它是一个更容易一些。

    -v 可能/将显示太多状态消息,尤其是在阅读时。

  4. 运行客户端(在另一个终端/窗口中)

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

    -nofork类似于-no-fork以上,但我可以使用CTRL-C杀掉客户端,kill <pid>sudo kill <pid>。用 CTRL-C 结束服务器会停止服务器和客户端。

  5. 观察/dev/nbd0现在与 UN-COMPRESSED 图像相同

    $ sudo diff -s /dev/nbd0 ~/Downloads/50m
    Files /dev/nbd0 and /home/user/Downloads/50m are identical
    
    Run Code Online (Sandbox Code Playgroud)

    /dev/nbd0现在可以像未压缩的图像一样使用;dd使用kpartxpartprobevgscan/vgchange等安装、读取/复制,或使用、、/等!

感谢Unix 和 Linux 上的 Cristian Ciupitu,尽管找到插件并将所有内容整合在一起需要更多的挖掘。