我目前正在为无盘启动设置 SAN。我的后端由通过 iSCSI 共享的 ZFS-Vol 组成。到目前为止,除了 TRIM/UNMAP 之外,一切都运行良好。为了测试目的,我在 VirtualBox 中设置了两个运行 Ubuntu20.04 的 VM,它们通过具有静态 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”属性会按预期减少。
由于我在搜索网络时一无所获,我没有发现任何关于为什么这不起作用或者这是否可能的提示。
编辑:当我得到使用选项thin_provisioning的建议时。
在我重新分区驱动器并将其安装在启动器上后,我收到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
编辑:由于有提到LIO的答案,我现在也尝试了 targetcli。在那里,我在 /backstores/block/iscsi 和set attribute emultate_tpu=1
. 在将它导入我的启动器后,我重新分区、格式化并将其安装在启动器上。然后我创建了我的测试文件,删除了它并发出了fstrim
命令,它工作了。谢谢您的帮助。
您要问的是高度 iSCSI 目标实现特定的。他们中的大多数不执行 1:1 SCSI 命令映射,因此如果 iSCSI 目标模拟硬盘 - 它不会绕过无法识别的命令(当然包括 UNMAP)到底层存储@后端除非您明确询问 iSCSI这样做的目标。使用 TGT,您可以在配置文件中为您的虚拟 LUN 指定“thin_provisioning=1”。
TRIM 在 Ubuntu 20.04 中默认启用每周运行一次,因此即使您手动运行它也应该没有问题。您可以在 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
LIO 默认禁用 UNMAP。如果你想启用它,你应该
emulate_tpu
在目标上设置属性。