パーティションでゼロバイトを計算する最速の方法

パーティションでゼロバイトを計算する最速の方法

私のルートとプライマリパーティションはLUKSで暗号化されています。削除/クリーンアップを有効にしたいと思います(セキュリティに関することを知っています)。私の理解が正しい場合、rawディスクデバイスではドロップ領域が0になり、cryptsetupマッピングされたデバイスではドロップ領域が壊れます。

いくつかの設定を変更して実行したfstrim後、削除が正しく機能していることを確認したいと思います。これを行うには、パーティションでゼロのバイト数を計算したいと思います。クリーンアップされたディスクでは、次のことを期待します。

count of 0 bytes¼ total partition sizepercentage of free space

クリーンアップされていない暗号化パーティションで:(すべてのバイトが少なくとも1回書き込まれると仮定)

count of 0 bytestotal partition size¼ 256

からインスピレーションを受けるバイナリファイルからバイト発生に関する統計をどのように収集できますか?、私は次のアプローチを試しました。

sudo pv /dev/disk/by-label/ESP | od -vtu1 -An -w1 | grep -Fx '   0' | wc -l

しかし、結果は残念だった。 500MBのパーティションを処理するのに約3分かかりました。これは3MB /秒で、私のSSDは360MB /秒の順次読み取り速度を達成できます。また、他のコアがアイドル状態の間、私のCPUコアの1つが100%で実行されることを確認したので、これが並列化の利点を得ることができると思いました。 (の影響pvはわずかであり、と比較するとほとんど違いはありませんcat。)

0パーティションのバイト数を計算する最速の方法は何ですか?

答え1

生ディスク(暗号化されていない)にアクセスできる場合は、次のことができます。

dd if=/dev/sda bs=1M count=100 2>/dev/null | tr -d '\0' | wc -c

その後、ディスクから100MBを読み取り、0をすべて削除して残りのバイトを計算します。

これが最速の方法かどうかはわかりませんが、データよりもゼロが多いと仮定するとかなり高速です。

上記のコマンドは、可能であれば100回1Mega byteまたは(104857600)バイトを読み取ります。100*2^20速度とコマンドがどれほどうまく機能するかをテストするには、より小さい数字(10または100)を試してください。ディスク全体を読み取るには、countオプションを削除してコマンドをディスクの片側に制限するだけです。

2つの重要な値(フルディスクバイトとゼロ以外のバイト)を抽出するには、コマンドがより複雑になります。

$ time { { { sudo dd if=/dev/sdX bs=100M 2> >(grep -oP '[0-9]+(?=\s*bytes)' 1>&2 ) | tr -d '\0' | wc -c; } 2>&1; } | { read -d '' a b; echo "$b/$a"; }; }

これにより、両方の値が次のように印刷されます。non-zero/diskたとえば、次のようになります。

766568020/999292928

1-766568020/999292928見つかったゼロバイトの割合を計算します。

$ bc <<<'(1-766568020/999292928)*100'
23.28895776994831289400

関連情報