如果我制作一个磁盘映像,压缩它与 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 的注释
当前建议的重复项
- 从整个磁盘(设备)的映像中挂载单个分区,同时也是一个非常有用的 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 -a
或partprobe
查找并将分区分离到单独的设备,或者甚至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
/等!partprobe
vgscan
vgchange
谢谢Cristian Ciupitu 谈 Unix 和 Linux,尽管需要进行更多的挖掘才能找到插件并让一切运行起来。