啟用巢狀虛擬化功能


本文說明如何在虛擬機器 (VM) 執行個體上啟用巢狀虛擬化,以及如何確認是否可以建立巢狀 VM。使用下列其中一種方法,在 VM 上啟用巢狀虛擬化:

  • 建議做法:如要直接在新 VM 或現有 VM 上啟用巢狀虛擬化,請在建立 VM 時將 enableNestedVirtualization 欄位設為 true,或更新 VM。建議採用這種方法,因為您不需要建立自訂映像檔或使用特殊授權金鑰。

  • 如要使用特殊授權金鑰啟用巢狀虛擬化,請建立開機磁碟、使用特殊巢狀虛擬化授權金鑰建立自訂映像檔,然後建立使用該自訂映像檔的 VM。

事前準備

  • 如果尚未設定驗證,請先完成設定。 「驗證」是指驗證身分的程序,確認您有權存取 Google Cloud 服務和 API。如要從本機開發環境執行程式碼或範例,請選取下列任一選項,向 Compute Engine 進行驗證:

    Select the tab for how you plan to use the samples on this page:

    gcloud

    1. 安裝 Google Cloud CLI。 安裝完成後,執行下列指令初始化 Google Cloud CLI:

      gcloud init

      如果您使用外部識別資訊提供者 (IdP),請先 使用聯合身分登入 gcloud CLI

    2. Set a default region and zone.

    REST

    如要在本機開發環境中使用本頁的 REST API 範例,請使用您提供給 gcloud CLI 的憑證。

      安裝 Google Cloud CLI。 安裝完成後,執行下列指令初始化 Google Cloud CLI:

      gcloud init

      如果您使用外部識別資訊提供者 (IdP),請先 使用聯合身分登入 gcloud CLI

    詳情請參閱 Google Cloud 驗證說明文件中的「Authenticate for using REST」。

直接在新 VM 上啟用巢狀虛擬化

如要直接在 VM 上啟用巢狀虛擬化功能,請按照下列程序操作。

gcloud

使用下列 gcloud compute instances create 指令建立啟用巢狀虛擬化的 L1 VM:

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

更改下列內容:

  • VM_NAME:啟用巢狀虛擬化的新 L1 VM 名稱

  • ZONE:啟用巢狀虛擬化功能的新 L1 VM 所在區域

REST

使用下列 instances.insert 方法建立啟用巢狀虛擬化的 L1 VM:

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 所在區域

  • VM_NAME:啟用巢狀虛擬化的新 L1 VM 名稱

直接在現有 VM 上啟用巢狀虛擬化

如要在現有 VM 上啟用巢狀虛擬化功能,請按照下列步驟操作。

gcloud

  1. 使用下列 gcloud compute instances export 指令匯出 VM 的屬性:

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

    更改下列內容:

    • VM_NAME:要匯出屬性的 VM 名稱

    • YAML_FILE_PATH:.yaml 檔案的路徑和檔案名稱,匯出的設定資料會儲存至該檔案

    • ZONE:包含 VM 的可用區

  2. FILE_PATH 中儲存的 VM 設定檔中,更新 enableNestedVirtualization 的值。如果檔案中沒有這個值,請新增下列內容:

    advancedMachineFeatures:
      enableNestedVirtualization: true
    
  3. 使用下列 gcloud compute instances update-from-file 指令,以 enableNestedVirtualization 的值更新 VM:

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

    更改下列內容:

    • VM_NAME:要更新的 VM 名稱

    • FILE_PATH:更新後的 VM 設定檔路徑

    • ZONE:包含要更新 VM 的可用區

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 的可用區

  • VM_NAME:要匯出屬性的 VM 名稱

使用特殊授權金鑰啟用巢狀虛擬化功能

如要在 VM 上啟用巢狀虛擬化,請使用特殊授權金鑰建立自訂映像檔,在 L1 VM 上啟用 VMX。授權金鑰不收取額外費用。

  1. 從公用映像檔或自訂映像檔建立開機磁碟。以下範例使用 debian-cloud 做為映像檔專案,並使用 debian-10 做為映像檔系列。如果您已有含現有磁碟的 VM 執行個體,可以略過這個步驟。

    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. 建立使用新映像檔和特殊授權的 VM。最低 CPU 平台必須為 "Intel Haswell"

    gcloud

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

    更改下列內容:

    • VM_NAME:VM 名稱

    • ZONE:要在其中建立 VM 的可用區

    • 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:VM 名稱

    • ZONE:要在其中建立 VM 的可用區

    • IMAGE_NAME:先前建立的映像檔名稱

確認 VM 已啟用巢狀虛擬化

  1. 連結至 VM 執行個體。

    gcloud compute ssh VM_NAME
    

    VM_NAME 替換為要連線的 VM 名稱。

  2. 確認已啟用巢狀虛擬化。如果回應不是 0,表示已確認啟用巢狀虛擬化。

    grep -cw vmx /proc/cpuinfo
    

後續步驟