启用嵌套虚拟化


本文档介绍了如何在虚拟机实例上启用嵌套虚拟化,以及如何确认您可以创建嵌套虚拟机。可以使用以下方法之一在虚拟机上启用嵌套虚拟化:

  • 推荐。在新虚拟机或现有虚拟机上启用嵌套虚拟化,方法是在创建虚拟机或更新虚拟机时将 enableNestedVirtualization 字段设置为 true。建议您使用这种方法的原因是您无需创建自定义映像或使用特殊许可密钥。

  • 使用特殊许可密钥启用嵌套虚拟化,具体方法是:创建启动磁盘,使用特殊嵌套虚拟化许可密钥创建自定义映像,然后创建使用自定义映像的虚拟机。

准备工作

  • 设置身份验证(如果尚未设置)。身份验证是通过其进行身份验证以访问 Google Cloud 服务和 API 的过程。如需从本地开发环境运行代码或示例,您可以按如下方式向 Compute Engine 进行身份验证。

    选择标签页以了解您打算如何使用本页面上的示例:

    gcloud

    1. 安装 Google Cloud CLI,然后通过运行以下命令初始化 Google Cloud CLI:

      gcloud init
    2. 设置默认区域和可用区

    REST

    如需在本地开发环境中使用本页面上的 REST API 示例,请使用您提供给 gcloud CLI 的凭据。

      安装 Google Cloud CLI,然后通过运行以下命令初始化 Google Cloud CLI:

      gcloud init

直接在新虚拟机上启用嵌套虚拟化

按照以下流程在虚拟机上直接启用嵌套虚拟化。

gcloud

使用以下 gcloud compute instances create 命令创建启用了嵌套虚拟化的 L1 虚拟机:

gcloud compute instances create VM_NAME \
  --enable-nested-virtualization \
  --zone=ZONE \
  --min-cpu-platform="Intel Haswell"

请替换以下内容:

  • VM_NAME:启用了嵌套虚拟化的新 L1 虚拟机的名称

  • ZONE:启用了嵌套虚拟化的新 L1 虚拟机的可用区

REST

使用以下 instances.insert 方法创建启用了嵌套虚拟化的 L1 虚拟机:

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances
{
  ...
  "name": "VM_NAME",
  ...
  "minCpuPlatform": "Intel Haswell",
  "advancedMachineFeatures": {
    "enableNestedVirtualization": true
  },
  ...
}

请替换以下内容:

  • PROJECT_ID:项目 ID

  • ZONE:启用了嵌套虚拟化的新 L1 虚拟机的可用区

  • VM_NAME:启用了嵌套虚拟化的新 L1 虚拟机的名称

直接在现有虚拟机上启用嵌套虚拟化

使用以下过程在现有虚拟机上启用嵌套虚拟化:

gcloud

  1. 使用以下 gcloud compute instances export 命令导出虚拟机属性:

    gcloud compute instances export VM_NAME \
      --destination=YAML_FILE_PATH \
      --zone=ZONE
    

    请替换以下内容:

    • VM_NAME:要从中导出属性的虚拟机的名称

    • YAML_FILE_PATH:用于保存导出配置数据的 .yaml 文件的路径和文件名

    • ZONE:包含虚拟机的可用区

  2. 在保存在 FILE_PATH 中的虚拟机配置文件中,更新 enableNestedVirtualization 的值。如果该值不在文件中,请添加以下内容:

    advancedMachineFeatures:
      enableNestedVirtualization: true
    
  3. 使用以下 gcloud compute instances update-from-file 命令enableNestedVirtualization 的值更新虚拟机:

    gcloud compute instances update-from-file VM_NAME \
      --source=FILE_PATH \
      --most-disruptive-allowed-action=RESTART \
      --zone=ZONE
    

    请替换以下内容:

    • VM_NAME:要更新的虚拟机的名称

    • FILE_PATH:更新后的虚拟机配置文件的路径

    • ZONE:包含要更新的虚拟机的可用区

REST

使用以下 instances.update 方法更新 enableNestedVirtualization 的值:

PUT https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances/VM_NAME?most_disruptive_allowed_action=RESTART

{
  ⋮
  "advanced_machine_features": {
    ⋮
    "enableNestedVirtualization": "true"
  },
  ⋮
}

