在本教程之后,我尝试在ubuntu13.04上使用LVM和dm-crypt安装TRIM:
http://blog.neutrino.es/2013/howto-properly-activate-trim-for-your-ssd-on-linux-fstrim-lvm-and-dmcrypt/
请参阅下面有关我的配置和测试过程的说明。
这是我的配置:
cat /etc/crypttab
sda3_crypt UUID=[...] none luks,discard和
cat /etc/lvm/lvm.conf
# [...]
devices {
# [ ... ]
issue_discards = 1
# [ ... ]
}
# [...]SSD是三星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 4096sync
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 1981sudo 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这似乎表明修剪不起作用。因为
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中的一个bug
希望有人能在那里找到解决方案,或者至少测试设置并验证错误。
现在它起作用了,见已接受的答案。
发布于 2013-08-07 21:04:41
我建议采用不同的测试方法。hdparm有点奇怪,因为它给出的是设备地址,而不是文件系统地址,它没有说明这些地址与哪个设备相关(例如,它解析分区,但不解析devicemapper目标等等)。使用与文件系统地址粘在一起的东西要容易得多,这样就一致了(也许除了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这样设置后,您就有了一个文件trim.test,文件中填充了yes-pattern on /dev/mapper/something at address 34048,其长度为256块的4096字节。
直接从设备中读取这些信息应该会产生yes-pattern:
# 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-pattern仍然存在,则很可能没有进行任何修整。
发布于 2013-08-07 20:15:48
您的测试例程是错误的-您正在获取相对于文件系统所在的块设备的扇区号--在本例中,这是一个逻辑卷。当然,逻辑卷不是从物理卷的第一个扇区开始的(甚至不可能是连续的)。
即使逻辑卷开始于物理卷的0扇区(它没有),那么物理卷实际上是另一个设备映射器目标,这是一个用于加密的设备。而且很可能前面有一个LUKS的头球,所以扇区的数字也不匹配。
如果您想通过将扇区号映射到底层磁盘来工作,dmsetup tables将提供您所需的信息。如果您粘贴在这里,请确保您的版本没有显示输出中的键(它应该显示所有的0's )!(泄露密钥没有任何恢复-它不能更改-这比泄露密码要糟糕得多)。
我建议您从最低级别开始调试(一旦完成扇区映射),并确认它在那里工作。在/dev/sdaX上直接修剪一个文件系统,并确保该文件系统工作正常(设备很可能存在,而TRIM不读取零)。然后将dm-crypt放在上面,并在上面修剪一个文件系统,并确保其工作正常。最后,将LVM放在顶部,并检查它是否有效。
https://unix.stackexchange.com/questions/85865
复制相似问题