私は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圧縮画像は、元の元の画像とほぼ同じサイズです。
私の推論は正しいですか?
私の理論がなぜ実践に移されないのですか?
あなたの論理は不正確ではありません。ただし、いくつかの条件が満たされた場合にのみ有効です。
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、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: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で ソリッドステートドライブ をポイントします。この記事では、この問題について詳しく説明しています。
SSDにはハードウェア暗号化レイヤーが組み込まれていますか? 1つある場合、TRIMmedブロックは未加工のハードウェアレベルですべてゼロ(または場合によってはすべて1)になる可能性がありますが、コンピューターは暗号化レイヤーを介してそれらを認識しているため、 -復号化プロセスを通じて未加工ブロックをゼロにします。
このようなハードウェア暗号化レイヤーには、いくつかの利点があります。
df
レポートの空き領域は、ゼロにされた領域を意味するものではありません。
trim
は、ブロックが未使用であることをストレージデバイスに通知します。これがゼロになるとは思いません。
破棄はゼロと同じではありません。
Cryptsetupでゼロにしたい場合は、fs、次にcryptブロックを縮小してから、未使用のボリュームスペースをddにします。
トリムが機能したかどうかを知りたい場合は、速度テストを行って、頻繁に使用した後の指標にする必要があります。
https://linux.die.net/man/8/fstrimhttps://en.m.wikipedia.org/wiki/Trim_(computing)