TRIMが実際にSSDで動作することを独立して検証する


13

私はluksOpenでLUKSパーティションを持っています:/dev/sda1--allow-discards

cryptsetup --allow-discards luksOpen /dev/sda1 root

次にext4discardオプションを使用してファイルシステムをマウントします。

grep /dev/mapper/root /proc/mounts
/dev/mapper/root / ext4 ro,relatime,block_validity,discard,delalloc,barrier,user_xattr,acl 0 0

次に、マウントされたパーティションの空き領域をトリミングします。

fstrim -v /

ではdf/80%の空き容量があります。つまり/dev/sda1、では、ディスクの80%がバイナリゼロです。

で画像を複製した場合 cat

cat /dev/sda1 > sda1.img

そして、イメージをxzで圧縮すると、ディスク上のすべてのゼロが圧縮されるはずです。ディスク上のデータの20%は暗号化されているため、ランダムに見え、圧縮できないはずです。したがって、xzで圧縮されたイメージは約になります。未加工サイズの20%。

ただし、結果のxz圧縮イメージは、元の元のイメージとほぼ同じサイズです。

私の推論は正しいですか?

なぜ私の理論は実践に変換されないのですか?


2
unix.stackexchange.com/a/85880/30851およびdmsetup table | grep allow_discards
frostschutz

回答:


8

あなたのロジックは間違っていません。ただし、いくつかの条件が満たされている場合にのみ有効です。

TRIMコマンドはで指定され、ATAコマンドセット、またはそれはに対して発行されたセクタをゼロではない場合があります。
実際、標準はTRIMが発行された後に返されるデータに焦点を当てています1

次の動作は、デバイスがトリムするセクターに対してこの規格で指定されています(7.5.3.3を参照)。

a)非決定的-セクターがホストによって書き込まれるまで、トリミングされたセクターからの読み取りに応じたデータは読み取りごとに変化する場合があります。
b)トリム後の確定的読み取り(DRAT)-トリムされたセクターの読み取りに応じて返されるデータは変更されませんが、以前に返されたデータとは異なる場合があります。そして
C)読むゼロ)トリム(RZAT後-トリミング部門の読み取りに対応して返されたデータはゼロです。

[...] DRATおよび非決定的ストレージデバイスの両方で、正常にトリミングされたLBAへの読み取りコマンドへの応答としてデータが返されました。

a)指定されたLBAについて以前に返されたデータである可能性があります。
b)記憶装置によって生成されたパターンであってもよい。そして
c)は、以前にホストによって異なるLBAに書き込まれたデータではありません。

したがって、デバイスが何を返すfstrimかは、実装する機能によって異なります。RZATをサポートしていない限り、トリミングされたデバイスから読み取られたデータはゼロのみであるという仮定は成り立ちません。

hdparmこれを確認するために使用できます。

sudo hdparm -I /dev/sdX | grep -i trim

2つのSSDを使用していくつかのテストを実行sdaしましたsdb。同じATAの異なるメーカー、異なるモデル:

$ sudo hdparm -i /dev/sdb
 ...
 Drive conforms to: Unspecified:  ATA/ATAPI-3,4,5,6,7
 ...

$ sudo hdparm -i /dev/sda
 ...
 Drive conforms to: unknown:  ATA/ATAPI-2,3,4,5,6,7
 ...

2つのSSDのTRIMのサポートは異なります。

$ sudo hdparm -I /dev/sda | grep -i trim
           *    Data Set Management TRIM supported (limit 1 block)

$ sudo hdparm -I /dev/sdb | grep -i trim
           *    Data Set Management TRIM supported (limit 8 blocks)
           *    Deterministic read ZEROs after TRIM

発行後fstrim、「TRIM後の決定論的読み取りZERO」(RZAT)をサポートするドライブが、実際に関係するパーティションをほぼ完全にゼロにしたように見えることを確認できます。反対に、もう一方のドライブは、解放されたスペースのごく一部のみがゼロになっている(または圧縮性の高いパターンに置き換えられている)ようです。

1 オンラインソース:INCITS 529:情報技術-ATA / ATAPIコマンドセット-4(ACS-4)


テストに関する注意:

frostschutzがコメントで指摘したように、read after fstrimは、トリミングされたデバイスからではなく、オペレーティングシステムのキャッシュからデータを返す場合があります。たとえば、この質問で何が起こったかです
(私はまた、TRIMをテストするための別の方法についての同じ質問に対するこの答えを指摘します)。

fstrim次の読み取りまでの間に、キャッシュをドロップする必要がある場合があります。例:

echo 3 | sudo tee /proc/sys/vm/drop_caches

プレイしているパーティションのサイズによっては、キャッシュをドロップしなくてもテストが失敗する場合があります。


設定に関する注意:

discardマウントオプションは、連続TRIMを有効にし、すなわち、いつでもファイルが削除されます。には必要ありませんfstrim。実際、オンデマンドTRIMと継続的TRIMは、TRIM操作を管理する2つの異なる方法です。詳細については、Arch Linux Wikiのソリッドステートドライブを参照してください。この件について詳しく説明しています。


Linuxは、SSDがゼロとして再読み取りしても、TRIM後にキャッシュからゼロ以外のデータを返す場合があります。これは、unix.stackexchange.com / a / 85880/30851での yes-trim-testの問題でしたが、TRIMの前後の生データの読み取りにも関連している可能性があります。そのため、期待どおりにゼロにならない場合は、念のためキャッシュをドロップしてください。
frostschutz

@frostschutz良い点!OPが「ルート」ボリュームに言及しているので、メモリに収まるにはボリュームの大部分が大きすぎると思われました。しかし、テスト中にキャッシュが邪魔になることは間違いありません。ドロップを開始するまで惨めに失敗しました。回答を更新します。
fraさん

2

SSDにはハードウェア暗号化レイヤーが組み込まれていますか?1つある場合、TRIMmedブロックは未加工のハードウェアレベルですべてゼロ(またはすべて1)になる場合がありますが、コンピューターは暗号化レイヤーを通してそれらを見るため、すべてを渡した後、擬似ランダムなちらつきとして表示されます-復号化プロセスで生ブロックをゼロにします。

このようなハードウェア暗号化層には、いくつかの利点があります。

  • これにより、非常に高速なセキュリティ消去機能が可能になります。ハードウェア暗号化レイヤーで使用された元のキーをドライブで破棄し、新しいキーに置き換えるだけで、すべてのデータはほとんどの実用的な目的で即座に回復できなくなります。
  • 生のハードウェアレベルに到達するすべてのデータは暗号化されるため、擬似ランダムに見えることが保証され、したがってほぼ均一になることが保証されます。これにより、ホット/コールドスポットを回避し、摩耗推定を大幅に簡素化できます。


0

df 空き領域の報告は、ゼロ化された領域を意味しません。

trimブロックが使用されていないことをストレージデバイスに通知します。これでゼロになるとは思わない。

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