我目前正在為無碟啟動設定 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