关于iSCSI环境下SCSI WRITE SAME与COMPARE AND WRITE功能的使用场景及触发方式的技术问询
关于iSCSI环境下SCSI WRITE SAME与COMPARE AND WRITE功能的使用场景及触发方式的技术问询
我来梳理下这两个SCSI命令的实际使用情况,以及触发方式:
一、支持这两个命令的操作系统/环境
WRITE SAME
你观察到的Linux内核主要在target侧使用是对的,但发起端并非完全不用——只是常规场景下不会自动触发,需要借助专用工具或特定存储场景:
- FreeBSD的存储发起端在处理磁盘零填充、批量克隆相同数据块时,会主动下发WRITE SAME命令来提升效率;
- VMware ESXi是这类命令的典型使用者,在创建精简置备虚拟机磁盘、批量同步相同扇区数据时,底层会自动调用WRITE SAME,减少不必要的数据传输;
- 一些专用存储OS(比如NetApp ONTAP、Dell PowerStore的发起端组件)也会在存储管理操作中用到它。
COMPARE AND WRITE(你提到的WRITE COMPARE应该是这个标准SCSI命令)
这个命令主打原子性的“比较-写入”操作,多用于数据一致性要求高的场景:
- IBM AIX的存储栈在处理数据库事务、分布式锁这类场景时会支持;
- Windows Server 2016及以后版本的部分存储驱动,配合第三方存储工具可以触发,但普通Windows 10发起端确实很少用到;
- 部分分布式存储系统的客户端,会用这个命令来实现数据的原子更新,避免并发写入冲突。
二、触发方式(常规IO不会直接触发,需通过以下途径)
这两个命令属于SCSI层的低级指令,常规的write()系统调用或文件管理器操作不会触达,需要借助专门工具或自定义开发:
- 专用SCSI工具:Linux下的
sg3_utils工具包是常用选择,比如:- 触发WRITE SAME填充零数据:
sg_write_same --zero /dev/sdb - 触发COMPARE AND WRITE:
sg_compare_and_write --offset=0x1000 --length=0x400 /dev/sdb compare_data.bin write_data.bin
- 触发WRITE SAME填充零数据:
- 存储管理软件:比如VMware vSphere创建精简置备磁盘、专业磁盘克隆工具(如Clonezilla的特定模式),底层会自动下发对应命令;
- 自定义应用开发:通过操作系统的SCSI直通接口实现,比如Linux下用
ioctl配合SG_IO指令,Windows下用DeviceIoControl调用相关控制码,直接在应用中构造并发送SCSI命令包。
备注:内容来源于stack exchange,提问作者Folkert van Heusden




