通过 iSCSI 进行 TRIM/UNMAP Zvol

通过 iSCSI 进行 TRIM/UNMAP Zvol

我目前正在设置用于无盘启动的 SAN。我的后端由通过 iSCSI 共享的 ZFS-Vol 组成。到目前为止,除了 TRIM/UNMAP 之外,一切都运行良好。为了测试目的,我在 VirtualBox 中设置了两个运行 Ubuntu20.04 的虚拟机,它们通过具有静态 IPv4 地址的内部网络联网。在目标 (tgt) 上,有第二个使用 ZFS 格式化的虚拟驱动器。在这个 zpool 上,我创建了一个 zVol 并使用 GPT 和 ext4 对其进行格式化。

/etc/tgt/conf.d/iscsi.conf
<target example.com:lun1>
    <backing-store /dev/zvol/tank/iscsi_share>
        params thin_provisioning=1
    </backing-store>
    initiator-address 192.168.0.2
</target>

在启动器(open-iscsi)上,我使用此命令来启动 TRIM 操作:

sudo mount /dev/sdb1 /iscsi-share
sudo dd if=/dev/zero of=/iscsi-share/zero bs=1M count=512
sudo rm /iscsi-share/zero
sudo fstrim /iscsi-share

但 shell 响应“fstrim: /iscsi-share: 不支持丢弃选项”。如果我在目标机器上发出这些命令,zVol 的“REFER”属性会按预期降低。

由于我在网上搜索时什么也没找到,所以我没有找到任何关于为什么这不起作用或者这是否可能的线索。


编辑:当我得到使用该选项的建议时精简配置

在我重新分区驱动器并将其安装到启动器上后,我收到了blk_update_request: critical target error, dev sdb, sector 23784 op 0x9:(WRITE_ZEROES) flags 0x800 phys_seg 0 prio class 0 几个扇区的错误消息,在创建和删除我的测试文件后,fstrim发送了消息

blk_update_request: I/O error, dev sdb, sector 68968 op 0x3:(DISCARD) flags 0x800 phys_seg 1 prio class 0
fstrim: iscsi-share: FITRIM ioctl failed: Input/output error

编辑:因为有答案提到利奥我现在也尝试了 targetcli。在那里,我在 /backstores/block/iscsi 下设置了一个带有 zVol 的目标set attribute emultate_tpu=1。将其导入启动器后,我对其进行了重新分区、格式化并将其挂载到启动器上。然后我创建了我的测试文件,删除了它并发出了命令fstrim,它成功了。谢谢你的帮助。

答案1

LIO 默认禁用 UNMAP。如果要启用它,则应emulate_tpu在目标上设置属性。

答案2

您所问的问题与 iSCSI 目标实现高度相关。它们中的大多数不执行 1:1 SCSI 命令映射,因此如果 iSCSI 目标模拟硬盘 - 它不会绕过无法识别的命令(当然包括 UNMAP)到后端的底层存储,除非您明确要求 iSCSI 目标这样做。使用 TGT,您指的是在配置文件中为虚拟 LUN 指定“thin_provisioning=1”。

答案3

在 Ubuntu 20.04 中,TRIM 默认每周运行一次,因此即使你手动运行它也不会有问题。你可以在 fstrim.service 和 fstrim.timer 中检查这一点,以防万一:https://askubuntu.com/questions/1034169/is-trim-enabled-on-my-ubuntu-18-04-installation

但是,正如前面提到的,这确实看起来您需要在目标上启用 UNMAP。由于许多 SATA SSD 存在 UNMAP 问题,因此默认情况下在 LIO 中禁用它:http://www.linux-iscsi.org/Doc/LIO%20Admin%20Manual.pdf

当然,顺便提一下,当 iSCSI 目标本身支持 TRIM/UNMAP 而无需进一步修改时,事情会变得容易得多。以下是一个例子:https://forums.starwindsoftware.com/viewtopic.php?f=5&t=5343

相关内容