VMware 6.5宣布通过支持 SCSI Primary Commands - 4 (SPC-4) 的 VMFS6 和 Linux 虚拟机支持 UNMAP 命令(存储系统上的精简 LUN 的空间回收)。哪个版本的 Linux 内核开始支持 VMware 6.5 UNMAP 的 SPC-4?这是有用的文章。
2 回答
这不是“Linux 何时支持 SPC-4 用于 UNMAP”的问题(您总是可以尝试发送原始 SCSI 命令,而 Linux 不必真正“理解”这些命令)所以我认为您的意思是问“哪个版本的 Linux 会自动在适当的 ESXi 磁盘上通告丢弃?”。
在过去的几年里,只要“磁盘”说它可以支持 SCSI 标准 SPC-2 或更高版本,Linux 就会继续检查并公开对丢弃(也称为 TRIM 或 UNMAP)的支持(如果可用)。通过提交https://github.com/torvalds/linux/commit/c98a0eb0e90d1caa8a92913cd45462102cbd5eaf公开丢弃支持,最终在 2.6.39 中出现。请参阅https://github.com/torvalds/linux/blob/v4.8/include/scsi/scsi_device.h#L546,它显示了如何读取 VPD 页面仅在以下情况下发生,“古怪”设备)或b)设备声称至少实现了SCSI SPC-2规范。反过来,需要能够读取 VPD 页面来检查设备是否支持精简配置https://github.com/torvalds/linux/blob/v4.8/drivers/scsi/sd.c#L2840。
我检查了 ESXi 6.0上的精简配置 VMDK 磁盘,版本 11 VM 运行 Ubuntu 16.04,Guest OS 设置为 Ubuntu 64 位。如果您查看sg_vpd -p lbpv
磁盘的“逻辑块配置”VPD 页面(通过 ),您会被告知:
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
(我必须在虚拟机上将高级选项设置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 必须满足正确的要求)。
UNMAP
支持最早出现在文件系统的2.6.27
时间2.6.28
范围内ext4
。维基百科页面TRIM/UNMAP
专门列出了内核版本2.6.28-25
。
UNMAP
支持专门与文件系统相关联,因为文件系统知道它何时完成了一系列块,并可以将它们释放回底层设备。确保选择支持它的文件系统!
在此 SNIA 演示文稿的社区驱动功能:放弃支持部分下有一个很好的总结。如上所述,内核版本应该有很好的支持。特别是,这些更改使其成为主流 RHEL6。所以,到目前为止,它已经存在了一段时间!2.6.32