未使用のスペースをゼロでクリアするにはどうすればよいですか? (ext3、ext4)
私はもっと賢いものを探しています
cat /dev/zero > /mnt/X/big_zero ; sync; rm /mnt/X/big_zero
同様 FSArchiver は「使用済みスペース」を探し、未使用だが反対側のサイトを無視します。
目的:パーティションイメージを圧縮したいので、未使用のスペースをゼロで埋めることを強くお勧めします。
ところでbtrfsの場合: ゼロで未使用のスペースをクリア(btrfs)
そのようなユーティリティはzerofree
です。
その説明から:
Zerofreeは、ext2またはext3ファイルシステムで割り当てられていない、ゼロ化されていないブロックを見つけて、ゼロで埋めます。これは、このファイルシステムが存在するデバイスがディスクイメージである場合に役立ちます。この場合、ディスクイメージの種類によっては、ゼロフリーの実行後に、セカンダリユーティリティがディスクイメージのサイズを縮小できる場合があります。 Zerofreeでは、ファイルシステムをマウント解除するか、読み取り専用でマウントする必要があります。
同じ結果(未使用ブロックのゼロ化)を達成する通常の方法は、 "dd"を実行して、ドライブの空き領域全体を占めるゼロでいっぱいのファイルを作成し、このファイルを削除することです。これには多くの欠点があり、zerofreeによって軽減されます。
- 遅い
- ディスクイメージを(一時的に)最大限に拡張します
- (一時的に)ディスク上のすべての空き領域を使用するため、他の同時書き込みアクションが失敗する可能性があります。
Zerofreeは、仮想マシン内のゲストOSとしてインストールされたGNU/Linuxシステムから実行されるように作成されています。これが当てはまらない場合は、ほぼ確実にこのパッケージは必要ありません。
.debパッケージの説明には、次の段落が含まれています。これは、これがext4でも正常に機能することを意味します。
説明:ext2、ext3、およびext4ファイルシステムからのゼロ空きブロックZerofreeは、ext2、ext3、またはext4ファイルシステムでゼロ以外の値の内容を持つ未割り当てのブロックを見つけ、それらをゼロで埋めます...
このユーティリティの別のアプリケーションは、実際のディスクのバックアップであるディスクイメージを圧縮することです。この典型的な例は、BeagleBoneまたはRaspberry PiでのSDカードのダンプです。空のスペースがゼロになると、バックアップイメージをより効率的に圧縮できます。
Ext2/ext3/ext4の未使用のスペースをクリアする方法の概要(この質問などで言及されている):
e2fsck -E discard src_fs
を使用して、未使用のスペースを破棄できます(e2fsprogs 1.42.2以降が必要)。zerofree src_fs
など)を使用して、未使用のブロックにゼロを明示的に書き込みます。e2image -rap src_fs dest_fs
を使用して、使用中のブロックのみをコピーします(新しいファイルシステムは、ゼロ化された「ディスク」上にある必要があり、e2fsprogs 1.42.9以降が必要です)。fstrim /mnt/fs/
を使用して、未使用のスペースを破棄するようにファイルシステムに要求できます。cat /dev/zero > /mnt/fs/zeros; sync; rm /mnt/fs/zeros
の使用(secure-deleteのsfill
はこの手法を使用しています)。この方法は効率が悪く、Ted Ts'o(ext4の作者)によって推奨されていません。特定のものがゼロにならない可能性があり、将来のfsck
sが遅くなる可能性があります。ファイルシステムをアンマウントすると、マウントするよりも良い結果が得られます。以前に使用された多くのスペースをゼロにする必要がある場合、破棄は最も速い方法ですが、破棄プロセス後にzerofree
を使用すると、少し余分にゼロになることがあります(「ディスク」での破棄の実装方法によって異なります)。 。
適切なディスクイメージツール(qemu-img convert src_image dst_image
など)を使用して、ゼロ化されたスペースを回収し、イメージを表すファイルを小さくできるようにする必要があります。
次のいずれかの方法を使用して、ファイルをまばらにすることができます(したがって、ゼロを実行するとスペースを占有しなくなります)。
cp --sparse=always src_image dst_image
。fallocate -d src_image
(util-linux v2.25以降が必要)。最近では、 virt-sparsify のようなツールを使用して、これらのステップとそれ以上を一度に実行する方が簡単な場合があります。
zerofree
の作成者sfill
from secure-delete は、これと他のいくつかの関連ジョブを実行できます。
例えば.
sfill -l -l -z /mnt/X
Secure-Deleteパッケージに含まれるツールであるsfill
のソースを含むgithub上のArchLinuxプロジェクトによって使用されているように見えるソースツリーがあります。
sfill
のmanページのコピーもここにあります:
E2fsprogs 1.42.9を使用している場合は、e2image
を使用して、最初に空き領域なしでパーティションイメージを作成できるため、ゼロ化手順をスキップできます。
追加のツールに頼らない場合は、この方法はcat /dev/zero > /mnt/fs/zeros
よりも高速です。
dd if=/dev/zero of="/mnt/fs/filler" bs=10485760
dd if=/dev/zero of="/mnt/fs/filler1" bs=1
rm /mnt/fs/filler
rm /mnt/fs/filler1
sfill
を使用できます。これは、シンボリュームに適したソリューションです。