使用機器映像檔儲存 Compute Engine 執行個體多個磁碟中的所有設定、中繼資料、權限和資料。用來建立機器映像檔的執行個體稱為「來源執行個體」。
如要瞭解何時及如何使用機器映像檔,請參閱機器映像檔。
本文說明如何從來源執行個體建立機器映像檔。
事前準備
-
如果尚未設定驗證,請先完成設定。
驗證可確認您的身分,以便存取 Google Cloud 服務和 API。如要從本機開發環境執行程式碼或範例,請選取下列其中一個選項,向 Compute Engine 進行驗證:
選取這個頁面上您打算如何使用範例的分頁:
控制台
使用 Google Cloud 控制台存取 Google Cloud 服務和 API 時,無須設定驗證。
gcloud
-
安裝 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.architecturedisks.descriptiondisks.labelsdisks.lockeddisks.multiWriterdisks.onUpdateActiondisks.provisionedIopsdisks.shieldedInstanceInitialStatedisks.sourceImagedisks.sourceImageEncryptionKeydisks.sourceInstantSnapshotdisks.sourceSnapshotdisks.sourceSnapshotEncryptionKeyprivateIpv6GoogleAccessresourceManagerTagsresourcePoliciessecure_tagshieldedInstanceConfig
從執行個體建立機器映像檔
根據預設,機器映像檔會包含開機磁碟,以及所有連結至來源 Compute Engine 執行個體的其他磁碟。您可以選擇要納入或排除哪些非開機磁碟,但無法排除開機磁碟。
從執行個體建立機器映像檔,並納入所有附加的磁碟
您可以使用 Google Cloud 控制台、Google Cloud CLI 或 REST 建立機器映像檔。
如要建立機器映像檔,您需要下列資訊:
- 要建立的機器映像檔名稱。
- 來源執行個體的名稱。
- 來源執行個體所在的區域。
- 選填說明。
- 選用的
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準備系統進行複製。
控制台
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-instanceprojects/myProject/global/instances/my-instanceglobal/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-1 和 data-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-1 和 scratch-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 修復設定。使用
gcloud compute instances stop指令停止無法開機的 Compute Engine 執行個體:gcloud compute instances stop UNBOOTABLE_INSTANCE_NAME \ --zone=ZONE
更改下列內容:
UNBOOTABLE_INSTANCE_NAME:無法開機的 Compute Engine 執行個體名稱。ZONE:Compute Engine 執行個體所在的區域。
使用
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 執行個體所在的區域。
使用
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 執行個體所在的區域。
掛接磁碟並編輯
/etc/fstab檔案,按照下列操作說明修正有問題的項目:使用 SSH 連線至次要 Compute Engine 執行個體:
gcloud compute ssh SECONDARY_INSTANCE_NAME \ --zone=ZONE
更改下列內容:
SECONDARY_INSTANCE_NAME:用於修復磁碟的工作次要 Compute Engine 執行個體名稱。ZONE:Compute Engine 執行個體所在的區域。
使用
lsblk找出已連結的磁碟,通常是/dev/sdb或類似的磁碟:lsblk
建立臨時掛接點:
sudo mkdir /mnt/repair
掛接根分區:
sudo mount /dev/DEVICE_PARTITION /mnt/repair
將
DEVICE_PARTITION替換為次要 Compute Engine 執行個體上所連次要磁碟的裝置名稱和分割區編號 (例如sdb1)。開啟
fstab檔案:sudo nano /mnt/repair/etc/fstab
在缺少的磁碟項目中加入
nofail選項,或在開頭加入#,將整行註解掉。儲存並結束。
卸載磁碟:
sudo umount /mnt/repair
使用
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 執行個體所在的區域。
使用
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 執行個體所在的區域。
啟動修復後的 Compute Engine 執行個體:
gcloud compute instances start UNBOOTABLE_INSTANCE_NAME \ --zone=ZONE
更改下列內容:
UNBOOTABLE_INSTANCE_NAME:無法開機的 Compute Engine 執行個體名稱。ZONE:Compute Engine 執行個體所在的區域。
後續步驟
- 進一步瞭解機器映像檔
- 從機器映像檔建立執行個體