按照本页中的说明,创建非启动磁盘并将其挂接到虚拟机 (VM)。
准备工作
如需使用 gdcloud
命令行界面 (CLI) 命令,请确保您已下载、安装并配置 gdcloud
CLI。Distributed Cloud 的所有命令都使用 gdcloud
或 kubectl
CLI,并且需要操作系统 (OS) 环境。
获取 kubeconfig 文件路径
如需针对管理 API 服务器运行命令,请确保您拥有以下资源:
登录并生成管理 API 服务器的 kubeconfig 文件(如果您还没有)。
使用管理 API 服务器的 kubeconfig 文件路径替换这些说明中的
MANAGEMENT_API_SERVER
。
请求权限和访问权限
如需执行本页面中列出的任务,您必须具有 Project VirtualMachine Admin 角色。按照相关步骤验证您是否在虚拟机所在项目的命名空间中拥有 Project VirtualMachine Admin (project-vm-admin
) 角色。
对于使用 GDC 控制台或 gdcloud CLI 的虚拟机操作,请让您的项目 IAM 管理员为您分配“Project VirtualMachine Admin”角色和“Project Viewer”角色 (project-viewer
)。
将磁盘挂接到虚拟机
创建非启动磁盘并将其挂接到虚拟机。每个额外的磁盘都可以指定自定义映像或空白磁盘。您可以一次性向虚拟机添加多个磁盘。
控制台
在导航菜单中,依次点击 Virtual Machines > Instances。
在虚拟机列表中,点击某个虚拟机的名称以查看其详细信息。
点击添加新磁盘。
在确认对话框中,点击停止以停止虚拟机。
等待几分钟,直到虚拟机停止。
点击刷新。
当虚拟机处于停止状态时,再次点击添加新磁盘。
在“添加磁盘”对话框中,选择新磁盘或现有磁盘。
如需预配新磁盘,请点击新磁盘标签页。
- 在磁盘名称字段中,输入在项目中唯一的磁盘新名称。
- 在大小字段中,输入介于 10 到 65536 GiB 之间的磁盘大小。例如,10 GiB。
- 在删除规则部分,点击保留磁盘或删除磁盘。
如需选择现有磁盘,请点击现有磁盘标签页。
- 在磁盘列表中,选择一个磁盘。
- 在“删除规则”部分,点击保留磁盘或删除磁盘。
点击保存。该磁盘会显示在虚拟机的磁盘列表中。
API
创建
VirtualMachineDisk
:kubectl --kubeconfig MANAGEMENT_API_SERVER apply -n PROJECT -f - <<EOF apiVersion: virtualmachine.gdc.goog/v1 kind: VirtualMachineDisk metadata: name: NON_BOOT_BLANK_DISK spec: size: NON_BOOT_BLANK_DISK_SIZE EOF
将
VirtualMachineDisk
添加到现有的VirtualMachine
spec.disks
中:kubectl --kubeconfig MANAGEMENT_API_SERVER edit virtualmachines.virtualmachine.gdc.goog -n PROJECT VM_NAME
在文本编辑器中修改以下内容:
... disks: - virtualMachineDiskRef: name: VM_BOOT_DISK_NAME boot: true - virtualMachineDiskRef: name: NON_BOOT_BLANK_DISK autoDelete: false ...
使用以下定义替换变量。
变量 定义 MANAGEMENT_API_SERVER
管理 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
-
sudo blkid /dev/DEVICE_NAME
示例输出显示了磁盘的
accc19c5-d0d6-4157-9672-37d4e1d48eb5
UUID/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
条目是否正确:cat /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
如果您分离了此磁盘或从此虚拟机的启动磁盘创建快照,请修改 /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 EOF
kubectl create secret -n PROJECT generic VM_NAME-mount-script --from-file=script=mount-disk-script
rm mount-disk-script
将启动脚本添加到虚拟机。
kubectl --kubeconfig MANAGEMENT_API_SERVER edit virtualmachines.virtualmachine.gdc.goog -n PROJECT VM_NAME
修改
spec.startupScripts
以包含 Secret 名称。apiVersion: virtualmachine.gdc.goog/v1 kind: VirtualMachine metadata: name: VM_NAME namespace: PROJECT spec: … startupScripts: - name: mount-script scriptSecretRef: name: VM_NAME-mount-script
如需详细了解如何配置启动脚本,请参阅。