如果您需要將 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
-
安裝 Google Cloud CLI。 安裝完成後,執行下列指令初始化 Google Cloud CLI:
gcloud init
如果您使用外部識別資訊提供者 (IdP),請先 使用聯合身分登入 gcloud CLI。
- 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 執行個體或儲存空間值區。在這種情況下,您必須手動刪除這些暫時性資源。
系統會建立名為
${PROJECT}-daisy-bkt-${REGION}
的 Cloud Storage bucket,用於在匯出程序期間建立暫時性資源,且該 bucket 與目標 bucket 位於相同地區或多地區。如要管理這些資源的生命週期,請參閱物件生命週期管理。匯出程序會使用 Cloud Build 匯出映像檔。Cloud Build 工作階段最長可持續 24 小時。如果映文件很大,匯出時間超過 24 小時,可以手動匯出映文件。
VPC Service Controls 限制
如果是受 VPC Service Controls 保護的專案,請使用下列其中一種方法:
- 從映像檔所在的專案匯出
- 手動匯出映文件
使用單一指令匯出映像檔
將映像檔匯出至 Cloud Storage
您可以透過Google Cloud 控制台、Google Cloud CLI 或 REST 匯出映像檔。
主控台
前往 Google Cloud 控制台的「Images」(映像檔) 頁面。
按一下要匯出的映文件名稱,前往映文件詳細資料頁面。您無法匯出 Google 提供的公開映像檔。您只能匯出先前建立或匯入的映文件。
在映文件詳細資料頁面中,按一下「匯出」開啟「匯出映文件」頁面。
在「匯出映文件」頁面中,選擇映文件的「匯出格式」。
按一下「瀏覽」,選擇要將映文件匯出至哪個 Cloud Storage 位置。
選擇現有的 Cloud Storage 位置,匯出映文件。或者,按照指示建立新的 Cloud Storage bucket,然後輸入新 bucket 的名稱。
選擇 Cloud Storage 後,請為匯出的映文件選擇檔案名稱。你可以使用預設檔案名稱,也可以選擇自己的檔案名稱。
選擇 Cloud Storage,並輸入映文件的檔案名稱後,按一下「選取」。
在「匯出映文件」頁面中,按一下「匯出」。選擇「Export」後, Google Cloud 控制台會顯示「Image export history」,您可以在這裡查看映文件匯出程序。如要進一步瞭解映文件匯出程序,請按一下「Cloud Build ID」前往「Image export details」(映文件匯出詳細資料) 頁面,查看及下載映文件匯出記錄。
前往「儲存空間」頁面,存取匯出的映文件。
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
更改下列內容:
DESTINATION_URI
:匯出映文件檔案的 Cloud Storage URI 目的地。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" ] }
更改下列內容:
PROJECT_ID
:專案 ID,用於存放您要匯出的映文件。SOURCE_IMAGE
:要匯出的映文件名稱。IMAGE_FORMAT
:匯出映文件的格式。有效格式包括vmdk
、vhdx
、vpc
、vdi
和qcow2
。DESTINATION_URI
:要將映文件檔案匯出至的 Cloud Storage URI 位置。例如:gs://my-bucket/my-exported-image.vmdk
。
如要瞭解可提供的其他
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" } }
您可以透過幾種方式監控建構作業:
- 使用傳回的
build-id
執行 projects.builds.get 要求。 - 查看提供的
logUrl
中託管的記錄。
使用自訂 Compute Engine 服務帳戶從專案匯出映像檔
匯出映像檔時,系統會在專案中建立暫時的虛擬機器 (VM) 執行個體。您必須驗證這個暫時 VM 上的映像檔匯出工具。
服務帳戶是附加至 VM 的身分。服務帳戶存取權杖可透過執行個體中繼資料伺服器存取,並用於驗證 VM 上的映像檔匯出工具。
根據預設,匯出程序會使用專案的預設 Compute Engine 服務代理程式。不過,如果專案中的預設 Compute Engine 服務帳戶已停用,或是您想使用自訂的 Compute Engine 服務帳戶,則必須建立服務帳戶,並在匯出程序中指定該帳戶。
您可以使用 Google Cloud CLI 或 REST 匯出映文件。
gcloud
建立服務帳戶並指派最低角色。如要進一步瞭解如何建立服務帳戶,請參閱「建立及管理服務帳戶」。
指定的 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 服務帳戶相關聯的電子郵件地址。
示例
舉例來說,以下指令可將
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
建立服務帳戶並指派最低角色。如要進一步瞭解如何建立服務帳戶,請參閱「建立及管理服務帳戶」。
指定的 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 服務帳戶相關聯的電子郵件地址。
如要瞭解可提供的其他
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
更改下列內容:
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
,則必須一併指定區域。
例如,以下指令可將
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
將映像檔新增至 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
:共用虛擬私有雲網路的完整路徑。例如: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
,則必須指定區域。
如要瞭解可提供的其他
args
值,請參閱 VM 映像檔匯出 GitHub 頁面的選用標記部分。
手動建立及匯出映像檔
如果
gcloud compute images create
和gcloud compute images export
指令不符合您的需求,您可以透過 Compute Engine 執行個體手動建立及匯出映像檔。這個程序需要不同的操作步驟,您必須先建立映像檔再加以匯出。請注意,在以下範例中,已建立的磁碟稱為 image-disk。
如何建立及匯出映像檔:
選用:建立快照前,停止連結至磁碟的執行個體。停止執行個體可確保快照中磁碟內容的完整性。
建立磁碟的快照,並將快照命名為
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。
建立值區前,請務必參閱值區和物件命名規範一文,再使用以下指令建立值區。將
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
您已將檔案匯出至 Cloud Storage。現在可以與其他使用者共用映像檔,或使用
tar
檔案將映像檔新增到Google Cloud 控制台專案中。後續步驟
- 使用映像檔使用者角色共用映像檔。
- 瞭解 Compute Engine 適用的匯入方式。
除非另有註明,否則本頁面中的內容是採用創用 CC 姓名標示 4.0 授權,程式碼範例則為阿帕契 2.0 授權。詳情請參閱《Google Developers 網站政策》。Java 是 Oracle 和/或其關聯企業的註冊商標。
上次更新時間:2025-08-08 (世界標準時間)。
-