哪个版本的 Linux 内核开始支持 VMware 6.5 UNMAP 的 SPC-4

Which version of Linux Kernel start to support SPC-4 for VMware 6.5 UNMAP

VMware 6.5 announced 支持 UNMAP 命令(Space 从存储系统上的精简 LUN 回收)VMFS6 和 Linux 支持 SCSI 主命令的虚拟机 - 4(SPC- 4). Linux 哪个版本的内核开始支持 VMware 6.5 UNMAP 的 SPC-4? 这很有帮助 article

UNMAP 支持最早出现在 2.6.272.6.28 时间范围内 ext4 文件系统。 Wikipedia page for TRIM/UNMAP 专门列出内核版本 2.6.28-25

UNMAP 支持专门与文件系统相关联,因为文件系统知道何时完成一系列块,并可以将它们释放回底层设备。请务必选择支持它的文件系统!

社区驱动功能:放弃支持 this SNIA presentation 部分下有一个很好的总结。如前所述,来自 2.6.32 的内核版本应该有很好的支持。特别是,所做的更改使其成为主流 RHEL6。所以,到目前为止,它已经存在了一段时间!

这不是 "When will Linux support SPC-4 for UNMAP" 的问题(您总是可以尝试发送原始 SCSI 命令,而 Linux 实际上不必 "understand" 那些)所以我认为您的意思是问 "which version of Linux automatically advertises discard on appropriate ESXi disks?".

在过去的几年里,只要 "disk" 说它可以支持 SCSI 标准 SPC-2 或更高 Linux 就会继续检查并公开丢弃(又名 TRIM 或 UNMAP) 支持(如果可用)。公开丢弃支持随提交 https://github.com/torvalds/linux/commit/c98a0eb0e90d1caa8a92913cd45462102cbd5eaf which eventually turned up in 2.6.39. See https://github.com/torvalds/linux/blob/v4.8/include/scsi/scsi_device.h#L546 which shows how reading the VPD pages only happens if a) It is somehow forced (via explicit quirks for er, "quirky" devices) or b) the device claims to implement at least the SCSI SPC-2 specifcation. In turn being able to read VPD pages is needed for checking if the device supports thin provisioning over on https://github.com/torvalds/linux/blob/v4.8/drivers/scsi/sd.c#L2840 .

我检查了 ESXi 6.0 上的精简配置 VMDK 磁盘,版本 11 VM 运行 Ubuntu 16.04,来宾 OS 设置到 Ubuntu 64 位。如果您查看磁盘的 "Logical block provisioning" VPD 页面(通过 sg_vpd -p lbpv),您会被告知:

Logical block provisioning VPD page (SBC):
  Unmap command supported (LBPU): 1
  Write same (16) with unmap bit supported (LBWS): 0
  Write same (10) with unmap bit supported (LBWS10): 0

(我必须在 VM 上将高级选项 EnableBlockDelete 设置为 1 才能获得此信息)

如果您查看 READCAPACITY(16) 结果(通过 sg_readcap -16):

Read Capacity results:
   Protection: prot_en=0, p_type=0, p_i_exponent=0
   Logical block provisioning: lbpme=1, lbprz=1

所以又在自称瘦

但是 sg_inq 显示磁盘仅声称支持 SCSI-2:

standard INQUIRY:
  PQual=0  Device_type=0  RMB=0  LU_CONG=0  version=0x02  [SCSI-2]

(SCSI-2 是 SPC-2 以下的一些修订版,请参阅 https://github.com/torvalds/linux/blob/v4.8/include/scsi/scsi.h#L253 以了解 Linux 如何订购 SCSI 规格版本。

所以Linux不会通告丢弃:

grep . /sys/block/sdc/queue/discard_max_bytes
0

任何尝试使用丢弃的东西对我来说都会失败:

# blkdiscard --offset 0 --length=2048 /dev/sdc
blkdiscard: /dev/sdc: BLKDISCARD ioctl failed: Operation not supported

尽管如此,还是可以手动发送原始 SCSI UNMAP:

# sg_unmap --lba=0 --num=2048 /dev/sdc

(请注意,取消映射操作的最小大小为 1MByte,否则您将返回错误)

TLDR; Linux 中的广告丢弃已在 2.6.39 中添加,但几乎所有 Linux 都可以手动通过 SCSI UNMAP 命令(并且在 ESXi 上,您的 VM 必须满足正确的要求)。