请替换以下内容:

  • PROJECT_ID:项目的 ID

  • ZONE:包含虚拟机的可用区

  • VM_NAME:要从中导出属性的虚拟机的名称

使用特殊许可密钥启用嵌套虚拟化

如需在虚拟机上启用嵌套虚拟化,您可以使用在 L1 虚拟机上启用 VMX 的特殊许可密钥来创建自定义映像。许可密钥不会产生额外费用。

  1. 通过公开映像或自定义映像创建启动磁盘。以下示例使用 debian-cloud 作为映像项目,使用 debian-10 作为映像系列。如果您已有挂接了现有磁盘的虚拟机实例,则可以跳过此步骤。

    gcloud

    gcloud compute disks create DISK_NAME \
      --zone=ZONE \
      --image-project=debian-cloud \
      --image-family=debian-10
    

    请替换以下内容:

    • DISK_NAME:新磁盘的名称

    • ZONE:要在其中创建磁盘的可用区

    REST

    POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/disks
    
    {
      ...
      "name": "DISK_NAME",
      "sourceImage": "projects/debian-cloud/global/images/family/debian-10",
      ...
    }
    

    替换以下内容:

    • PROJECT_ID:项目 ID

    • ZONE:要在其中创建磁盘的可用区

    • DISK_NAME:新磁盘的名称

  2. 使用嵌套虚拟化所需的特殊许可密钥创建自定义映像。

    gcloud

    gcloud compute images create IMAGE_NAME \
      --source-disk DISK_NAME \
      --source-disk-zone ZONE \
      --licenses "https://www.googleapis.com/compute/v1/projects/vm-options/global/licenses/enable-vmx"
    

    请替换以下内容:

    • IMAGE_NAME:新映像的名称

    • DISK_NAME:先前创建的磁盘的名称

    • ZONE:要在其中创建映像的可用区

    REST

    POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/images
    
    {
      ...
      "licenses": ["projects/vm-options/global/licenses/enable-vmx"],
      "name": "IMAGE_NAME",
      "sourceDisk": "zones/ZONE/disks/DISK_NAME",
      ...
    }
    

    替换以下内容:

    • PROJECT_ID:项目 ID

    • IMAGE_NAME:新映像的名称

    • ZONE:要在其中创建映像的可用区

    • DISK_NAME:先前创建的磁盘的名称

  3. (可选)在使用特殊许可创建映像后,删除来源磁盘。

    gcloud

    gcloud compute disks delete DISK_NAME --zone=ZONE
    

    请替换以下内容:

    • DISK_NAME:要删除的磁盘的名称

    • ZONE:包含要删除的磁盘的可用区。

    REST

    DELETE https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/disks/DISK_NAME
    

    替换以下内容:

    • PROJECT_ID:项目 ID

    • ZONE:包含要删除的磁盘的可用区。

    • DISK_NAME:要删除的磁盘的名称

  4. 创建一个虚拟机,其使用具有特殊许可的新映像。满足最低要求的 CPU 平台必须为 "Intel Haswell"

    gcloud

    gcloud compute instances create VM_NAME \
        --zone=ZONE \
        --min-cpu-platform "Intel Haswell" \
        --image IMAGE_NAME
    

    请替换以下内容:

    • VM_NAME:虚拟机的名称

    • ZONE:要在其中创建虚拟机的可用区

    • IMAGE_NAME:之前创建的映像的名称

    REST

    POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances
    
    {
      ...
      "name": "VM_NAME",
      "minCpuPlatform": "Intel Haswell",
      "disks": [
        {
          "initializeParams": {
            "sourceImage": "IMAGE_NAME"
          }
        }
      ]
      ...
    }
    
    

    替换以下内容:

    • PROJECT_ID:项目 ID

    • VM_NAME:虚拟机的名称

    • ZONE:要在其中创建虚拟机的可用区

    • IMAGE_NAME:之前创建的映像的名称

确认在虚拟机上启用了嵌套虚拟化

  1. 连接到虚拟机实例。

    gcloud compute ssh VM_NAME
    

    VM_NAME 替换为要连接的虚拟机的名称。

  2. 确认是否已启用嵌套虚拟化。除 0 以外的任何响应都确认嵌套虚拟化已启用。

    grep -cw vmx /proc/cpuinfo
    

后续步骤