fstrim 似乎没有修剪使用 lvm 和 dm-crypt 的分区

Nef*_*pus 10 ssd lvm dm-crypt xfs fstrim

我尝试使用 dm-crypt 和 LVM 设置 Fedora 25,但很难使 TRIM 工作。

$ sudo fstrim -av                                                                            
/boot: 28.6 MiB (30003200 bytes) trimmed
/: 56.5 GiB (60672704512 bytes) trimmed

$ sudo fstrim -av                                                                            
/boot: 0 B (0 bytes) trimmed
/: 56.5 GiB (60671877120 bytes) trimmed
Run Code Online (Sandbox Code Playgroud)

从上面的输出中可以看出,重复运行fstrim在未加密的ext4 上有效 /boot,但似乎对/(在同一磁盘上)没有影响。

设置是 SSD -> dm-crypt -> LVM -> XFS

$ lsblk -D                                                                                                                                                                                     
NAME                                          DISC-ALN DISC-GRAN DISC-MAX DISC-ZERO
sda                                                  0      512B       2G         0
??sda2                                               0      512B       2G         0
? ??luks-dd5ce54a-34c9-540c-a4cf-2a712b8a3a5e        0      512B       2G         0
?   ??fedora-root                                    0      512B       2G         0
??sda1                                               0      512B       2G         0
Run Code Online (Sandbox Code Playgroud)

根据这个问题,DISC-ZERO == 0 应该不是问题

# cat /etc/crypttab
luks-dd... UUID=dd.. none discard

# cat /etc/lvm/lvm.conf
devices {
...
     issue_discards = 1
...
}
Run Code Online (Sandbox Code Playgroud)

我还添加了rd.luks.options=discard选项/etc/default/grub,并更新了 initramfs 和 grub.cfg:

# grub2-mkconfig -o /boot/grub2/grub.cfg
# dracut -f
Run Code Online (Sandbox Code Playgroud)

丢弃选项确实正确传播:

# dmsetup table luks-d...                                                                                                                        
0 233385984 crypt aes-xts-plain64 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 0 8:2 4096 1 allow_discards
Run Code Online (Sandbox Code Playgroud)

我已经尝试了可以​​在网上找到的上述设置的变体,但这似乎遵循手册页。我没有尝试使用不同的文件系统,但应该支持 XFS。

sou*_*edi 6

我认为您的测试与文档 ( man fstrim)不符。

-v, --verbose

详细执行。使用此选项 fstrim 将输出从文件系统沿块堆栈向下传递到设备以进行潜在丢弃的字节数。从存储设备的角度来看,这个数字是最大丢弃量,因为称为重复的 FITRIM ioctl 将不断重复发送相同的扇区进行丢弃。

fstrim 每次都会报告相同的潜在丢弃字节,但只有在丢弃之间写入​​的扇区才会被存储设备实际丢弃。此外,内核块层保留调整丢弃范围的权利,以适应 raid 条带几何、LVM 设置中的非修剪设备等。这些减少不会反映在 fstrim_range.len(--length 选项)中。

我建议使用blktrace寻找丢弃请求,即在您运行 fstrim 的同时。希望它会显示丢弃请求是否正在提交到堆栈底部的块设备。您可以比较 sda1 和 sda2 之间的结果(在全新启动后,以避免在 sda1 上出现未记录的行为)。

btrace -a discard $DEV
Run Code Online (Sandbox Code Playgroud)

  • 仅供参考,您可以运行`blktrace -d $DEV -a discard -o - | blkparse -i -` 获取实时输出。您可能想将其添加到您的答案中 :) 谢谢 (2认同)