未使用スペースをゼロでクリア(btrfs)


10

未使用のスペースをゼロでクリアするにはどうすればよいですか?(私はbtrfsファイルシステム用のツールを求めています)

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

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

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

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

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

「よりスマートなアルゴリズム」の明確化:「よりスマートなアルゴリズム」は混乱を招くことがわかるので、ここで最終的にそれについて行を追加することにしました。読者の皆さん、ファイルシステムをデータ構造として考えてください。簡単にするために、関連付けキー->値の配列として使用される、赤と黒のツリーを保持する自己バランスを考えます。値は整数です。目標は、すべての負の値をゼロでクリアすることです。「スマートでない」アルゴリズムはそれを反復し、key:valueペアを新しいマップに追加します(最終的には負の値をゼロに変更します)。スマートアルゴリズムは、負の値が格納されている場所を検出しそれらをインプレースでクリアします。


2
sfill提案を試しましたか?extXは必要ないようです。
ケビン

1.既存のファイルをゼロで埋めることができることは知っていますが、これはおそらくそうではありませんよね?2.それらの画像をどのように作成していますか?多分あなたはそこで切り捨てをすることができますか?
Zlatko、2012

@kevin:そのため、私は元の質問にsfillの回答を投稿しました。私は自分でext2、3、4ファイルシステムを使用することはめったにないので、ext *でのみ機能するユーティリティはうんざりするほど役に立たないことがわかりました。
CAS

「スマート」なものが必要です。他の場所に触れることなく空のスペースをゼロで埋めるだけの何か-Bツリーなどの内部データ構造に影響を与えないことを意味します(もし興味があれば、「圧縮」の質問に書きましたが、他の目的にも必要です、 fs画像のような重複
除外

使用truncateおよび/またはfallocate
mikeserv 2014

回答:


4

これは、前の質問に対する私の回答の修正され、大幅に拡張された再投稿です。

sfillsecure-deleteパッケージからあなたが望むことを行うことができます。

zerofree(ext2、ext3、およびext4ファイルシステムでのみ機能します)とは異なり、sfillは任意のファイルシステムで機能します。

例えば

sfill -l -l -z /mnt/X

sfill / secure-deleteホームページは消えたようですが、debianとubuntu用にパッケージ化されています。おそらく他のディストリビューションも。ソースコードが必要な場合、それがどこにも見つからない場合は、debianアーカイブにあります。

注:sfillはマウントされたファイルシステムでのみ機能します。VM内からではなくホストシステムからイメージファイルをゼロで埋める場合は、fsイメージをホストにマウントする必要があります。正確な方法は、画像ファイルの種類(qcow2またはrawなど)によって異なります。

「未加工」イメージのマウントは簡単で簡単です。ただ、使用のkpartxパーティションごとにループバックデバイスと/ dev /マッパー/エントリを作成するには、画像ファイルには、その後、個別にマウントすることができます。

以下は、ネットブート可能なfreedosハードディスクイメージをマウントするために使用するスクリプトの一部を変更した部分的なスクリプトです(flashromが機能しないマシンでのBIOSの更新に使用)。

image="myrawimagefile.img"

# use kpartx to build /dev/mapper device nodes
KP=$(kpartx -a -v "$image")

# now mount each partition under ./hd/
for p in $(echo "$KP" | awk '/^add map/ {print $3}') ; do
  dm="/dev/mapper/$p"
  fp=$(echo "$p" | sed -r -e 's/^loop[0-9]+//')
  mkdir -p "./hd/$fp"
  mount "$dm" "./hd/$fp"
  sfill -l -l -v "./hd/$fp"
  umount "$dm"
done

# now remove the loopback device and /dev/mapper entries
kpartx -d "$image"

注:イメージ内のすべてのパーティションがマウント可能であることを前提としています。私のユースケースではtrue(1つのパーティションを持つfreedos hdイメージ)。たとえば、パーティションの1つがスワップ領域である場合は当てはまりません。そのようなパーティションを検出し、ddを使用してスワップパーティションをゼロにすることは、読者の練習問題として残します:)

この方法またはその変形は、LVMボリュームでも機能するはずです。

イメージがqcowの場合qemu-nbdqemu-utilsパッケージのツールを使用できます。これにより、イメージファイルとそのパーティションがネットワークブロックデバイスとして表示されます(例:/ dev / nbd0/dev/ndb0p1)。/と同様に使用できます。上記のdev / mapperデバイス。

qemu-imgqcowからrawへの変換に使用し、上記のrawのメソッドを使用し、変更されたrawイメージを圧縮されたqcow2に変換する方が簡単で面倒が少ない(ただし時間がかかる)。新しいqcow2イメージが作成されるときに圧縮するため、これはおそらくqemu-nbdを使用するよりもわずかに小さいイメージになります。


1
つまり、未使用のスペースをゼロで埋める「スマート」な方法と見なされません。これは、最も明白で典型的な方法です。私はそのようなことについて尋ねているのではありません。
Grzegorz Wierzowiecki

1
特定のファイルシステムファミリに固有ではない「スマート」アルゴリズムについて説明してください(ゼロフィルはext2 / 3/4のようです)。あなたは仕事をすることができるプログラムを望んでいました。あなたもそれが魔法である必要があるとは言わなかった。
cas

1
そして、実際には、ファイルシステムが使用されていない場合(たとえば、ゼロフィルのためにホストにマウントされているため)、アルゴリズムがどれほど賢いかが問題になりますか?空のセクターを探すfsメタデータをトロールすることは、NULでいっぱいの巨大な塗りつぶしを書くことよりも速くも良くもありません...ファイルシステム自体は、空のスペースがどこにあるかを把握するのに十分なほどスマートです。
cas

2
一方では、あなたのニーズには十分です-私の質問にはすでにこのソリューションのコードスニペットが含まれているので、あなたの答えは何も新しいものを提供していません。一方、内部構造を変更せずに未使用のスペースをゼロでワイプしたいので(たとえば、「Dancing B-Trees」または他の種類のデータ構造(例:分析と重複排除のため)を再調整する必要があるため、私のニーズは私が指定するものを必要とします目的)
Grzegorz Wierzowiecki 2012

2
@cas-VMで仮想ハードドライブを圧縮する前に、ゼロフィルが必須のステップであるという事実を見逃していると思います。500 GBの拡張ディスクがあり、10 GBのファイルと10 GBの「空の」スペース(つまり、削除されたファイル)がある場合、単純な「ジャイアントゼロファイル」アプローチを実行すると、FARが長くなり、VHDが最大に膨らむ必要があります。フル500 GB。OP もユーティリティがFS固有である必要があると想定しているに違いない。
偽の名前

3

空き領域をクリアするための正しい「スマートな」方法は、以下を使用しています。

fstrim /mountpoint

マウントされたファイルシステムでこれを使用してください。

これにはセキュリティ上の利点がないことに注意することが重要です。セキュリティのためにディスクをクリアする場合は、ファイルをバックアップし、「shred」などのコマンドでディスク全体をゼロにしてから、ファイルを復元します。

ただし、ディスクがスパースファイルシステムのシンプロビジョニングであり、未使用のスペースを回復したい場合は、ソリューションは正常に機能します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.