このチュートリアルでは、Ubuntu 13.04でLVMとdm-cryptを使用してTRIMを設定しようとしています。
構成とテストプロセスに関する以下の注意事項を参照してください。
質問
TRIMが正常に動作していることを信頼できるテストはありますか?
私のテストプログラムが間違っているか、TRIMが機能していませんか?
うまくいかない場合:設定に何の問題がありますか?
TRIM設定をデバッグし、TRIMを正しく機能させるにはどうすればよいですか?
構成
私の設定は次のとおりです。
cat /etc/crypttab
sda3_crypt UUID=[...] none luks,discard
そして
cat /etc/lvm/lvm.conf
# [...]
devices {
# [ ... ]
issue_discards = 1
# [ ... ]
}
# [...]
SSDはSamsung 840 Proです。
これは私のテストプログラムです。
作成した設定をテストしたsudo fstrim -v /
結果は次のとおりです。
/: [...] bytes were trimmed
この操作を再実行した結果/: 0 bytes were trimmed
は意味があり、TRIMが効果的であることを示しています。
しかし、私は次のテストを行いました。
dd if=/dev/urandom of=tempfile count=100 bs=512k oflag=direct
sudo hdparm --fibmap tempfile
tempfile:
filesystem blocksize 4096, begins at LBA 0; assuming 512 byte sectors.
byte_offset begin_LBA end_LBA sectors
0 5520384 5521407 1024
524288 5528576 5529599 1024
1048576 5523456 5525503 2048
2097152 5607424 5619711 12288
8388608 5570560 5603327 32768
25165824 5963776 5980159 16384
33554432 6012928 6029311 16384
41943040 6275072 6291455 16384
50331648 6635520 6639615 4096
sync
sudo hdparm --read-sector 5520384 /dev/sda
/dev/sda:
reading sector 5520384: succeeded
7746 4e11 bf42 0c93 25d3 2825 19fd 8eda
bd93 8ec6 9942 bb98 ed55 87eb 53e1 01d5
c61a 3f52 19a1 0ae5 0798 c6e2 39d9 771a
b89f 3fc5 e786 9b1d 3452 d5d7 9479 a80d
114a 7528 a79f f475 57dc aeaf 25f4 998c
3dd5 b44d 23bf 77f3 0ad9 8688 6518 28ee
81db 1473 08b5 befe 8f2e 5b86 c84e c7d2
1bdd 1065 6a23 fd0f 2951 d879 e823 021b
fa84 b9c1 eadd 9154 c9f4 2ebe cd70 64ec
75a8 4d93 c8fa 3174 7277 1ffb e858 5eca
7586 8b2e 9dbc ab12 40ab eb17 8187 e67d
5e0d 0005 5867 b924 5cfd 6723 9e4a 6f5f
99a4 a3b0 eeac 454a 83b6 c528 1106 6682
ca77 4edf 2180 bf0c b175 fabb 3d4b 37e2
b834 9e3e 82f2 2fdd 2c6a c6ca 873f e71e
f979 160f 5778 356f 2aea 6176 46b6 72b9
f76e ee51 979c 326b 1436 7cfe f677 bfcd
4c3c 9e11 4747 45c1 4bb2 4137 03a1 e4c8
e9dd 43b4 a3b4 ce1b d218 4161 bf64 727b
75d8 dcc2 e14c ebec 2126 25da 0300 12bd
6b1a 28b3 824f 3911 c960 527d 97cd de1b
9f08 9a8e dcdc e65f 1875 58ca be65 82bf
e844 50b8 cc1b 7466 58b8 e708 bd3d c01f
64fb 9317 a77a e43b 671f e1fb e328 93a9
c9c7 291c 56e0 c6c1 f011 b94d 9dc7 71e6
c8b1 5720 b8c9 b1a6 14f1 7299 9122 912b
312a 0f2f a31a 8bf9 9f8c 54e6 96f3 60b8
04a7 7dc9 3caa db0a a837 e5d7 2752 b477
c22d 7598 44e1 84e9 25d4 5db5 9f19 f73b
85a0 c656 373a ec34 55fb e1fc 124e 4674
1ba8 1a84 6aa4 7cb5 455e f416 adc6 a125
c4d4 8323 4eee 2493 2920 4e38 524c 1981
sudo rm tempfile
sync
sudo fstrim /
sync
sudo hdparm --read-sector 5520384 /dev/sda
/dev/sda:
reading sector 5520384: succeeded
7746 4e11 bf42 0c93 25d3 2825 19fd 8eda
bd93 8ec6 9942 bb98 ed55 87eb 53e1 01d5
c61a 3f52 19a1 0ae5 0798 c6e2 39d9 771a
b89f 3fc5 e786 9b1d 3452 d5d7 9479 a80d
114a 7528 a79f f475 57dc aeaf 25f4 998c
3dd5 b44d 23bf 77f3 0ad9 8688 6518 28ee
81db 1473 08b5 befe 8f2e 5b86 c84e c7d2
1bdd 1065 6a23 fd0f 2951 d879 e823 021b
fa84 b9c1 eadd 9154 c9f4 2ebe cd70 64ec
75a8 4d93 c8fa 3174 7277 1ffb e858 5eca
7586 8b2e 9dbc ab12 40ab eb17 8187 e67d
5e0d 0005 5867 b924 5cfd 6723 9e4a 6f5f
99a4 a3b0 eeac 454a 83b6 c528 1106 6682
ca77 4edf 2180 bf0c b175 fabb 3d4b 37e2
b834 9e3e 82f2 2fdd 2c6a c6ca 873f e71e
f979 160f 5778 356f 2aea 6176 46b6 72b9
f76e ee51 979c 326b 1436 7cfe f677 bfcd
4c3c 9e11 4747 45c1 4bb2 4137 03a1 e4c8
e9dd 43b4 a3b4 ce1b d218 4161 bf64 727b
75d8 dcc2 e14c ebec 2126 25da 0300 12bd
6b1a 28b3 824f 3911 c960 527d 97cd de1b
9f08 9a8e dcdc e65f 1875 58ca be65 82bf
e844 50b8 cc1b 7466 58b8 e708 bd3d c01f
64fb 9317 a77a e43b 671f e1fb e328 93a9
c9c7 291c 56e0 c6c1 f011 b94d 9dc7 71e6
c8b1 5720 b8c9 b1a6 14f1 7299 9122 912b
312a 0f2f a31a 8bf9 9f8c 54e6 96f3 60b8
04a7 7dc9 3caa db0a a837 e5d7 2752 b477
c22d 7598 44e1 84e9 25d4 5db5 9f19 f73b
85a0 c656 373a ec34 55fb e1fc 124e 4674
1ba8 1a84 6aa4 7cb5 455e f416 adc6 a125
c4d4 8323 4eee 2493 2920 4e38 524c 1981
これはTRIMが機能していないことを示すようです。 ~から
sudo hdparm -I /dev/sda | grep -i TRIM
* Data Set Management TRIM supported (limit 8 blocks)
* Deterministic read ZEROs after TRIM
編集する
これが出力ですsudo dmsetup table
lubuntu--vg-root: 0 465903616 linear 252:0 2048
lubuntu--vg-swap_1: 0 33308672 linear 252:0 465905664
sda3_crypt: 0 499222528 crypt aes-xts-plain64 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 0 8:3 4096 1 allow_discards
これは私のものです/etc/fstab
:
# <file system> <mount point> <type> <options> <dump> <pass>
/dev/mapper/lubuntu--vg-root / ext4 errors=remount-ro 0 1
# /boot was on /dev/sda2 during installation
UUID=f700d855-96d0-495e-a480-81f52b965bda /boot ext2 defaults 0 2
# /boot/efi was on /dev/sda1 during installation
UUID=2296-2E49 /boot/efi vfat defaults 0 1
/dev/mapper/lubuntu--vg-swap_1 none swap sw 0 0
# tmp
tmpfs /tmp tmpfs nodev,nosuid,noexec,mode=1777 0 0
編集する:
結局バグとして報告しました。https://bugs.launchpad.net/ubuntu/+source/lvm2/+bug/1213631
誰かが解決策を見つけるか、少なくとも設定をテストしてエラーを確認できることを願っています。
修正する
今動作します。許可された回答をご覧ください。
答え1
他のテストアプローチを使用することをお勧めします。hdparm
ファイルシステムアドレスではなくデバイスアドレスを提供し、そのアドレスがどのデバイスに関連付けられているかを知らせないため、少し奇妙です(パーティションを確認しますが、デバイスマッパーのターゲットは確認されません)。ファイルシステムアドレスに関連するものを使用して一貫性を維持する方がはるかに簡単です(zfs / btrfsなどの非伝統的なファイルシステムを除く)。
テストファイルの生成:(意図的にランダムではない)
# yes | dd iflag=fullblock bs=1M count=1 of=trim.test
アドレス、長さ、ブロックサイズのインポート:(特定のコマンドはバージョンによって異なりますfilefrag
)
# filefrag -s -v trim.test
File size of trim.test is 1048576 (256 blocks, blocksize 4096)
ext logical physical expected length flags
0 0 34048 256 eof
trim.test: 1 extent found
デバイスとマウントポイントを取得します。
# df trim.test
/dev/mapper/something 32896880 11722824 20838512 37% /mount/point
この設定を有効にすると、アドレスとバイトブロックの長さに-patternがtrim.test
追加されたファイルが生成されます。yes
/dev/mapper/something
34048
256
4096
デバイスから直接読み取ると、次のyes
パターンが生成されます。
# dd bs=4096 skip=34048 count=256 if=/dev/mapper/something | hexdump -C
00000000 79 0a 79 0a 79 0a 79 0a 79 0a 79 0a 79 0a 79 0a |y.y.y.y.y.y.y.y.|
*
00100000
TRIMが有効な場合、ファイルを削除するときにこのモードを変更する必要があります。キャッシュも削除する必要があります。そうしないと、dd
ディスクからデータを再読み込みできません。
# rm trim.test
# sync
# fstrim -v /mount/point/ # when not using 'discard' mount option
# echo 1 > /proc/sys/vm/drop_caches
# dd bs=4096 skip=34048 count=256 if=/dev/mapper/something | hexdump -C
ほとんどのSSDではゼロモードになります。
00000000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
*
00100000
暗号化が含まれている場合は、ランダムなパターンが表示されます。
00000000 1f c9 55 7d 07 15 00 d1 4a 1c 41 1a 43 84 15 c0 |..U}....J.A.C...|
00000010 24 35 37 fe 05 f7 43 93 1e f4 3c cc d8 83 44 ad |$57...C...<...D.|
00000020 46 80 c2 26 13 06 dc 20 7e 22 e4 94 21 7c 8b 2c |F..&... ~"..!|.,|
これは、物理的なクリーンアップの後、暗号化層がゼロを読み取り、これらのゼロを「ランダム」データとして復号化するためです。
yes
- パターンがまだ存在する場合は、クリーンアップが行われていない可能性があります。
答え2
これはただ台本なのに、もしかしたら怠惰な方が来たら共有したかったです。出身です受け入れられた回答~からフロストスーツ。
#!/bin/bash # #このスクリプトには、商品性、特定の目的への適合性、または侵害に対する黙示的な保証が含まれますが、これらに限定されず、明示的または黙示的であるか、いかなる種類の保証もなく「現状のまま」提供されます。 # #ライセンスGPL2 # #作成者:Desgua 2014/04/29 関数のクリーニング{ CD「$パスタ」 [ -f test-trim-by-desgua ] && rm test-trim-by-desgua && echo "一時ファイルが削除されました" エコ「こんにちは」 0番出口 } トラップエコーが「中断されました」。 ;清潔0 'INT HUP; if [[ "$(echo $USER)" != "root" ]]; read -n 1 -p' ルートになりますか? [はい/いいえ] 'a if [[$a =="Y" || $a == "y" || $a == "" ]]; Sudo $0 $1 0番出口 その他 エコ」 このスクリプトにはroot権限が必要です。 」 1番出口 フィリピン諸島 フィリピン諸島 名前=$(echo $0 | sed's/.*\///') if [ $# -ne 1 ]; エコ」 使用法: $name/folder/to/test/ 」 1番出口 フィリピン諸島 パスタ = $1 -n 1 -p' fstrim を使用しますか? [はい/いいえ] 'a if [[$a =="Y" || $a == "y" ]]; FS=1 フィリピン諸島 方法= while [[ "$method" != "1" && "$method" != "2" ]] do read -n 1 -s -p '方法を選択してください: [1] hdparm(LVMのLUKSでは失敗する) [2] filefrag(警告:強制終了する必要がある場合があります。端末を閉じてください。終了しない出力が表示された場合はクリーンアップが成功した場合があります。) 'メソッド 完璧 関数SDATEST { ディスク=$(fdisk -l | grep /dev/sda) if ["$disk" == "" ]; エコ」 fdiskが見つかりません/dev/sda 」 1番出口 フィリピン諸島 } 機能チェック{ echo "/入力中" echo; CD$パスタ echo "$pasta で test-trim-by-desgua ファイルを生成する" echo dd if=/dev/urandom of=test-trim-by-desgua count=10 bs=512k echo "2秒間同期しています。" 同期 睡眠2 hdparm --fibmap テスト pruning-by-desgua lbab=$(hdparm --fibmap test-trim-by-desgua | tail -n1 | awk '{ print $2 }') echo "見てわかるように、ファイルが作成され、そのLBAは$ lbabから始まります。" echo echo "2秒間同期しています。" 同期 睡眠2 echo "test-trim-by-desguaファイルの削除中"; desguaのrmテストトリム トラップエコー;エコが「中断されました」。 ;エコー;0 '終了INT echo "2秒間同期しています。" 同期 睡眠2 if[["$fs"=="1"]]; echo "fstrim $pasta && 睡眠 2" ; fstrim $パスタ 睡眠2 フィリピン諸島 echo "$lbab セクタで読んだ内容です:" hdparm --読み取りセクタ $lbab /dev/sda pass=$(hdparm --read-sector $lbab /dev/sda | grep "0000 0000 0000 0000") if [[ $pass == "" ]]; エコ」 クリーンアップに失敗しました... 0000 0000 0000 0000のみ見てください... 」 その他 エコ「成功!!!」 フィリピン諸島 0番出口 } 関数LUKSTEST { #リファレンス:https://unix.stackexchange.com/questions/85865/trim-with-lvm-and-dm-crypt# エコ1> /proc/sys/vm/drop_caches CD$パスタ echo "'is' ファイルを作成しています。" はいdd iflag=fullblock bs=1M 個数=1 of=test-trim-by-desgua #position = `filefrag -s -v test-trim-by-desgua | grep "eof" awk '{印刷$3}'` location=`filefrag -s -v test-trim-by-desgua| grep "eof"| s|\.\..*||' [["$position" == "" ]] && echo "ファイルの場所が見つかりません。LVMでLUKSを使用していますか?" device = ` df test-trim-by-desgua | grep "dev/" awk '{印刷$1}'' yes=`dd bs=4096 スキップ=$位置数=256 if=$device|hexdump-C` echo "次の行に次のパターンが表示されます。 00000000 79 0a 79 0a 79 0a 79 0a 79 0a 79 0a 79 0a 79 0a |yyyyyyyy| $はい 」 if [[``echo "$yes" | grep "yyy"`" == "" ]]; echo "モードを確認できません。問題が発生しました。終了します。" きれいです。 その他 echo "モードが確認されました。" フィリピン諸島 echo "一時ファイルを削除してください。" desguaのrmテストトリム 「同期中」が表示されます。 同期 睡眠1 if[["$fs"=="1"]]; echo "fstrim -v $pasta && sleep 2" ; fstrim -v $パスタ 睡眠2 フィリピン諸島 #キャッシュの削除 エコ1> /proc/sys/vm/drop_caches echo "次の行には、次のようなyesパターンを表示しないでください。 00000000 79 0a 79 0a 79 0a 79 0a 79 0a 79 0a 79 0a 79 0a |yyyyyyyy| 次の場合、剪定は機能しません。 `dd bs=4096 スキップ=$位置数=256 if=$device |hexdump-C`" yes=`dd bs=4096 スキップ=$位置数=256 if=$device|hexdump-C` if [[ "`echo "$yes" | grep "yyy"`" != "" ]] then echo "トリムは機能しません。" その他 echo 「トリムが動作しています!」 フィリピン諸島 きれいです。 } if [["$method" == "1" ]]; データテスト テスト; elif [["$method" == "2" ]]; 幸運テスト フィリピン諸島 0番出口
答え3
テストルーチンが正しくありません。ファイルシステムがあるブロックデバイスに関連するセクタ番号を取得しています。この場合、ブロックデバイスは論理ボリュームです。もちろん、論理ボリュームは物理ボリュームの最初のセクタから始まりません(連続的ではないかもしれません)。
論理ボリュームが物理ボリュームのセクタ0から始まっても(そうではありません)、物理ボリュームは実際には別のデバイスマッパーターゲットであり、このターゲットは暗号化に使用されます。前にLUKSヘッダーがある可能性があるため、セクター番号も一致しません。
セクタ番号をベースディスクにマッピングする場合は、dmsetup tables
必要な情報を取得できます。ここに貼り付ける場合は、バージョンが出力にキーを表示しないことを確認してください(すべて0でマークする必要があります)! (持っている回復なし漏洩した鍵——変えられない--パスワードを知らせるよりもはるかに悪いです.)
デバッグするには(セクタマッピングが決定されたら)、最低レベルで起動して動作することを確認することをお勧めします。 /dev/sdaXで直接ファイルシステムをトリミングして動作していることを確認します(デバイスが嘘をついている可能性が高く、クリーンアップ操作はゼロを再読み込みしません)。次に、その上でdm-cryptを実行し、その上にファイルシステムをクリーンアップして動作することを確認します。最後に、LVMを一番上に置き、機能していることを確認します。