我有一个 64 GB 的 Linux 磁盘映像,其中各个分区有约 50 GB 的未使用空间。该文件很稀疏,因此仅占用约 14 GB 的磁盘空间。
但是如果我dd
写入图像,它会写入完整的 64 GB,这需要相当长的时间。
有什么方法可以dd if=os.img of=/dev/sdb
对这幅图像做等效的事情,而不必写入 50 GB 的零?
是否有任何工具足够智能来做到这一点,即能够感知 EXT4 文件系统的成像工具?
答案1
dd
可以处理这个问题。您需要添加conv=sparse
到命令行。
从手册页中:
try to seek rather than write the output for NUL input blocks
答案2
我会考虑使用mksquashfs
只读副本来代替dd
整个卷。这还可以压缩和删除重复数据。
请注意,您必须评估 - 它的可用性取决于您的具体使用情况。
答案3
这很尴尬,因为您有一个完整的磁盘映像,但您可以:
- 使用您选择的分区程序列出分区
os.img
并在其上创建它们/dev/sdb
- 使用 e2image 恢复每个分区。例如,
e2image -aro 1048576 os.img /dev/sdb1
如果有 MBR,则此方法不处理 MBR。/bin/dd if=os.img of=/dev/sdb bs=512 count=1
将会这样做。
注意:linux.die.net 上的 e2image 手册页已过期。从 bionic 安装:
SYNOPSIS
e2image [ -r|Q ] [ -f ] device image-file
e2image -I device image-file
e2image -ra [ -cfnp ] [ -o src_offset ] [ -O dest_offset ] src_fs [ dest_fs ]
答案4
您可以使用bmap工具正是出于这个目的。bmaptool
与相比,它有几个优势dd
,请参阅其网页。您可以分两步运行它:
- 从文件创建 bmap;bmap 列出了已被占用的块。
- 使用生成的 bmap 写入文件。
# Create bmap
bmaptool create -o os.img.bmap os.img
# Burn to disk (equivalent to dd if=os.img of=/dev/sdb)
bmaptool copy --bmap os.img.bmap /dev/sdb
我现在正在使用这个工具,以及用它获取的 HD 转储ddrescue -S
(这会创建一个稀疏转储)。转储有 230 GB,但作为稀疏文件,它只使用 23 GB,并bmaptool
在一分钟多一点的时间内写入转储。