建立機器映像檔

使用機器映像檔儲存 Compute Engine 執行個體多個磁碟中的所有設定、中繼資料、權限和資料。用來建立機器映像檔的執行個體稱為「來源執行個體」

如要瞭解何時及如何使用機器映像檔,請參閱機器映像檔

本文說明如何從來源執行個體建立機器映像檔。

事前準備

  • 如果尚未設定驗證,請先完成設定。 驗證可確認您的身分,以便存取 Google Cloud 服務和 API。如要從本機開發環境執行程式碼或範例,請選取下列其中一個選項,向 Compute Engine 進行驗證:

    選取這個頁面上您打算如何使用範例的分頁:

    控制台

    使用 Google Cloud 控制台存取 Google Cloud 服務和 API 時,無須設定驗證。

    gcloud

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

      gcloud init

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

  • 設定預設地區和區域
  • REST

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

      安裝 Google Cloud CLI。

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

    詳情請參閱 Google Cloud 驗證說明文件中的「使用 REST 進行驗證」。

限制和規定

  • 每 60 分鐘最多可為特定執行個體建立 6 次機器映像檔。
  • 您可以透過 Cloud Key Management Service (Cloud KMS)客戶提供的加密金鑰 (CSEK) 保護機器映像檔。加密金鑰可保護磁碟內容。不過,中繼資料不會受到保護。
  • 如果您使用 CSEK 保護機器映像檔,系統會在產生機器映像檔時,儲存所有磁碟資料的完整副本。在所有其他情況下,磁碟資料會儲存在差異副本中。
  • 您無法從下列來源 Compute Engine 執行個體建立機器映像檔:

    • 已連結的磁碟總容量超過 200 TiB。
    • 沒有任何附加磁碟。
    • 已連結任何 Hyperdisk 磁碟區。
    • 使用 Z3 機型 (z3-highmem-192-highlssd-metal 除外)。
    • 使用 C3D、H3 或 A3 機型。

    如果執行個體不支援建立機器映像檔,您可以改為從執行個體的開機磁碟建立 OS 映像檔,詳情請參閱「建立自訂映像檔」。

  • 您無法同時指定要納入和排除的磁碟。

機器映像檔不支援的執行個體和磁碟屬性

從執行個體建立機器映像檔,或從機器映像檔建立執行個體時,系統不會保留或還原下列執行個體和磁碟屬性:

  • disks.architecture
  • disks.description
  • disks.labels
  • disks.locked
  • disks.multiWriter
  • disks.onUpdateAction
  • disks.provisionedIops
  • disks.shieldedInstanceInitialState
  • disks.sourceImage
  • disks.sourceImageEncryptionKey
  • disks.sourceInstantSnapshot
  • disks.sourceSnapshot
  • disks.sourceSnapshotEncryptionKey
  • privateIpv6GoogleAccess
  • resourceManagerTags
  • resourcePolicies
  • secure_tag
  • shieldedInstanceConfig

從執行個體建立機器映像檔

根據預設,機器映像檔會包含開機磁碟,以及所有連結至來源 Compute Engine 執行個體的其他磁碟。您可以選擇要納入或排除哪些非開機磁碟,但無法排除開機磁碟。

從執行個體建立機器映像檔,並納入所有附加的磁碟

您可以使用 Google Cloud 控制台Google Cloud CLIREST 建立機器映像檔。

如要建立機器映像檔,您需要下列資訊:

  • 要建立的機器映像檔名稱。
  • 來源執行個體的名稱。
  • 來源執行個體所在的區域。
  • 選填說明。
  • 選用的 storageLocation。 如果未指定位置,預設儲存位置為來源執行個體的多區域 Cloud Storage 位置
  • 選用的加密金鑰。您可以選擇 Google-owned and Google-managed encryption key、Cloud Key Management Service (Cloud KMS) 金鑰或客戶提供的加密 (CSEK) 金鑰。如未指定加密金鑰,系統會使用 Google-owned and Google-managed encryption key加密機器映像檔。
  • 如要使用機器映像檔進行執行個體複製和快照,請先移除執行個體專屬的 OS 和應用程式資訊,再從執行個體產生機器映像檔。舉例來說,如果是 Windows VM 執行個體,請使用 GCESysprep 準備系統進行複製。

控制台

  1. 前往 Google Cloud 控制台的「機器映像檔」頁面。

    前往「機器映像檔」

  2. 按一下「建立機器映像檔」

  3. 指定機器映像檔的「Name」(名稱)

  4. 選用:提供說明

  5. 選取「來源 VM 執行個體」

  6. 選用:指定儲存機器映像檔的位置。選擇「Multi-regional」(多地區) 或「Regional」(單一地區) 儲存空間。如要進一步瞭解位置,請參閱「機器映像檔儲存位置」。

  7. 選用:選取「加密」方法。

  8. 點選「建立」

