google-compute-engine - 在不关闭实例的情况下调整云 VM 磁盘大小(谷歌云)
问题描述
所以我看到谷歌计算中有一个选项(我假设其他云虚拟机供应商也存在相同的选项,所以问题不是专门针对谷歌计算,而是在底层技术上)无需重新启动机器即可调整磁盘大小,我请问,这怎么可能?
即使它对磁盘使用某种抽象并且他们实际上并没有为 VM 分配物理磁盘,而只是磁盘的一部分(或许多磁盘的一部分),一旦在来宾 VM 中创建了磁盘一定的大小,如何改变而不需要重新启动?它是否以某种方式利用 NFS?
解决方案
如今,它直接内置于磁盘协议中。这种能力已经存在了一段时间,因为自 1990 年代后期以来磁盘已被虚拟化(通过 iSCSI / FibreChannel 等网络协议,或通过 VMware 等硬件的软件模拟版本)。
与 VMware 模型一样,GCE 不需要任何额外的网络跃点或协议来执行此操作;管理程序只是公开虚拟磁盘,就好像它是一个物理设备一样,来宾知道它的大小可以改变并处理它。GCE 为其磁盘使用一种特定于虚拟化的驱动程序类型,称为 VirtIO SCSI,但此功能也在许多其他驱动程序类型(跨许多操作系统)中实现。
由于可以随时调整磁盘大小,因此磁盘协议需要一种方法来告诉客户已发生更新。一般来说,这在大多数协议中的工作方式如下:
- 管理员从管理程序 UI(或他们正在使用的任何存储虚拟化 UI)调整磁盘大小。
- 在向磁盘发出 IO 之前,来宾内部不会发生任何事情。
- 来宾操作系统通过来宾操作系统中的设备驱动程序向磁盘发出 IO 命令。
- Hypervisor 模拟该 IO 命令,注意到磁盘已调整大小并且客户尚未收到警报,并向客户返回响应,告诉它更新其设备视图。
- 来宾操作系统识别此响应并通过其他命令重新查询设备大小和其他详细信息。
我不是 100% 确定,但我相信它的结构是这样的,传统上磁盘无法将更新发送到操作系统,除非操作系统首先请求它们。这可能是因为磁盘无法知道可以写入哪些内存,即使知道,也无法将对该内存的访问与操作系统同步。但是,这些限制在启用超高吞吐量/超低延迟 SSD 和 NVRAM 方面变得不那么真实了,因此 NVMe 等新磁盘协议的执行方式可能略有不同(我不知道)。
推荐阅读
- git - 如何在 Windows 10 上使用 git 更改相同格式的多个文件名?
- php - Laravel - 将`->map()`与`->firstOrFail()`结合使用的方法?
- c++ - 一个头文件可以包含在多个源文件中,没有重复保护
- javascript - 使用 Highcharts 时如何在堆积柱形图/条形图的特定列上设置亮度效果?
- java - Idea Intellij:Maven 自动生成的工件与手动创建的工件 - 只有自动工作(截图)
- azure - 为什么我的 sudo 命令适用于 ansible 但不适用于 ansible-playbook?
- macos - 启动 Mission Control 时如何隐藏我的 Electron 应用程序窗口?
- python - 只能比较具有相同标签的系列对象 Pandas Python
- hadoop - 无效的表别名或列引用“SYNTHJOIN_xxxxx”
- javascript - 实现用于链接类方法的 JS 装饰器