まず第一に、ゼロを書き込む場合ではなく、シークする場合にのみスパース ファイルが透過的に処理されます。
より明確にするために、ウィキペディアの例
dd if=/dev/zero of=sparse-file bs=1k count=0 seek=5120
しない ゼロを書き込むと、出力ファイルが開き、5MB をシーク (ジャンプ) し、ゼロ を書き込みます。 ゼロ (つまり、何もない)。このコマンド (ではない ウィキペディアより)
dd if=/dev/zero of=sparse-file bs=1k count=5120
5MB のゼロを書き込み、スパース ファイルを作成しません!
結果として、すでに非スパースであるファイルが後で魔法のようにスパースになることはありません。
次に、多数のゼロを含むファイルをスパースにするには、それを cp する必要があります
cp --sparse=always original sparsefile
または、tar または rsync の --sparse オプションも使用できます。
おそらく、ファイルをその場でスパース化する最も簡単な方法は、 fallocate
を使用することです ユーティリティは次のとおりです:
fallocate -v --dig-holes {file_name}
fallocate(1) は、Debian の util-linux パッケージによって提供されます。
完全を期すために回答を編集する:
<オール>
losetup --partscan --find --show disk.img
ディスクとして /dev/loop1 が指定され、パーティションが 1 つしかないと仮定します。それ以外の場合は、マウント可能な FS を含むすべてのパーティションに対してこれを繰り返す必要があります (スワップ パーティションなどは無視します)。
mkdir -p /mnt/tmp
mount /dev/loop1p1 /mnt/tmp
dd if=/dev/zero of=/mnt/tmp/tempfile
ENOSPC で失敗に終わりましょう。
/bin/rm -f /mnt/tmp/tempfile
umount /mnt/tmp
losetup -d /dev/loop1
- まばらなイメージにコピー:
「dd」には、ゼロを含むファイルをスパース ファイルに変換するオプションがあります:
dd if=disk.img of=disk-sparse.img conv=sparse