gcloud

使用 gcloud compute machine-images create 指令,從執行個體建立機器映像檔。

gcloud compute machine-images create MACHINE_IMAGE_NAME \
    --source-instance=SOURCE_INSTANCE_NAME

更改下列內容:

  • MACHINE_IMAGE_NAME:要建立的機器映像檔名稱。
  • SOURCE_INSTANCE_NAME:要建立映像檔的來源執行個體名稱。

範例

舉例來說,您可以使用下列 gcloud 指令,從名為 my-instance 的來源執行個體建立名為 my-machine-image 的機器映像檔:

gcloud compute machine-images create my-machine-image  \
    --source-instance=my-instance

這項程序需要幾分鐘才能完成。建立機器映像檔後,您會取得類似下列內容的輸出:

Created [https://www.googleapis.com/compute/v1/projects/project-12345/global/machineImages/my-machine-image].
NAME               STATUS
my-machine-image   READY

REST

在 API 中,建構對 machineimages.insert 方法的 POST 要求。在要求主體中加入下列 POST 要求:

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/machineImages

{
  "name": "MACHINE_IMAGE_NAME",
  "sourceInstance": "SOURCE_INSTANCE_URL"
}

更改下列內容:

  • PROJECT_ID專案 ID
  • MACHINE_IMAGE_NAME:要建立的機器映像檔名稱。
  • SOURCE_INSTANCE_URL:您要用來建立機器映像檔的來源執行個體完整或部分網址。舉例來說,假設您在名為 myProject 的專案中,有名為 my-instance 的來源執行個體。下列網址有效:

    • https://www.googleapis.com/compute/v1/projects/myProject/global/instances/my-instance
    • projects/myProject/global/instances/my-instance
    • global/instances/my-instance

建立機器映像檔並納入特定磁碟 (搶先版)

您可以透過選擇性磁碟備份功能,建立包含或排除特定非開機磁碟的機器映像檔。

建立機器映像檔時,您可以透過選擇性磁碟備份執行下列工作:

  • 納入特定非開機磁碟:您可以建立機器映像檔,只備份開機磁碟和您提供的特定非開機磁碟清單。

  • 排除特定非開機磁碟:您可以建立機器映像檔,備份開機磁碟和所有已連結的非開機磁碟,排除排除清單中指定的磁碟。

Linux 執行個體的最佳做法

如果是 Linux 執行個體,建議您採取下列最佳做法:

  • 建立排除特定非開機磁碟的機器映像檔,或使用包含清單省略這些磁碟時,請確保 Linux 來源 Compute Engine 執行個體上的 /etc/fstab 檔案會對這些磁碟使用 nofail 選項。這樣可防止還原的 Compute Engine 執行個體因缺少預期磁碟而無法開機。

  • 從機器映像檔還原 Compute Engine 執行個體時,作業系統會嘗試掛接 /etc/fstab 中列出的所有磁碟。如果缺少預期磁碟,且未指定 nofail 選項,開機程序就會停止,執行個體也無法開機。如要解決開機失敗問題,請參閱「Workarounds for boot failures caused by excluding specific disks」(因排除特定磁碟而導致開機失敗的解決方法)。

僅涵蓋特定磁碟

按照下列操作說明,只從特定磁碟建立機器映像檔。您必須一律包含開機磁碟。您無法使用 Google Cloud 控制台,只從特定磁碟建立機器映像檔。您必須使用 Google Cloud CLI 或 REST。

Google Cloud CLI

使用 gcloud beta compute machine-images create 指令,只從特定磁碟建立機器映像檔。

gcloud beta compute machine-images create MACHINE_IMAGE_NAME \
    --source-instance=SOURCE_INSTANCE_NAME \
    --source-instance-zone=ZONE \
    --include-disks=BOOT_DISK,DISK_NAME_1,DISK_NAME_2

更改下列內容:

  • MACHINE_IMAGE_NAME:要建立的機器映像檔名稱。
  • SOURCE_INSTANCE_NAME:要從中建立映像檔的來源執行個體名稱。
  • ZONE:來源執行個體所在的可用區。
  • BOOT_DISK, DISK_NAME_1,DISK_NAME_2:以半形逗號分隔的清單,列出要納入機器映像檔的開機磁碟,以及附加至來源執行個體的非開機磁碟。

舉例來說,您可以使用下列 gcloud 指令,從位於 us-central1-a 的來源執行個體 (名為 my-instance) 建立名為 my-gmi-include 的機器映像檔,只包含 data-disk-1data-disk-2

gcloud beta compute machine-images create my-gmi-include \
    --source-instance=my-instance \
    --source-instance-zone=us-central1-a \
    --include-disks=boot-disk,data-disk-1,data-disk-2

REST

在 API 中,建構對 machineimages.insert 方法的 POST 要求。在要求主體中加入下列 POST 要求:

POST https://compute.googleapis.com/compute/beta/projects/PROJECT_ID/global/machineImages

{
  "name": "MACHINE_IMAGE_NAME",
  "sourceInstance": "SOURCE_INSTANCE_URL",
  "params": {
    "includedDisks": ["BOOT_DISK", "DISK_NAME_1", "DISK_NAME_2"]
  }
}

更改下列內容:

  • PROJECT_ID:包含機器映像檔的專案 ID,例如 my-project
  • MACHINE_IMAGE_NAME:要建立的機器映像檔名稱。
  • SOURCE_INSTANCE_URL:您要用來建立機器映像檔的來源執行個體完整或部分網址。
  • BOOT_DISK, DISK_NAME_1, DISK_NAME_2:要納入機器映像檔的開機磁碟和非開機磁碟清單,這些磁碟會附加至來源執行個體。

建立機器映像檔並排除特定磁碟 (搶先版)

請按照下列操作說明建立機器映像檔,並從備份中排除特定磁碟。您無法排除開機磁碟。您無法使用 Google Cloud 控制台建立機器映像檔,並排除特定磁碟。您可以使用 Google Cloud CLI 或 REST。

gcloud

使用 gcloud beta compute machine-images create 指令建立機器映像檔,並排除特定磁碟。

gcloud beta compute machine-images create MACHINE_IMAGE_NAME \
    --source-instance=SOURCE_INSTANCE_NAME \
    --source-instance-zone=ZONE \
    --exclude-disks=DISK_NAME_1,DISK_NAME_2

更改下列內容:

  • MACHINE_IMAGE_NAME:要建立的機器映像檔名稱。
  • SOURCE_INSTANCE_NAME:要建立映像檔的來源執行個體名稱。
  • ZONE:來源執行個體所在的可用區。
  • DISK_NAME_1,DISK_NAME_2:以半形逗號分隔的清單,列出要從機器映像檔排除的來源執行個體所連結非開機磁碟。

範例

舉例來說,您可以使用下列 gcloud 指令,從 us-central1-a 中名為 my-instance 的來源執行個體建立名為 my-gmi-exclude 的機器映像檔,並排除 temp-disk-1scratch-disk

 gcloud beta compute machine-images create my-gmi-exclude \
    --source-instance=my-instance \
    --source-instance-zone=us-central1-a \
    --exclude-disks=temp-disk-1,scratch-disk

REST

在 API 中,建構對 machineimages.insert 方法的 POST 要求。在要求主體中加入下列 POST 要求:

POST https://compute.googleapis.com/compute/beta/projects/PROJECT_ID/global/machineImages

{
  "name": "MACHINE_IMAGE_NAME",
  "sourceInstance": "SOURCE_INSTANCE_URL",
  "params": {
    "excludedDisks": ["DISK_NAME_1", "DISK_NAME_2"]
  }
}

更改下列內容:

  • PROJECT_ID:包含機器映像檔的專案 ID。
  • MACHINE_IMAGE_NAME:要建立的機器映像檔名稱。
  • SOURCE_INSTANCE_URL:您要用來建立機器映像檔的來源執行個體完整或部分網址。
  • DISK_NAME_1, DISK_NAME_2:附加至來源執行個體且要從機器映像檔排除的非開機磁碟清單。

排除特定磁碟導致開機失敗的解決方法

如果您從機器映像檔建立執行個體,但排除的磁碟導致開機失敗,可以透過下列任一解決方法復原執行個體:

  • 連線至序列埠啟用並連線至無法開機的 Compute Engine 執行個體互動式序列埠。登入帳戶進行疑難排解,並直接編輯 /etc/fstab 檔案,移除缺少的磁碟項目或新增 nofail 選項。

  • 磁碟交換:如果 Compute Engine 執行個體無法開機,是因為磁碟已從機器映像檔排除,但仍列在 /etc/fstab 中,且沒有 nofail 選項,請按照下列操作說明,使用 Google Cloud CLI 修復設定。

    1. 使用 gcloud compute instances stop 指令停止無法開機的 Compute Engine 執行個體:

      gcloud compute instances stop UNBOOTABLE_INSTANCE_NAME \
       --zone=ZONE
      

      更改下列內容:

      • UNBOOTABLE_INSTANCE_NAME:無法開機的 Compute Engine 執行個體名稱。
      • ZONE:Compute Engine 執行個體所在的區域。
    2. 使用 gcloud compute instances detach-disk 指令卸離開機磁碟:

      gcloud compute instances detach-disk UNBOOTABLE_INSTANCE_NAME \
       --disk=BOOT_DISK_NAME \
       --zone=ZONE
      

      更改下列內容:

      • UNBOOTABLE_INSTANCE_NAME:無法開機的 Compute Engine 執行個體名稱。
      • BOOT_DISK_NAME:附加至無法開機的 Compute Engine 執行個體的開機磁碟名稱。
      • ZONE:Compute Engine 執行個體所在的區域。
    3. 使用 gcloud compute instances attach-disk 指令,將磁碟以次要磁碟的形式掛接到另一個運作中的 Compute Engine 執行個體:

      gcloud compute instances attach-disk SECONDARY_INSTANCE_NAME \
       --disk=BOOT_DISK_NAME \
       --zone=ZONE
      

      更改下列內容:

      • SECONDARY_INSTANCE_NAME:用於修復磁碟的工作次要 Compute Engine 執行個體名稱。
      • BOOT_DISK_NAME:附加至無法開機的 Compute Engine 執行個體的開機磁碟名稱。
      • ZONE:Compute Engine 執行個體所在的區域。
    4. 掛接磁碟並編輯 /etc/fstab 檔案,按照下列操作說明修正有問題的項目:

      1. 使用 SSH 連線至次要 Compute Engine 執行個體:

        gcloud compute ssh SECONDARY_INSTANCE_NAME \
        --zone=ZONE
        

        更改下列內容:

        • SECONDARY_INSTANCE_NAME:用於修復磁碟的工作次要 Compute Engine 執行個體名稱。
        • ZONE:Compute Engine 執行個體所在的區域。
      2. 使用 lsblk 找出已連結的磁碟,通常是 /dev/sdb 或類似的磁碟:

        lsblk
        
      3. 建立臨時掛接點:

        sudo mkdir /mnt/repair
        
      4. 掛接根分區:

        sudo mount /dev/DEVICE_PARTITION /mnt/repair
        

        DEVICE_PARTITION 替換為次要 Compute Engine 執行個體上所連次要磁碟的裝置名稱和分割區編號 (例如 sdb1)。

      5. 開啟 fstab 檔案:

        sudo nano /mnt/repair/etc/fstab
        
      6. 在缺少的磁碟項目中加入 nofail 選項,或在開頭加入 #,將整行註解掉。

      7. 儲存並結束。

      8. 卸載磁碟:

        sudo umount /mnt/repair
        
    5. 使用 gcloud compute instances detach-disk 指令,從次要 Compute Engine 執行個體卸離磁碟:

      gcloud compute instances detach-disk SECONDARY_INSTANCE_NAME \
       --disk=BOOT_DISK_NAME \
       --zone=ZONE
      

      更改下列內容:

      • SECONDARY_INSTANCE_NAME:用於修復磁碟的工作次要 Compute Engine 執行個體名稱。
      • BOOT_DISK_NAME:附加至無法開機的 Compute Engine 執行個體的開機磁碟名稱。
      • ZONE:Compute Engine 執行個體所在的區域。
    6. 使用 gcloud compute instances attach-disk 指令,將磁碟重新附加為原始 Compute Engine 執行個體的開機磁碟:

      gcloud compute instances attach-disk UNBOOTABLE_INSTANCE_NAME \
       --disk=BOOT_DISK_NAME \
       --boot \
       --zone=ZONE
      

      更改下列內容:

      • UNBOOTABLE_INSTANCE_NAME:無法開機的 Compute Engine 執行個體名稱。
      • BOOT_DISK_NAME:附加至無法開機的 Compute Engine 執行個體的開機磁碟名稱。
      • ZONE:Compute Engine 執行個體所在的區域。
    7. 啟動修復後的 Compute Engine 執行個體:

      gcloud compute instances start UNBOOTABLE_INSTANCE_NAME \
       --zone=ZONE
      

      更改下列內容:

      • UNBOOTABLE_INSTANCE_NAME:無法開機的 Compute Engine 執行個體名稱。
      • ZONE:Compute Engine 執行個體所在的區域。

後續步驟