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


73

未使用のスペースをゼロでクリアする方法は?(ext3、ext4)

よりスマートなものを探しています

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

FSArchiverが「使用済みスペース」を探しているように、未使用だが反対側のサイトを無視します。

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

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


4
これをチェックしてください:superuser.com/questions/19326/…–
マット

1
2種類の答えが可能です。何を達成しようとしていますか?いずれか1)これらのデータを読み取るために誰かを禁止、またはによるセキュリティ、2)全体パーティションの圧縮または[SSD性能](最適化en.wikipedia.org/wiki/Trim_(computing)を
Totor

回答:


77

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

その説明から:

Zerofreeは、ext2またはext3ファイルシステム内の未割り当ての非ゼロブロックを検索し、ゼロで埋めます。これは、このファイルシステムが存在するデバイスがディスクイメージである場合に便利です。この場合、ディスクイメージの種類によっては、セカンダリユーティリティがzerofreeの実行後にディスクイメージのサイズを縮小できる場合があります。Zerofreeでは、ファイルシステムをアンマウントするか、読み取り専用でマウントする必要があります。

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

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

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

更新#1

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

説明:ext2、ext3、ext4ファイルシステムのゼロフリーブロックZerofreeは、ext2、ext3、またはext4ファイルシステムでゼロ以外の値のコンテンツを持つ未割り当てブロックを見つけ、ゼロで埋めます...

その他の用途

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


1
intgat.tigress.co.uk/rmy/uml/index.htmlツールの公式ページですか?ext4で使用しても安全だと思いますか?
グジェゴシWierzowiecki

2
@GrzegorzWierzowiecki:はい、それはページですが、debianや友人にとっては既にリポジトリにあります。仮想ディスク上のext4パーティションでディスクファイルイメージを連続的に縮小するために使用しましたが、問題はありませんでした。
enzotib

1
これはdd、マウントされたファイルシステムでは機能しないため、元の質問の粗い方法とは異なります。
-jlh

zerofreeページは、削除されたファイルを常にゼロで消去するように、「filesystemはzerofreeオプションでマウントされます」ことを可能にするパッチについて説明しています。これでカーネルを再コンパイルする必要がありますか?同じことを達成する簡単な方法はありますか?
エンドリス

2
注意してくださいzerofree-Astralinux(Debianベース)で使用しているext4ファイルシステムを失いました…
Hubbitus

33

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/zerossfillからはセキュア削除することは、この技術を使用しています)。この方法は非効率的であり、Ted Ts'o(ext4の作成者)によって推奨されておらず、特定のものをゼロにしない可能性があり、futureを遅くする可能性がありますfsck

ファイルシステムをアンマウントすると、マウントするよりも良い結果が得られます。破棄は、以前に使用された多くの領域をゼロにする必要がある場合に最速の方法になる傾向があり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などのツールを使用して、これらの手順などを一度に実行する方が簡単な場合があります。

 ソース


15

sfill安全な削除から、これと他のいくつかの関連ジョブを実行できます。

例えば

sfill -l -l -z /mnt/X

更新#1

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

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


そのURLは廃止されました。ホームページが現在どこにあるのか(またはまだあるとしても)わかりませんが、debianとubuntu用にパッケージ化されています。おそらく他のディストリビューションも。ソースコードが必要な場合、他の場所で見つからない場合は、debianアーカイブで見つけることができます。
cas

廃止されたマンページURLは修正されました。「Digipedia」はもはや問題ではないようです。
mwfearnley

8

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


これらのパラメーターに関する情報をオンラインで(簡単に)見つけることができませんでしたが、実際には1.42.9リリースノートに記載されています:e2fsprogs.sf.net/e2fsprogs-release.html#1.42.9
mwfearnley

1
それは貴重なツールです!ただし、使用方法も説明されていれば、答えはもっと良いでしょう。それはだe2image -ar /dev/foo1 | gzip > fs.img.gz、またはいくつかのバリエーションが挙げられます。-fマウントされたfsで使用する場合に含めます。
marcelm

0

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


casの回答についてコメントしたい場合は、十分な評判が得られるまで待ちます。
Anthonの

1
答えはmanpages.ubuntu.com/manpages/lucid/man1/sfill.1.htmlを参照していると思います...これは少なくとも回答の試みです。(この場合の「オンライン」は、「Web上」ではなく「ファイルシステムがマウントされている」ことを意味します)。
デロバート14

0

追加のツールに頼りたくない場合、この方法は次の方法よりも高速です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

なぜそれがより速いのcatでしょうか?(いいえ、ブロックサイズの引数はdd役に立ちません)
marcelm


2
はい、しかしそれはdd速くなりません。実際、おそらくcatより高速になります。ブロックサイズは、システムコールのオーバーヘッドを最小限に抑え、CPUキャッシュの使用を最適化するためにのみ重要です。syscallのオーバーヘッドにより、収益が減少する領域に入ります。キャッシュは、たとえば1MiBを超えて傷つき始めます。そして、実際のディスクで操作する場合、とにかくI / Oバウンドであり、そのポイントはほとんど意味がありません。自分でベンチマークしてみてください。
-marcelm
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.