向实例添加永久性磁盘

按照本页中的说明,创建非启动磁盘并将其挂接到虚拟机 (VM)。

准备工作

如需使用 gdcloud 命令行界面 (CLI) 命令,请确保您已下载、安装并配置 gdcloud CLI。Distributed Cloud 的所有命令都使用 gdcloudkubectl CLI,并且需要操作系统 (OS) 环境。

获取 kubeconfig 文件路径

如需针对管理 API 服务器运行命令,请确保您拥有以下资源:

  1. 登录并生成管理 API 服务器的 kubeconfig 文件(如果您还没有)。

  2. 使用管理 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)。

将磁盘挂接到虚拟机

创建非启动磁盘并将其挂接到虚拟机。每个额外的磁盘都可以指定自定义映像或空白磁盘。您可以一次性向虚拟机添加多个磁盘。

控制台

  1. 在导航菜单中,依次点击 Virtual Machines > Instances

  2. 在虚拟机列表中,点击某个虚拟机的名称以查看其详细信息。

  3. 点击添加新磁盘

  4. 在确认对话框中,点击停止以停止虚拟机。

  5. 等待几分钟,直到虚拟机停止。

  6. 点击刷新

  7. 当虚拟机处于停止状态时,再次点击添加新磁盘

  8. 在“添加磁盘”对话框中,选择新磁盘或现有磁盘。

    • 如需预配新磁盘,请点击新磁盘标签页。

      1. 磁盘名称字段中,输入在项目中唯一的磁盘新名称。
      2. 大小字段中,输入介于 10 到 65536 GiB 之间的磁盘大小。例如,10 GiB
      3. 删除规则部分,点击保留磁盘删除磁盘
    • 如需选择现有磁盘,请点击现有磁盘标签页。

      1. 磁盘列表中,选择一个磁盘。
      2. 在“删除规则”部分,点击保留磁盘删除磁盘
  9. 点击保存。该磁盘会显示在虚拟机的磁盘列表中。

  10. 重启虚拟机

API

  1. 创建 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
    
  2. 停止虚拟机

  3. 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
  4. 启动虚拟机

格式化并装载非启动磁盘

将磁盘挂接到虚拟机后,请执行以下必要步骤,以便在虚拟机中访问该磁盘。

连接到虚拟机

通过 SSH 连接到虚拟机

格式化磁盘

  1. 按序列号列出挂接到实例的磁盘,然后找到要格式化和装载的磁盘。

    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

  2. 从该列表中找到您的磁盘序列号。

    可能会影响序列号列表的重要情境特征行为:

    • 如果 virtualMachineDiskRef.name 值长度超过 20 个字符,则仅使用前 20 个字符作为序列号。
    • 如果两个磁盘的前 20 个字符相同,则只有第一个磁盘具有序列号。
  3. 格式化磁盘:

   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 以使用所有可用的磁盘空间。

装载磁盘

  1. 创建用作新磁盘装载点的目录。您可以使用任何目录。以下示例在 /mnt/disks/ 中创建了一个目录:

    sudo mkdir -p /mnt/disks/MOUNT_DIR
    

    MOUNT_DIR 替换为要装载磁盘的目录。

  2. 将磁盘装载到实例,并启用 discard 选项:

    sudo mount -o discard,defaults /dev/disk/by-id/DISK_ID /mnt/disks/MOUNT_DIR
    

    替换以下内容:

    • DISK_ID,并替换为要装载的磁盘的序列号。
    • MOUNT_DIR 替换为要装载磁盘的目录。
  3. 可选:配置对磁盘的读写权限。以下命令会向所有用户授予对磁盘的写入权限 (a+w)。

    sudo chmod a+w /mnt/disks/MOUNT_DIR
    
  4. 可选:配置虚拟机重启时的自动装载 - 使用通用唯一标识符 (UUID)启动脚本

配置虚拟机重启时的自动装载 - 磁盘 UUID

请将磁盘添加到 /etc/fstab 文件中,以使该磁盘在虚拟机重启时自动重新装载。在操作系统 (OS) 上,设备名称在每次重启时都会发生变化,但设备 UUID 始终指向同一个卷,即使您在系统间移动磁盘也是如此。因此,请务必使用设备 UUID 来配置虚拟机重启时的自动装载。

  1. 创建当前 /etc/fstab 文件的备份:

      sudo cp /etc/fstab /etc/fstab.backup
    
  2. 列出磁盘的 UUID

      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

  3. 在文本编辑器中打开 /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 值,该值用于指定操作系统在启动时无法装载磁盘的情况下要执行的操作。
  4. 验证您的 /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 设置为 nofailnobootwait,也应使 /etc/fstab 文件与附加到虚拟机的设备保持同步。在创建启动磁盘快照或分离磁盘之前,请移除这些条目。

配置虚拟机重启时的自动装载 - 虚拟机启动脚本

您还可以使用启动脚本在每次重新启动时挂载磁盘,方法是将挂载磁盘中的命令添加到启动脚本。在添加用于装载磁盘的脚本之前,请使用格式化磁盘中的命令来格式化磁盘。

  1. 创建启动脚本 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
    
  2. 将启动脚本添加到虚拟机。

    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
    

如需详细了解如何配置启动脚本,请参阅