あなたのロジックは間違っていません。ただし、いくつかの条件が満たされている場合にのみ有効です。
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のソリッドステートドライブを参照してください。この件について詳しく説明しています。
dmsetup table | grep allow_discards