如果您需要將 Compute Engine 開機磁碟資料移出 Compute Engine 專案,可以將開機磁碟映像檔以 tar.gz
檔案格式匯出到 Cloud Storage。如果您需要建立永久磁碟映像檔,以用來在 Compute Engine 上建立新的永久磁碟,請參閱建立自訂的映像檔一節。
您可以將自訂映像檔匯出至 Cloud Storage,做為備份或共用之用。這個方法非常適合用來與其他無法存取映像檔的專案共用個別映像檔。還有一個共用映像檔的方式,是在映像檔或包含映像檔的專案中,授予 Compute Engine 映像檔使用者角色。
下圖說明建立和重複使用自訂映像檔的一些常見工作負載。
事前準備
- 閱讀映像檔頁面。
- 如果您要匯出圖片的專案已定義可信任圖片政策,請將
projects/compute-image-import
和projects/compute-image-tools
新增至發布者允許清單。 - 如要瞭解如何在匯出映像檔前符合相關規定,請參閱「匯入及匯出 VM 映像檔的先決條件」一文。
-
如果尚未設定,請先設定驗證機制。「驗證」是指驗證身分,以便存取 Google Cloud 服務和 API 的程序。如要從本機開發環境執行程式碼或範例,請選取下列任一選項,以便對 Compute Engine 進行驗證:
Select the tab for how you plan to use the samples on this page:
Console
When you use the Google Cloud console to access Google Cloud services and APIs, you don't need to set up authentication.
gcloud
-
After installing the Google Cloud CLI, initialize it by running the following command:
gcloud init
If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.
- Set a default region and zone.
- 從圖片所在的專案匯出
- 手動匯出圖片
前往 Google Cloud 控制台的「Images」頁面。
按一下要匯出的圖片名稱,前往圖片詳細資料頁面。您無法匯出 Google 提供的公開映像檔。您只能匯出先前建立或匯入的圖片。
在圖片詳細資料頁面中,按一下「匯出」,開啟「匯出圖片」頁面。
在「Export image」頁面中,選擇圖片的「Export format」。
按一下「瀏覽」,選擇要匯出圖片的 Cloud Storage 位置。
選擇現有的 Cloud Storage 位置來匯出圖片。或者,您也可以按照指示建立新的 Cloud Storage 值區,然後輸入新 Cloud Storage 值區的名稱。
選擇 Cloud Storage 後,請為匯出的圖片選擇檔案名稱。您可以使用預設檔案名稱,也可以自行選擇檔案名稱。
選擇 Cloud Storage 並輸入圖片檔案名稱後,按一下「選取」。
在「匯出圖片」頁面中,按一下「匯出」。選擇「Export」後, Google Cloud 控制台會顯示「Image export history」,您可以在其中查看圖片匯出程序。如要進一步瞭解圖像匯出程序,請按一下「Cloud Build ID」前往「Image export details」頁面,查看及下載圖像匯出記錄。
前往「Storage」頁面,存取匯出的圖片。
DESTINATION_URI
:匯出圖片檔案的 Cloud Storage URI 目的地。IMAGE_NAME
:要匯出的磁碟映像檔名稱。PROJECT_ID
:含有您要匯出的圖片的專案 ID。SOURCE_IMAGE
:要匯出的圖片名稱。IMAGE_FORMAT
:匯出圖片的格式。有效格式包括vmdk
、vhdx
、vpc
、vdi
和qcow2
。DESTINATION_URI
:您要匯出圖片檔案的 Cloud Storage URI 位置。例如:gs://my-bucket/my-exported-image.vmdk
。- 使用傳回的
build-id
執行 projects.builds.get 要求。 - 查看由提供的
logUrl
代管的記錄。 建立服務帳戶並指派最低角色。如要進一步瞭解如何建立服務帳戶,請參閱「建立及管理服務帳戶」。
指定的 Compute Engine 服務帳戶至少需要指派下列角色:
roles/compute.storageAdmin
roles/storage.objectAdmin
詳情請參閱「為 Compute Engine 服務帳戶授予必要角色」。
使用
gcloud compute images export
指令匯出圖片。gcloud compute images export \ --destination-uri DESTINATION_URI \ --image IMAGE_NAME \ --compute-service-account SERVICE_ACCOUNT_EMAIL
更改下列內容:
DESTINATION_URI
:匯出圖片檔案的 Cloud Storage URI 目的地。IMAGE_NAME
:要匯出的磁碟映像檔名稱。SERVICE_ACCOUNT_EMAIL
:與在前一個步驟中建立的 Compute Engine 服務帳戶相關聯的電子郵件地址。
建立服務帳戶並指派最低角色。如要進一步瞭解如何建立服務帳戶,請參閱「建立及管理服務帳戶」。
指定的 Compute Engine 服務帳戶至少需要指派下列角色:
roles/compute.storageAdmin
roles/storage.objectAdmin
詳情請參閱「為 Compute Engine 服務帳戶授予必要角色」。
在 API 中,建立對 Cloud Build API 的
POST
要求。POST https://cloudbuild.googleapis.com/v1/projects/PROJECT_ID/builds { "timeout": "7200s", "steps":[ { "args":[ "-timeout=7000s", "-source_image=SOURCE_IMAGE", "-client_id=api", "-format=IMAGE_FORMAT", "-destination_uri=DESTINATION_URI", "-compute_service_account=SERVICE_ACCOUNT_EMAIL" ], "name":"gcr.io/compute-image-tools/gce_vm_image_export:release", "env":[ "BUILD_ID=$BUILD_ID" ] } ], "tags":[ "gce-daisy", "gce-daisy-image-export" ] }
更改下列內容:
PROJECT_ID
:含有您要匯出的圖片的專案 ID。SOURCE_IMAGE
:要匯出的圖片名稱。IMAGE_FORMAT
:匯出圖片的格式。有效格式包括vmdk
、vhdx
、vpc
、vdi
和qcow2
。DESTINATION_URI
:您要匯出圖片檔案的 Cloud Storage URI 位置。例如:gs://my-bucket/my-exported-image.vmdk
。SERVICE_ACCOUNT_EMAIL
:與在前一個步驟中建立的 Compute Engine 服務帳戶相關聯的電子郵件地址。
IMAGE_NAME
:要匯出的圖片名稱。DESTINATION_URI
:您要匯出圖片檔案的 Cloud Storage URI 位置。PROJECT_ID
:圖片所在專案的 ID。NETWORK
:共用虛擬私有雲網路的完整路徑。例如:projects/HOST_PROJECT_ID/global/networks/VPC_NETWORK_NAME
。SUBNET
:選用。共用虛擬私有雲子網路的完整路徑。例如:projects/HOST_PROJECT_ID/regions/REGION/subnetworks/SUBNET_NAME
。指定這個模式取決於 VPC 網路模式。
- 如果虛擬私有雲網路使用舊版模式,請勿指定子網路。
- 如果虛擬私人雲端網路採用自動模式,則指定子網路為選用項目。
- 如果虛擬私有雲網路使用自訂模式,則必須指定這個欄位。
ZONE
:選用。用於匯出的區域。此區域必須與子網路的區域相符。舉例來說,如果SUBNET
位於us-west1
區域,匯出區域必須是下列其中一個:us-west1-a
、us-west1-b
或us-west1-c
。如果您指定了
SUBNET
,則必須一併指定區域。將圖片新增至 Cloud Storage。
在 API 中,建立對 Cloud Build API 的
POST
要求。POST https://cloudbuild.googleapis.com/v1/projects/PROJECT_ID/builds { "timeout": "7200s", "steps":[ { "args":[ "-timeout=7000s", "-source_image=SOURCE_IMAGE", "-client_id=api", "-format=IMAGE_FORMAT", "-destination_uri=DESTINATION_URI", "-network=NETWORK", "-subnet=SUBNET", "-zone=ZONE" ], "name":"gcr.io/compute-image-tools/gce_vm_image_export:release", "env":[ "BUILD_ID=$BUILD_ID" ] } ], "tags":[ "gce-daisy", "gce-daisy-image-export" ] }
更改下列內容:
PROJECT_ID
:含有您要匯出的圖片的專案 ID。SOURCE_IMAGE
:要匯出的圖片名稱。IMAGE_FORMAT
:匯出的圖片格式。有效格式包括vmdk
、vhdx
、vpc
、vdi
和qcow2
。DESTINATION_URI
:您要匯出圖片檔案的 Cloud Storage URI 位置。例如:gs://my-bucket/my-exported-image.vmdk
。NETWORK
:共用 VPC 網路的完整路徑。例如:projects/HOST_PROJECT_ID/global/networks/VPC_NETWORK_NAME
。SUBNET
:共用虛擬私有雲子網路的完整路徑。例如:projects/HOST_PROJECT_ID/regions/REGION/subnetworks/SUBNET_NAME
。指定這個模式取決於 VPC 網路模式。
- 如果虛擬私有雲端網路使用舊版模式,請勿指定子網路。
- 如果虛擬私人雲端網路採用自動模式,則不一定要指定子網路。
- 如果 VPC 網路使用自訂模式,則必須指定這個欄位。
ZONE
:匯出作業要使用的區域。此區域必須與子網路的區域相符。舉例來說,如果SUBNET
位於us-west1
區域,匯出區域必須是下列其中一個:us-west1-a
、us-west1-b
或us-west1-c
。在大多數情況下,指定區域並非必要。如果指定
SUBNET
,就必須指定區域。
如要瞭解可提供的其他
args
值,請參閱 VM 映像檔匯出 GitHub 頁面中的選用標記部分。選用:建立快照前,停止連結至磁碟的執行個體。停止執行個體可確保快照中磁碟內容的完整性。
建立磁碟的快照,並將快照命名為
image-snapshot
。gcloud compute disks snapshot DISK_NAME \ --snapshot-names image-snapshot
將
DISK_NAME
替換為您要用來建立快照的磁碟名稱。您可以列出磁碟,找出磁碟的名稱。執行下列指令,使用
image-snapshot
快照建立名為image-disk
的新磁碟:gcloud compute disks create image-disk \ --source-snapshot image-snapshot
建立名為
temporary-disk
的暫時磁碟來存放您的tar
檔案,然後指定磁碟的SIZE
(必須超過映像檔至少 50%)。您可以在日後卸離並刪除這個磁碟。
gcloud compute disks create temporary-disk \ --size SIZE
其中
SIZE
為暫時磁碟的大小 (以 GB 或 TB 為單位)。例如,指定100GB
即可建立 100 GB 的磁碟。建立執行個體並在執行個體上啟用
storage-rw
範圍。此外,將image-disk
和temporary-disk
連接至執行個體做為次要磁碟,並指定device-name
屬性。將VM_NAME
替換為要建立的執行個體名稱。gcloud compute instances create VM_NAME \ --scopes storage-rw \ --disk name=image-disk,device-name=image-disk \ --disk name=temporary-disk,device-name=temporary-disk
請注意,您將提供服務帳戶範圍,因此可以在後續步驟中將檔案上傳至 Cloud Storage。
如有需要,請參閱啟動新執行個體相關詳細資訊。
連線至執行個體。將
VM_NAME
替換為要連線的執行個體名稱。gcloud compute ssh VM_NAME
格式化及掛接暫時磁碟。一旦格式化磁碟,暫時磁碟的內容將會全部刪除。
sudo mkdir /mnt/tmp
sudo mkfs.ext4 -F /dev/disk/by-id/google-temporary-disk
sudo mount -o discard,defaults /dev/disk/by-id/google-temporary-disk /mnt/tmp
選用:建立
tar
檔案前,請先掛接映像檔磁碟並進行其他變更。舉例來說,您可以從/home
目錄中刪除所有現有檔案 (如果您不希望這些檔案出現在映像檔中)。接著,掛接您要修改的磁碟分區,修改磁碟中您要變更的檔案,然後在完成後卸載磁碟。建立您要掛接磁碟或分區的目錄。
sudo mkdir /mnt/image-disk
使用
ls
指令決定您要掛接的磁碟或磁碟分區。ls /dev/disk/by-id/
這個指令會輸出磁碟 ID 和分區的清單。舉例來說,以下範例中的磁碟有分區資料表,其中有一個分區。
google-image-disk
ID 代表您要從其中建立映像檔的完整磁碟,google-image-disk-part1
ID 則代表這個磁碟上的第一個分區。如果您需要對這個磁碟進行變更,請掛接該分區,然後建立完整磁碟的映像檔。google-image-disk google-image-disk-part1
掛接該磁碟或分區。如果您的磁碟有分區資料表,請掛接磁碟上的個別分區。例如,掛接
google-image-disk-part1
。sudo mount /dev/disk/by-id/google-image-disk-part1 /mnt/image-disk
如果您的磁碟仍為原始格式化狀態,沒有分區資料表,則請掛接完整的
google-image-disk
磁碟。sudo mount /dev/disk/by-id/google-image-disk /mnt/image-disk
修改
/mnt/image-disk
目錄中的檔案來設定磁碟中的檔案。舉例來說,您可能想移除/mnt/image-disk/home/[USER]/.ssh/authorized_keys
檔案來避免他人共用您的安全殼層 (SSH) 金鑰組。檔案修改完成後,請卸載磁碟。
sudo umount /mnt/image-disk/
建立映像檔的
tar
檔案。當您完成自訂映像檔磁碟上的檔案後,請在暫時磁碟上建立原始的磁碟檔案。原始磁碟映像檔的名稱必須為「disk.raw」:
sudo dd if=/dev/disk/by-id/google-image-disk of=/mnt/tmp/disk.raw bs=4096
然後建立
tar.gz
檔案:cd /mnt/tmp
sudo tar czvf myimage.tar.gz disk.raw
這個指令會在下列位置建立執行個體的映像檔:
/mnt/tmp/myimage.tar.gz
將圖片上傳至 Cloud Storage。
如要將
tar
檔案上傳至 Cloud Storage,請使用執行個體上預先安裝的 Google Cloud CLI。使用 gcloud CLI 建立值區。
建立值區前,請務必參閱值區和物件命名規範一文,接著,使用下列指令建立值區。將
BUCKET_NAME
替換為要建立的值區名稱。me@example-instance:~$ gcloud storage buckets create gs://BUCKET_NAME
將檔案複製到新值區。將
BUCKET_NAME
替換為要將檔案複製到的值區名稱。me@example-instance:~$ gcloud storage cp /mnt/tmp/myimage.tar.gz gs://BUCKET_NAME
- 使用映像檔使用者角色共用映像檔。
- 瞭解 Compute Engine 提供的匯入方法。
REST
如要在本機開發環境中使用本頁的 REST API 範例,請使用您提供給 gcloud CLI 的憑證。
After installing the Google Cloud CLI, initialize it by running the following command:
gcloud init
If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.
詳情請參閱 Google Cloud 驗證說明文件中的「驗證以使用 REST」。
限制和規定
以下限制適用於圖片匯出程序。
一般限制
匯出映像檔時,系統會在匯出映像檔的機器上建立工作階段。這個工作階段必須保持有效,直到匯出程序完成為止。如果在匯出程序完成前終止工作階段,或是工作失敗,暫時性資源 (例如暫時性磁碟、VM 執行個體或儲存空間儲存格) 可能不會刪除。在這種情況下,您必須手動刪除這些暫時性資源。
系統會為在匯出程序中建立的暫時性資源,在與目標值區相同的區域或多區域中建立名為
${PROJECT}-daisy-bkt-${REGION}
的 Cloud Storage 值區。如要管理這些資源的生命週期,請參閱「物件生命週期管理」一文。匯出程序會使用 Cloud Build 匯出映像檔。Cloud Build 工作階段的持續時間上限為 24 小時。如果圖片非常大,匯出作業可能需要超過 24 小時,你可以手動匯出圖片。
VPC Service Controls 限制
如果專案受到 VPC Service Controls 保護,請使用下列任一方法:
使用單一指令匯出圖片
將圖片匯出至 Cloud Storage
您可以使用 Google Cloud 控制台、Google Cloud CLI 或 REST 匯出映像檔。
主控台
gcloud
我們建議您使用
gcloud compute images export
指令,將映像檔匯出到 Cloud Storage。這個指令會使用 Daisy 鏈結匯出映像檔所需的多項步驟。gcloud compute images export
指令會假設您已建立映像檔,例如使用gcloud compute images create
指令。使用 Google Cloud CLI 執行:
gcloud compute images export \ --destination-uri DESTINATION_URI \ --image IMAGE_NAME
更改下列內容:
根據預設,系統會以 Compute Engine 格式匯出映像檔,也就是經過 tar 和 gzip 壓縮的
disk.raw
檔案。如要以 QEMU 磁碟映像檔公用程式支援的其他格式匯出映像檔,您可以使用--export-format
旗標。有效格式包括vmdk
、vhdx
、vpc
、vdi
和qcow2
。示例
例如,以下指令可將
my-project
中名為my-image
的映像檔匯出至名為my-bucket
的 Cloud Storage 值區。根據預設,系統會將圖片匯出為disk.raw file
,並壓縮成tar.gz
檔案格式。gcloud compute images export \ --destination-uri gs://my-bucket/my-image.tar.gz \ --image my-image \ --project my-project
如需旗標資訊,請參閱
gcloud compute images export
參考說明文件。REST
向 Cloud Build API 傳送
POST
要求。POST https://cloudbuild.googleapis.com/v1/projects/PROJECT_ID/builds { "timeout": "7200s", "steps":[ { "args":[ "-timeout=7000s", "-source_image=SOURCE_IMAGE", "-client_id=api", "-format=IMAGE_FORMAT", "-destination_uri=DESTINATION_URI" ], "name":"gcr.io/compute-image-tools/gce_vm_image_export:release", "env":[ "BUILD_ID=$BUILD_ID" ] } ], "tags":[ "gce-daisy", "gce-daisy-image-export" ] }
更改下列內容:
如要瞭解可提供的其他
args
值,請參閱 VM 映像檔匯出 GitHub 頁面中的選用標記部分。回應範例
以下範例回應類似於傳回的輸出內容:
{ "name": "operations/build/myproject-12345/operation-1578608233418", "metadata": { "@type": "type.googleapis.com/google.devtools.cloudbuild.v1.BuildOperationMetadata", "build": { "id": "3a2055bc-ccbd-4101-9434-d376b88b8940", "status": "QUEUED", "createTime": "2019-10-02T18:59:13.393492020Z", "steps": [ { "name": "gcr.io/compute-image-tools/gce_vm_image_export:release", "env": [ "BUILD_ID=3a2055bc-ccbd-4101-9434-d376b88b8940" ], "args": [ "-timeout=7056s", "-source_image=my-image", "-client_id=api", "-format=vmdk", "-destination_uri=gs://my-bucket/my-exported-image.vmdk" ] } ], "timeout": "7200s", "projectId": "myproject-12345", "logsBucket": "gs://123456.cloudbuild-logs.googleusercontent.com", "options": { "logging": "LEGACY" }, "logUrl": "https://console.cloud.google.com/cloud-build/builds/3a2055bc-ccbd-4101-9434-d376b88b8940?project=123456" } }
您可以透過幾種方式監控建構作業:
使用自訂 Compute Engine 服務帳戶從專案匯出映像檔
在匯出映像檔時,系統會在專案中建立暫時性的虛擬機器 (VM) 執行個體。這個暫時性 VM 上的映像匯出工具必須經過驗證。
服務帳戶是附加至 VM 的身分。您可以透過執行個體中繼資料伺服器存取服務帳戶存取權憑證,並用於驗證 VM 上的映像檔匯出工具。
根據預設,匯出程序會使用專案的預設 Compute Engine 服務代理程式。不過,如果您的專案已停用預設的 Compute Engine 服務帳戶,或是您想使用自訂的 Compute Engine 服務帳戶,則必須建立服務帳戶,並在匯出程序中指定該帳戶。
您可以使用 Google Cloud CLI 或 REST 匯出圖片。
gcloud
示例
例如,以下指令可將
my-project
中名為my-image
的映像檔匯出至名為my-bucket
的 Cloud Storage 值區,並使用電子郵件地址image-export-service-account@proj-12345.iam.gserviceaccount.com
的服務帳戶。根據預設,系統會將映像檔匯出成disk.raw
檔案,並壓縮成tar.gz
檔案格式。gcloud compute images export \ --destination-uri gs://my-bucket/my-image.tar.gz \ --image my-image \ --project my-project \ --compute-service-account image-export-service-account@proj-12345.iam.gserviceaccount.com
如需旗標資訊,請參閱
gcloud compute images export
參考說明文件。REST
如要瞭解可提供的其他
args
值,請參閱 VM 映像檔匯出 GitHub 頁面中的選用標記部分。使用共用虛擬私有雲匯出映像檔
匯出使用共用虛擬私有雲的映像檔前,您必須在匯出映像檔的專案中,將
compute.networkUser
角色新增至 Cloud Build 服務帳戶。詳情請參閱「為 Cloud Build 服務帳戶授予必要角色」。您可以使用 Google Cloud CLI 或 REST 匯出映像檔。
gcloud
使用
gcloud compute images export
指令匯出圖片。gcloud compute images export \ --image IMAGE_NAME \ --destination-uri DESTINATION_URI \ --project PROJECT_ID \ --network NETWORK \ --subnet SUBNET \ --zone ZONE
更改下列內容:
例如,以下指令可將
my-project
中名為example-image
的映像檔匯出至名為my-bucket
的 Cloud Storage 值區。在這個範例中,虛擬私有雲網路 (my-shared-vp
) 會使用自訂子網路 (my-custom-subnet
)。根據預設,系統會將映像檔匯出為disk.raw
檔案,並壓縮成tar.gz
檔案格式。指令範例
gcloud compute images export \ --image example-image \ --destination-uri gs://my-bucket/my-image.tar.gz \ --project my-project \ --network projects/my-vpc-project/global/networks/my-shared-vpc \ --subnet projects/my-vpc-project/regions/us-west1/subnetworks/my-custom-subnet \ --zone us-west1-c
REST
手動建立及匯出圖片
如果
gcloud compute images create
和gcloud compute images export
指令不符合您的需求,您可以透過 Compute Engine 執行個體手動建立及匯出映像檔。這個程序需要不同的操作步驟,您必須先建立映像檔再加以匯出。請注意,在以下範例中,已建立的磁碟稱為 image-disk。
如何建立及匯出映像檔:
您已將檔案匯出至 Cloud Storage。現在可以與其他使用者共用映像檔,或使用
tar
檔案將新圖片新增至Google Cloud 主控台專案。後續步驟
除非另有註明,否則本頁面中的內容是採用創用 CC 姓名標示 4.0 授權,程式碼範例則為阿帕契 2.0 授權。詳情請參閱《Google Developers 網站政策》。Java 是 Oracle 和/或其關聯企業的註冊商標。
上次更新時間:2025-06-16 (世界標準時間)。
-