向实例添加永久性磁盘

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

准备工作

如需使用 gdcloud 命令行界面 (CLI) 命令,请确保您已下载、安装、 并配置 gdcloud CLI。 GDC 经过网闸隔离的设备的所有命令都使用 gdcloud 或 kubectl CLI,并且需要操作系统 (OS) 环境。

获取 kubeconfig 文件路径

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

  1. 找到 Management API 服务器名称,或向平台管理员 (PA) 询问服务器名称。

  2. 如果您没有 Management API 服务器的 kubeconfig 文件,请登录并生成该文件。

  3. 使用该路径替换这些说明中的 MANAGEMENT_API_SERVER{"</var>"}}。

请求权限和访问权限

如需执行本页面列出的任务,您必须具有 Project VirtualMachine Admin 角色。请按照以下步骤操作,以 验证 您是否具有 Project VirtualMachine Admin (project-vm-admin) 角色,或者让您的 Project IAM 管理员在虚拟机所在的项目的命名空间 中为您 分配 该角色。

对于使用 GDC 控制台或 gdcloud CLI 执行的虚拟机操作,请让您的 Project IAM 管理员为您分配 Project VirtualMachine Admin 角色和 Project Viewer (project-viewer) 角色。

将磁盘挂接到虚拟机

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

控制台

  1. 在导航菜单中,点击虚拟机 > 实例 。

  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 Management 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
    

    示例输出显示了磁盘的 UUID accc19c5-d0d6-4157-9672-37d4e1d48eb5

      /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 列为 列出 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 设置为 nofail 或 nobootwait,也要使 /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
    

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