web-dev-qa-db-ja.com

独立してTRIMがSSDで機能することを確認します

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

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

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

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圧縮画像は、元の元の画像とほぼ同じサイズです。

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

私の理論がなぜ実践に移されないのですか?

13
Martin Vegter

あなたの論理は不正確ではありません。ただし、いくつかの条件が満たされた場合にのみ有効です。

ATAコマンドセットで指定されている TRIMコマンド は、発行対象のセクターをゼロにする場合とゼロにしない場合があります。
実際には、標準は、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、sdasdbを使用していくつかのテストを実行しました。同じメーカー、異なるモデル、異なる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:Information technology-ATA/ATAPI Command Set-4(ACS-4)


テストに関する注意:

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

fstrimと後続の読み取りの間で、キャッシュを削除する必要がある場合があります。と:

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

使用しているパーティションのサイズによっては、キャッシュを削除しなくてもテストが失敗する可能性があります。


設定に関する注意:

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

8
fra-san

SSDにはハードウェア暗号化レイヤーが組み込まれていますか? 1つある場合、TRIMmedブロックは未加工のハードウェアレベルですべてゼロ(または場合によってはすべて1)になる可能性がありますが、コンピューターは暗号化レイヤーを介してそれらを認識しているため、 -復号化プロセスを通じて未加工ブロックをゼロにします。

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

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

dfレポートの空き領域は、ゼロにされた領域を意味するものではありません。

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

0
ctrl-alt-delor

破棄はゼロと同じではありません。

Cryptsetupでゼロにしたい場合は、fs、次にcryptブロックを縮小してから、未使用のボリュームスペースをddにします。

トリムが機能したかどうかを知りたい場合は、速度テストを行って、頻繁に使用した後の指標にする必要があります。

https://linux.die.net/man/8/fstrimhttps://en.m.wikipedia.org/wiki/Trim_(computing)

0
user1133275