【发布时间】:2016-10-25 06:49:42
【问题描述】:
VMware 6.5 announced 支持使用支持 SCSI 主要命令 - 4 (SPC-4) 的 VMFS6 和 Linux 虚拟机的 UNMAP 命令(存储系统上的精简 LUN 的空间回收)。 哪个版本的 Linux 内核开始支持 VMware 6.5 UNMAP 的 SPC-4? 这很有帮助article。
【问题讨论】:
VMware 6.5 announced 支持使用支持 SCSI 主要命令 - 4 (SPC-4) 的 VMFS6 和 Linux 虚拟机的 UNMAP 命令(存储系统上的精简 LUN 的空间回收)。 哪个版本的 Linux 内核开始支持 VMware 6.5 UNMAP 的 SPC-4? 这很有帮助article。
【问题讨论】:
这不是“Linux 何时会支持 SPC-4 用于 UNMAP”的问题(您始终可以尝试发送原始 SCSI 命令,而 Linux 不必真正“理解”这些命令)所以我认为您的意思是问“哪个版本的 Linux 会在适当的 ESXi 磁盘上自动通告 discard?”。
在过去的几年里,只要“磁盘”说它可以支持 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 页面仅在以下情况下发生:a)它以某种方式被强制(通过 er,“古怪”设备的显式怪癖)或 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 位。如果您查看磁盘的“逻辑块配置”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 必须满足正确的要求)。
【讨论】:
esxcli --server=server_name system settings advanced set --int-value 1 --option /VMFS6/EnableBlockDelete ?
UNMAP 支持最早出现在ext4 文件系统的2.6.27 到2.6.28 时间范围内。 Wikipedia page for TRIM/UNMAP 专门列出了内核版本2.6.28-25。
UNMAP 支持专门与文件系统相关联,因为文件系统知道何时完成了一系列块,并可以将它们释放回底层设备。确保选择支持它的文件系统!
this SNIA presentation 的 Community Driven Feature: Discard Support 部分有一个很好的总结。如上所述,来自2.6.32 的内核版本应该有很好的支持。特别是,这些更改使其成为主流 RHEL6。所以,到目前为止,它已经有一段时间了!
【讨论】: