如何写入稀疏 Linux(EXT4)磁盘映像而不写入千兆字节的零?

如何写入稀疏 Linux(EXT4)磁盘映像而不写入千兆字节的零?

我有一个 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

这很尴尬,因为您有一个完整的磁盘映像,但您可以:

  1. 使用您选择的分区程序列出分区os.img并在其上创建它们/dev/sdb
  2. 使用 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,请参阅其网页。您可以分两步运行它:

  1. 从文件创建 bmap;bmap 列出了已被占用的块。
  2. 使用生成的 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在一分钟多一点的时间内写入转储。

相关内容