通過 iSCSI 修剪/取消映射 Zvol
我目前正在為無盤啟動設置 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
命令,它工作了。謝謝您的幫助。
LIO 預設禁用 UNMAP。如果你想啟用它,你應該
emulate_tpu
在目標上設置屬性。
您要問的是高度 iSCSI 目標實現特定的。他們中的大多數不執行 1:1 SCSI 命令映射,因此如果 iSCSI 目標模擬硬碟 - 它不會繞過無法辨識的命令(當然包括 UNMAP)到底層儲存@後端除非您明確詢問 iSCSI這樣做的目標。使用 TGT,您可以在配置文件中為您的虛擬 LUN 指定“thin_provisioning=1”。