如何使用targetcli禁用iSCSI写入缓存
如何使用targetcli禁用iSCSI写入缓存
看起来你遇到了iSCSI目标端写缓存导致ZFS数据损坏的棘手问题——这种写确认后又丢数据的情况对依赖强一致性的ZFS来说简直是噩梦,我来帮你一步步搞定它。
首先得明确问题根源:你的iSCSI目标端可能在写操作还没真正落到物理磁盘时就返回了成功确认,重启后缓存里的写数据丢失,直接触发了ZFS的一致性检查报错。我们需要从targetcli配置和磁盘硬件缓存两个层面入手,彻底解决这个问题:
1. 调整targetcli的Block Backstore缓存设置
你当前已经用了block类型的backstore,并且显示write-thru activated,但还需要补充几个关键设置来彻底禁用缓存:
- 先进入targetcli交互界面:
targetcli - 导航到你的block存储对象(也就是
ar0):cd backstores/block/ar0 - 禁用写回缓存(确保写操作直接透传到磁盘,不经过目标端缓存):
set wbc_enable=false - 模拟磁盘写缓存关闭(让initiator知道目标端不会缓存写操作,避免initiator依赖错误的缓存逻辑):
set emulate_write_cache=false - 确认当前设置,你应该能看到类似
write-thru activated、wbc_enable: false的状态
2. 关闭磁盘硬件自身的写缓存
光靠targetcli设置还不够,如果物理磁盘本身的硬件写缓存是开启的,还是会有数据丢失风险:
- 退出targetcli后,用
sdparm工具关闭磁盘的写缓存(替换成你的磁盘路径,比如/dev/disk/by-id/ata-ST22000NT001-3LS101_ZX20XTYG):sdparm --clear=WCE /dev/disk/by-id/ata-ST22000NT001-3LS101_ZX20XTYG - 或者用
hdparm(如果是ATA磁盘):hdparm -W 0 /dev/disk/by-id/ata-ST22000NT001-3LS101_ZX20XTYG - 为了确保重启后这个设置生效,你可以把这条命令加到
/etc/rc.local或者创建一个systemd服务来执行。
3. 优化iSCSI TPG的同步写设置
最后还要确保iSCSI目标端的TPG(Target Portal Group)配置强制同步写确认:
- 回到targetcli,导航到你的TPG:
cd iscsi/iqn.2023-07.com.example.host:sn.zx20xtyg/tpg1 - 设置要求所有写操作必须等待磁盘确认完成:
set attribute enforce_pr_isid=true set attribute dataout_timeout=30 set attribute default_cmdsn_depth=1 - 保存所有配置,确保重启后不会丢失:
saveconfig
关于pscsi的问题
你之前尝试用pscsi backstore导致内核崩溃,这其实很常见——pscsi直接暴露物理SCSI设备给initiator,可能会有兼容性问题(比如ZFS发送的某些SCSI命令和目标端内核不兼容),所以还是继续用block backstore更稳妥,我们上面的配置已经能解决写缓存的问题了。
做完这些设置后,重启iSCSI目标端,再重新连接initiator的ZFS池,应该就不会再出现写丢失和数据损坏的情况了。如果之前的ZFS元数据损坏,记得先备份重要数据,再用zpool clear或者必要时从备份恢复。
备注:内容来源于stack exchange,提问作者Malvineous
相关产品推荐
相关产品推荐

