本文档介绍了如何将永久性虚拟机 (VM) 磁盘附加到 Google Distributed Cloud (GDC) 气隙环境中的实例。
将非启动磁盘挂接到虚拟机,以满足特定的工作负载要求。 将存储空间与虚拟机实例分离可确保您的关键数据独立于虚拟机生命周期而得以保留,同时自动伸缩性能和容量以满足您的工作负载需求。
本文档适用于平台管理员或应用运维人员群组中的开发者,他们需要在 Distributed Cloud 环境中添加和配置虚拟机磁盘。如需了解详情,请参阅 GDC 网闸隔离配置文档的受众群体。
准备工作
如需使用 gdcloud 命令行界面 (CLI) 命令,请确保您已下载、安装并配置 gdcloud CLI。Distributed Cloud 的所有命令都使用 gdcloud 或 kubectl CLI,并且需要操作系统 (OS) 环境。
获取 kubeconfig 文件路径
如需针对 Management API 服务器运行命令,请确保您拥有以下资源:
登录并生成 Management API 服务器的 kubeconfig 文件(如果您还没有)。
使用 Management API 服务器的 kubeconfig 文件路径替换这些说明中的
MANAGEMENT_API_SERVER。
申请 IAM 角色
请与您的项目 IAM 管理员联系,请求为您的项目授予以下角色:
Project VirtualMachine Admin (
project-vm-admin):在项目命名空间中创建、修改、列出和删除虚拟机。Project Viewer(
project-viewer):查看项目命名空间中的所有资源。
所有虚拟机角色都必须绑定到虚拟机所在项目的命名空间。按照相关步骤验证您的访问权限。
将磁盘挂接到虚拟机
创建非启动磁盘并将其挂接到虚拟机。每个额外的磁盘都可以指定自定义映像或空白磁盘。您可以一次向虚拟机添加多个磁盘。
控制台
在导航菜单中,依次点击虚拟机 > 实例。
在虚拟机列表中,点击某个虚拟机的名称以查看其详细信息。
点击添加新磁盘。
在确认对话框中,点击停止以停止虚拟机。
等待几分钟,让虚拟机停止。
点击刷新。
当虚拟机处于停止状态时,再次点击添加新磁盘。
在“添加磁盘”对话框中,选择新磁盘或现有磁盘。
如需预配新磁盘,请点击新磁盘标签页。
- 在磁盘名称字段中,输入在项目中唯一的磁盘新名称。
- 在大小字段中,输入介于 10 到 65536 GiB 之间的磁盘大小。例如,10 GiB。
- 在删除规则部分,点击保留磁盘或删除磁盘。
如需选择现有磁盘,请点击现有磁盘标签页。
- 在磁盘列表中,选择一个磁盘。
- 在“删除规则”部分,点击保留磁盘或删除磁盘。
点击保存。该磁盘会显示在虚拟机的磁盘列表中。
API
创建
VirtualMachineDisk:kubectl --kubeconfig MANAGEMENT_API_SERVER \ -n PROJECT \ apply -f - <<EOF apiVersion: virtualmachine.gdc.goog/v1 kind: VirtualMachineDisk metadata: name: NON_BOOT_BLANK_DISK spec: size: NON_BOOT_BLANK_DISK_SIZE EOF将
VirtualMachineDisk添加到现有的VirtualMachinespec.disks:kubectl --kubeconfig MANAGEMENT_API_SERVER \ -n PROJECT \ edit virtualmachines.virtualmachine.gdc.goog VM_NAME在文本编辑器中修改以下内容:
# … disks: - virtualMachineDiskRef: name: VM_BOOT_DISK_NAME boot: true - virtualMachineDiskRef: name: NON_BOOT_BLANK_DISK autoDelete: false # …使用以下定义替换变量。
变量 定义 MANAGEMENT_API_SERVERManagement API 服务器 kubeconfig 文件。 PROJECT要在其中创建虚拟机的 Google Distributed Cloud 网闸隔离配置 (GDC) 项目。 VM_NAME新虚拟机的名称。 VM_BOOT_DISK_NAME新虚拟机启动磁盘的名称。 NON_BOOT_BLANK_DISK附加磁盘的名称。 NON_BOOT_BLANK_DISK_SIZE额外磁盘的大小,例如 20G。
格式化并装载非启动磁盘
将磁盘挂接到虚拟机后,请执行以下必要步骤,以便在虚拟机中访问该磁盘。
连接到虚拟机
格式化磁盘
按序列号列出挂接到实例的磁盘,然后找到要格式化和装载的磁盘。
ls -l /dev/disk/by-id/此示例输出显示了磁盘名称(以序列号表示):
total 0 lrwxrwxrwx 1 root root 9 Sep 13 23:51 ata-QEMU_HARDDISK_agentSADisk -> ../../sdc lrwxrwxrwx 1 root root 9 Sep 13 23:51 scsi-0ATA_QEMU_HARDDISK_agentSADisk -> ../../sdc lrwxrwxrwx 1 root root 9 Sep 13 23:51 scsi-0QEMU_QEMU_HARDDISK_vm-disk-boot -> ../../sda lrwxrwxrwx 1 root root 10 Sep 13 23:51 scsi-0QEMU_QEMU_HARDDISK_vm-disk-boot-part1 -> ../../sda1 lrwxrwxrwx 1 root root 11 Sep 13 23:51 scsi-0QEMU_QEMU_HARDDISK_vm-disk-boot-part14 -> ../../sda14 lrwxrwxrwx 1 root root 11 Sep 13 23:51 scsi-0QEMU_QEMU_HARDDISK_vm-disk-boot-part15 -> ../../sda15 lrwxrwxrwx 1 root root 9 Sep 13 23:51 scsi-0QEMU_QEMU_HARDDISK_vm-disk-data -> ../../sdb lrwxrwxrwx 1 root root 9 Sep 13 23:51 scsi-1ATA_QEMU_HARDDISK_agentSADisk -> ../../sdc lrwxrwxrwx 1 root root 9 Sep 13 23:51 scsi-SATA_QEMU_HARDDISK_agentSADisk -> ../../sdc lrwxrwxrwx 1 root root 9 Sep 13 23:51 scsi-SQEMU_QEMU_HARDDISK_vm-disk-boot -> ../../sda lrwxrwxrwx 1 root root 10 Sep 13 23:51 scsi-SQEMU_QEMU_HARDDISK_vm-disk-boot-part1 -> ../../sda1 lrwxrwxrwx 1 root root 11 Sep 13 23:51 scsi-SQEMU_QEMU_HARDDISK_vm-disk-boot-part14 -> ../../sda14 lrwxrwxrwx 1 root root 11 Sep 13 23:51 scsi-SQEMU_QEMU_HARDDISK_vm-disk-boot-part15 -> ../../sda15 lrwxrwxrwx 1 root root 9 Sep 13 23:51 scsi-SQEMU_QEMU_HARDDISK_vm-disk-data -> ../../sdb每行箭头 (
->) 后面的信息表示磁盘设备名称。例如,在scsi-SQEMU_QEMU_HARDDISK_vm-disk-data -> ../../sdb中,序列号为scsi-SQEMU_QEMU_HARDDISK_vm-disk-data,设备名称为sdb。从该列表中找到您的磁盘序列号。
可能会影响序列号列表的重要情境特征行为:
- 如果
virtualMachineDiskRef.name值长度超过 20 个字符,则系统仅使用前 20 个字符作为序列号。 - 如果两个磁盘的前 20 个字符相同,则只有第一个磁盘具有序列号。
- 如果
格式化磁盘:
sudo mkfs.ext4 -m 0 -E lazy_itable_init=0,lazy_journal_init=0,discard /dev/disk/by-id/DISK_ID
- 将
DISK_ID替换为要格式化的磁盘的序列号。 - 对于本示例,请指定
scsi-SQEMU_QEMU_HARDDISK_vm-disk-data以格式化整个磁盘而不创建分区表。
为了最大限度地提高磁盘性能,请在 -E 标志中使用推荐的格式化选项。由于您无需在辅助磁盘上为根卷保留空间,因此请指定 -m 0 以使用所有可用的磁盘空间。
装载磁盘
创建用作新磁盘装载点的目录。您可以使用任何目录。以下示例在
/mnt/disks/中创建了一个目录:sudo mkdir -p /mnt/disks/MOUNT_DIR将
MOUNT_DIR替换为要装载磁盘的目录。将磁盘装载到实例,并启用 discard 选项:
sudo mount -o discard,defaults /dev/disk/by-id/DISK_ID /mnt/disks/MOUNT_DIR替换以下内容:
DISK_ID,并替换为要装载的磁盘的序列号。MOUNT_DIR替换为要装载磁盘的目录。
可选:配置对磁盘的读写权限。以下命令会向所有用户授予对磁盘的写入权限 (
a+w)。sudo chmod a+w /mnt/disks/MOUNT_DIR可选:配置虚拟机重启时的自动装载 - 使用通用唯一标识符 (UUID) 或启动脚本。
配置虚拟机重启时的自动装载 - 磁盘 UUID
请将磁盘添加到 /etc/fstab 文件中,以使该磁盘在虚拟机重启时自动重新装载。在操作系统 (OS) 上,设备名称在每次重启时都会发生变化,但设备 UUID 始终指向同一个卷,即使您在系统间移动磁盘也是如此。因此,请务必使用设备 UUID 来配置虚拟机重启时的自动装载。
创建当前
/etc/fstab文件的备份:sudo cp /etc/fstab /etc/fstab.backup列出磁盘的 UUID:
sudo blkid /dev/DEVICE_NAME示例输出显示了磁盘的
accc19c5-d0d6-4157-9672-37d4e1d48eb5UUID/dev/sdb: UUID="accc19c5-d0d6-4157-9672-37d4e1d48eb5" TYPE="ext4"DEVICE_NAME是您要自动装载的磁盘的设备名称。如果您在磁盘上创建了分区表,请在设备名称后添加后缀来指定要装载的分区。 例如,如果sdb是磁盘设备名称,并且您想要装载分区 1,则DEVICE_NAME会变为sdb1。在文本编辑器中打开
/etc/fstab文件,并创建一个包含 UUID 的条目:UUID=UUID_VALUE /mnt/disks/MOUNT_DIR ext4 discard,defaults,MOUNT_OPTION 0 2替换以下内容:
UUID_VALUE,其中磁盘为UUID,列为列出 UUID 命令的输出。MOUNT_DIR替换为装载磁盘的目录。MOUNT_OPTION,并为您的操作系统指定MOUNT_OPTION值,该值用于指定操作系统在启动时无法装载磁盘的情况下要执行的操作。
验证您的
/etc/fstab条目是否正确:以下命令会根据附加到虚拟机的现有磁盘和分区验证
/etc/fstab条目:findmnt --verify以下示例显示了成功验证。您可以放心地忽略预期警告:
[W] your fstab has been modified, but systemd still uses the old version; use 'systemctl daemon-reload' to reload 0 parse errors, 0 errors, 1 warning如果存在错误,请检查
fstab条目是否有效。常见问题是,条目中添加了无效的非打印字符。您可以运行以下命令来显示/etc/fstab文件中的所有特殊字符:cat --show-nonprinting /etc/fstab以下示例展示了有效的输出:
LABEL=cloudimg-rootfs / ext4 defaults 0 1 LABEL=UEFI /boot/efi vfat umask=0077 0 1 UUID=UUID_VALUE /mnt/disks/MOUNT_DIR ext4 discard,defaults,MOUNT_OPTION 0 2确保没有意外字符,例如以
M-或^开头的非打印字符。
如果您分离了此磁盘或从此虚拟机的启动磁盘创建快照,请修改 /etc/fstab 文件并移除此磁盘所对应的条目。即使您将 MOUNT_OPTION 设置为 nofail 或 nobootwait,也应使 /etc/fstab 文件与附加到虚拟机的设备保持同步。在创建启动磁盘快照或分离磁盘之前,请移除这些条目。
配置虚拟机重启时的自动装载 - 虚拟机启动脚本
您还可以使用启动脚本在每次重启时挂载磁盘,方法是将挂载磁盘中的命令添加到启动脚本。在添加用于装载磁盘的脚本之前,请使用格式化磁盘中的命令来格式化磁盘。
创建启动脚本 Secret。
cat <<EOF >>mount-disk-script #!/bin/bash mkdir -p /mnt/disks/MOUNT_DIR mount -o discard,defaults /dev/disk/by-id/DISK_ID /mnt/disks/MOUNT_DIR EOFkubectl --kubeconfig MANAGEMENT_API_SERVER \ -n PROJECT \ create secret generic VM_NAME-mount-script \ --from-file=script=mount-disk-scriptrm mount-disk-script将启动脚本添加到虚拟机。
kubectl --kubeconfig MANAGEMENT_API_SERVER \ -n PROJECT \ edit virtualmachines.virtualmachine.gdc.goog VM_NAME修改
spec.startupScripts以包含密钥名称。apiVersion: virtualmachine.gdc.goog/v1 kind: VirtualMachine metadata: name: VM_NAME namespace: PROJECT spec: # … startupScripts: - name: mount-script scriptSecretRef: name: VM_NAME-mount-script
如需详细了解如何配置启动脚本,请参阅。