在不关闭实例的情况下调整云 VM 磁盘的大小(Google 云)

Resizing cloud VM disk without taking instance down (Google cloud)

所以我看到 google 计算中有一个选项(我假设其他云 VM 供应商中存在相同的选项,所以问题不具体针对 Google 计算,而是针对底层技术)调整磁盘大小而无需重新启动机器,我问,这怎么可能?

即使它对磁盘使用某种抽象,并且他们实际上并没有为 VM 分配物理磁盘,而只是分配磁盘的一部分(或多个磁盘的一部分),一旦磁盘创建于来宾虚拟机具有一定的大小,如何在不重新启动的情况下进行更改?它以某种方式利用 NFS 吗?

这几天直接内置到磁盘协议中。此功能已经存在了一段时间,因为自 1990 年代末以来磁盘已经虚拟化(通过 iSCSI / FibreChannel 等网络协议,或通过 VMware 等硬件的软件模拟版本)。

与 VMware 模型一样,GCE 不需要任何额外的网络跃点或协议来执行此操作;管理程序只是将虚拟磁盘作为物理设备公开,来宾知道其大小可以更改并进行处理。 GCE 为其磁盘使用一种特定于虚拟化的驱动程序类型,称为 VirtIO SCSI,但此功能也在许多其他驱动程序类型中实现(跨越许多 OSes)。


由于磁盘可以随时调整大小,因此磁盘协议需要一种方法来告诉来宾已发生更新。一般而言,这在大多数协议中的工作方式如下:

  • 管理员从管理程序 UI(或他们正在使用的任何存储虚拟化 UI)调整磁盘大小。
  • 来宾内部不会发生任何事情,直到它向磁盘发出 IO。
  • 来宾 OS 通过来宾 OS 中的设备驱动程序向磁盘发出 IO 命令。
  • Hypervisor 模拟该 IO 命令,注意到磁盘已调整大小并且尚未提醒来宾,并且 returns 对来宾的响应告诉它更新其设备视图。
  • 来宾 OS 识别此响应并通过其他命令重新查询设备大小和其他详细信息。

我不是 100% 确定,但我相信其结构如此的原因是传统上磁盘无法将更新发送到 OS,除非 OS 首先请求它们。这可能是因为磁盘无法知道哪些内存可以自由写入,即使知道,也无法通过 OS 同步对该内存的访问。然而,这些限制在启用超高吞吐量/超低延迟 SSD 和 NVRAM 方面变得越来越不真实,因此 NVMe 等新磁盘协议可能会略有不同(我不知道)。