关于重复 Q 的注释

关于重复 Q 的注释

如果我制作一个磁盘映像,压缩它与 gzip/xz/etc 一起使用,有没有办法直接挂载它而不先解压缩它?

说我用过

sudo dd if=/dev/sdc1 | gzip -9 > image1.dd.gz

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

或者我用过

sudo dd if=/dev/sdc | gzip -9 > wholedisk.dd.gz

并且磁盘有多个分区,这会使事情变得更加困难吗?

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

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

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


关于重复 Q 的注释

当前建议的重复项

不使用压缩, 和不是重复的

mount不会自行挂载压缩图像。

答案1

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

创建磁盘映像

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

dd if=/dev/sda1 of=/tmp/sda1.img bs=4M

使用 squashfs 压缩镜像

安装squashfs

apt-get install squashfs-tools

压缩图像:

mksquashfs /tmp/sda1.img /tmp/sda1.squash.img

或者流式压缩(不需要临时 dd 文件)

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

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

  • empty-dir- “源”目录。基本上在我们的例子中,只是一个空目录来满足 mksquashfs 的输入参数格式
  • 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 命令

装载映像Mount the image

首先挂载squashfs映像:

mkdir /mnt/squash
mount /tmp/sda1.squash.img /mnt/squash

这将显示未压缩的磁盘映像供您挂载:

mkdir /mnt/sda1
mount /mnt/squash/sda1.img /mnt/sda1

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

答案2

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

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

1 - 安装 nbdkit 和客户端

apt install nbdkit nbd-client

2(仅供测试时可选)- 创建演示“dd”样式文件 - 一个带有 ext 文件系统的 50M 空文件并对其进行压缩

fallocate -l 50M 50m
mkfs.ext3 -v 50m

然后使用 gzip 或 xz 压缩

gzip -vk9 50m
xz -v9k 50m

注意: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

或对于 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

显然,较新版本的 ndbkit 可以指定--filter=xz而不是指定整个插件路径:

nbdkit -v --no-fork -i 127.0.0.1  --filter=xz file=~/Downloads/50m.xz
  • 告诉--no-fork服务器“不要分叉到后台”因此查看可能的错误信息并使用 CTRL-C 将其终止会更容易一些。

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

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

sudo nbd-client -nofork 127.0.0.1 10809 /dev/nbd0

-nofork与上面的类似,-no-fork但我可以不是kill <pid>使用 CTRL-C、或终止客户端sudo kill <pid>。使用 CTRL-C 终止服务器会同时停止服务器和客户端。

5 – 观察/dev/nbd0现在与未压缩的图像相同

$ sudo diff -s /dev/nbd0 ~/Downloads/50m
Files /dev/nbd0 and /home/user/Downloads/50m are identical

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

谢谢Cristian Ciupitu 谈 Unix 和 Linux,尽管需要进行更多的挖掘才能找到插件并让一切运行起来。

相关内容