web-dev-qa-db-ja.com

未使用スペースをゼロでクリア(ext3、ext4)

未使用のスペースをゼロでクリアするにはどうすればよいですか? (ext3、ext4)

私はもっ​​と賢いものを探しています

cat /dev/zero > /mnt/X/big_zero ; sync; rm /mnt/X/big_zero

同様 FSArchiver は「使用済みスペース」を探し、未使用だが反対側のサイトを無視します。

目的:パーティションイメージを圧縮したいので、未使用のスペースをゼロで埋めることを強くお勧めします。

ところでbtrfsの場合: ゼロで未使用のスペースをクリア(btrfs)

76

そのようなユーティリティはzerofreeです。

その説明から:

Zerofreeは、ext2またはext3ファイルシステムで割り当てられていない、ゼロ化されていないブロックを見つけて、ゼロで埋めます。これは、このファイルシステムが存在するデバイスがディスクイメージである場合に役立ちます。この場合、ディスクイメージの種類によっては、ゼロフリーの実行後に、セカンダリユーティリティがディスクイメージのサイズを縮小できる場合があります。 Zerofreeでは、ファイルシステムをマウント解除するか、読み取り専用でマウントする必要があります。

同じ結果(未使用ブロックのゼロ化)を達成する通常の方法は、 "dd"を実行して、ドライブの空き領域全体を占めるゼロでいっぱいのファイルを作成し、このファイルを削除することです。これには多くの欠点があり、zerofreeによって軽減されます。

  • 遅い
  • ディスクイメージを(一時的に)最大限に拡張します
  • (一時的に)ディスク上のすべての空き領域を使用するため、他の同時書き込みアクションが失敗する可能性があります。

Zerofreeは、仮想マシン内のゲストOSとしてインストールされたGNU/Linuxシステムから実行されるように作成されています。これが当てはまらない場合は、ほぼ確実にこのパッケージは必要ありません。

アップデート#1

.debパッケージの説明には、次の段落が含まれています。これは、これがext4でも正常に機能することを意味します。

説明:ext2、ext3、およびext4ファイルシステムからのゼロ空きブロックZerofreeは、ext2、ext3、またはext4ファイルシステムでゼロ以外の値の内容を持つ未割り当てのブロックを見つけ、それらをゼロで埋めます...

その他の用途

このユーティリティの別のアプリケーションは、実際のディスクのバックアップであるディスクイメージを圧縮することです。この典型的な例は、BeagleBoneまたはRaspberry PiでのSDカードのダンプです。空のスペースがゼロになると、バックアップイメージをより効率的に圧縮できます。

82
enzotib

Ext2/ext3/ext4の未使用のスペースをクリアする方法の概要(この質問などで言及されている):

未使用スペースのゼロ化

ファイルシステムがマウントされていません

  • ファイルシステムが存在する「ディスク」がシンプロビジョニングされている場合(たとえば、TRIMをサポートする最新のSSD、VM疎性をサポートする形式のファイルなど)、カーネルがブロックデバイスがそれを理解していると言った場合、 e2fsck -E discard src_fsを使用して、未使用のスペースを破棄できます(e2fsprogs 1.42.2以降が必要)。
  • zerofree (_zerofree src_fsなど)を使用して、未使用のブロックにゼロを明示的に書き込みます。
  • e2image -rap src_fs dest_fsを使用して、使用中のブロックのみをコピーします(新しいファイルシステムは、ゼロ化された「ディスク」上にある必要があり、e2fsprogs 1.42.9以降が必要です)。

ファイルシステムがマウントされている

  • ファイルシステムが存在する「ディスク」がシンプロビジョニングされている場合(たとえば、TRIMをサポートする最新のSSD、VMファイルがスパース性をサポートするファイルなど))、カーネルはブロックデバイスがそれを理解し、最後にextファイルシステムドライバーはそれをサポートしています。fstrim /mnt/fs/を使用して、未使用のスペースを破棄するようにファイルシステムに要求できます。
  • cat /dev/zero > /mnt/fs/zeros; sync; rm /mnt/fs/zerosの使用(secure-deleteのsfillはこの手法を使用しています)。この方法は効率が悪く、Ted Ts'o(ext4の作者)によって推奨されていません。特定のものがゼロにならない可能性があり、将来のfscksが遅くなる可能性があります。

ファイルシステムをアンマウントすると、マウントするよりも良い結果が得られます。以前に使用された多くのスペースをゼロにする必要がある場合、破棄は最も速い方法ですが、破棄プロセス後にzerofreeを使用すると、少し余分にゼロになることがあります(「ディスク」での破棄の実装方法によって異なります)。 。

画像ファイルを小さくする

画像は専用のVM形式です

適切なディスクイメージツール(qemu-img convert src_image dst_imageなど)を使用して、ゼロ化されたスペースを回収し、イメージを表すファイルを小さくできるようにする必要があります。

画像は未加工ファイルです

次のいずれかの方法を使用して、ファイルをまばらにすることができます(したがって、ゼロを実行するとスペースを占有しなくなります)。

  • cp --sparse=always src_image dst_image
  • fallocate -d src_image(util-linux v2.25以降が必要)。

最近では、 virt-sparsify のようなツールを使用して、これらのステップとそれ以上を一度に実行する方が簡単な場合があります。

出典

33
Anon

sfill from secure-delete は、これと他のいくつかの関連ジョブを実行できます。

例えば.

sfill -l -l -z /mnt/X

アップデート#1

Secure-Deleteパッケージに含まれるツールであるsfillのソースを含むgithub上のArchLinuxプロジェクトによって使用されているように見えるソースツリーがあります。

sfillのmanページのコピーもここにあります:

15
cas

E2fsprogs 1.42.9を使用している場合は、e2imageを使用して、最初に空き領域なしでパーティションイメージを作成できるため、ゼロ化手順をスキップできます。

8
psusi

追加のツールに頼らない場合は、この方法は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
0
eadmaster

sfill を使用できます。これは、シンボリュームに適したソリューションです。

0
user64219