將自訂映文件匯出至 Cloud Storage

如果您需要將 Compute Engine 開機磁碟資料移出 Compute Engine 專案,可以將開機磁碟映像檔以 tar.gz 檔案格式匯出到 Cloud Storage。如果您需要建立永久磁碟映像檔,以用來在 Compute Engine 上建立新的永久磁碟,請參閱建立自訂的映像檔一節。

您可以將自訂映像檔匯出至 Cloud Storage,藉此備份或分享映像檔。如果專案無法存取您的映像檔,這個方法就很適合用來與專案共用個別映像檔。還有一個共用映像檔的方式,是在映像檔或包含映像檔的專案中,授予 Compute Engine 映像檔使用者角色。

下圖說明建立和重複使用自訂映像檔的一些常見工作負載。

建立和重複使用自訂映像檔。
圖 1:建立及重複使用自訂映像檔的範例

事前準備

  • 閱讀映像檔頁面。
  • 如果匯出映文件的專案已定義可信映像檔政策,請將 projects/compute-image-import 新增至允許的發布者清單。
  • 如要瞭解如何符合匯出映像檔的條件,請參閱「匯入及匯出 VM 映像檔的必要條件」。
  • 如果尚未設定驗證,請先完成設定。 驗證程序會確認您的身分,以便授予 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 進行驗證」。

限制和規定

映文件匯出程序適用下列限制。

一般限制

您無法匯出 Google 提供的公開映像檔。您只能匯出先前建立或匯入的映文件。

匯出圖片時,系統會在匯出圖片的電腦上建立工作階段。在匯出程序完成前,這個工作階段必須保持有效。如果工作階段在匯出程序完成前終止,或是工作失敗,系統可能不會刪除暫時性資源,例如暫時性磁碟、VM 執行個體或儲存空間值區。在這種情況下,您必須手動刪除這些暫時性資源。

系統會建立名為 ${PROJECT}-daisy-bkt-${REGION} 的 Cloud Storage bucket,用於存放匯出程序中建立的臨時資源,位置與目標 bucket 相同,位於相同區域或多區域。如要管理這些資源的生命週期,請參閱「物件生命週期管理」。

匯出程序會使用 Cloud Build 匯出映像檔。Cloud Build 工作階段最長可持續 24 小時。如果映文件很大,匯出時間超過 24 小時,可以手動匯出映文件。

VPC Service Controls 限制

如果是受 VPC Service Controls 保護的專案,請使用下列其中一種方法:

  • 從圖片所在的專案匯出。 注意:您必須在 compute-image-import (數字 71462206840) 專案中新增輸出規則。為遵循最小權限原則,建議您僅允許 artifactregistry.googleapis.com 服務使用下列方法:artifactregistry.repositories.downloadArtifacts、artifactregistry.tags.get、artifactregistry.tags.list 和 artifactregistry.versions.get。

  • 手動匯出圖片。

使用單一指令匯出圖片

將圖片匯出至 Cloud Storage

您可以使用 Google Cloud 控制台、Google Cloud CLI 或 REST 匯出映像檔。

控制台

  1. 前往 Google Cloud 控制台的「Images」(圖片) 頁面。

    前往「映文件」

  2. 按一下要匯出的映文件名稱,前往映文件詳細資料頁面。

  3. 在映文件詳細資料頁面中,按一下「匯出」開啟「匯出映文件」頁面。

  4. 在「匯出映文件」頁面中,選擇映文件的「匯出格式」。

  5. 按一下「瀏覽」,選擇要將映文件匯出至哪個 Cloud Storage 位置。

  6. 選擇現有的 Cloud Storage 位置,匯出映文件。或者,按照指示建立新的 Cloud Storage bucket,然後輸入新 bucket 的名稱。

  7. 選擇 Cloud Storage 後,請為匯出的映文件選擇檔案名稱。你可以使用預設檔案名稱,也可以選擇自己的檔案名稱。

  8. 選擇 Cloud Storage,並輸入映文件的檔案名稱後,按一下「選取」。

  9. 在「匯出映文件」頁面中,按一下「匯出」。選擇「Export」後, Google Cloud 控制台會顯示「Image export history」,您可以在這裡查看映文件匯出程序。如要進一步瞭解映文件匯出程序,請按一下「Cloud Build ID」前往「Image export details」(映文件匯出詳細資料) 頁面,查看及下載映文件匯出記錄。

  10. 前往「儲存空間」頁面,存取匯出的映文件。

    前往「儲存空間」頁面

gcloud

將映像檔匯出至 Cloud Storage 的首選方式是使用 gcloud compute images export 指令。這項指令會使用 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 bucket。根據預設,圖片會匯出為 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

將 POST 要求傳送至 Cloud Build API。

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-import/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-import/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

  1. 建立服務帳戶並指派最低權限角色。如要進一步瞭解如何建立服務帳戶,請參閱「建立及管理服務帳戶」。

    至少需要為指定的 Compute Engine 服務帳戶指派下列角色:

    • roles/compute.storageAdmin
    • roles/storage.objectAdmin
    • roles/storage.admin

    詳情請參閱「為 Compute Engine 服務帳戶授予必要角色」。

  2. 使用 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 服務帳戶相關聯的電子郵件地址。

範例

舉例來說,下列指令會使用電子郵件地址為 image-export-service-account@proj-12345.iam.gserviceaccount.com 的服務帳戶,將 my-project 中的 my-image 映像檔匯出至名為 my-bucket 的 Cloud Storage bucket。根據預設,圖片會匯出為 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

  1. 建立服務帳戶並指派最低角色。如要進一步瞭解如何建立服務帳戶,請參閱「建立及管理服務帳戶」。

    至少需要為指定的 Compute Engine 服務帳戶指派下列角色:

    • roles/compute.storageAdmin
    • roles/storage.objectAdmin
    • roles/storage.admin

    詳情請參閱「為 Compute Engine 服務帳戶授予必要角色」。

  2. 在 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-import/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 頁面的選用旗標部分。

使用 Shared VPC 匯出圖片

匯出使用 Shared VPC 的映像檔前,您必須在匯出映像檔的專案中,將 compute.networkUser 角色新增至 Cloud Build 服務帳戶。Cloud Build 使用的服務帳戶取決於您是否在 2024 年 5 月前使用專案中的 Cloud Build。如果啟用,日後建構作業會使用舊版 Cloud Build 服務帳戶。否則會使用預設的 Compute Engine 服務帳戶。

詳情請參閱「授予 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:選用。Shared VPC 子網路的完整路徑。例如:projects/HOST_PROJECT_ID/regions/REGION/subnetworks/SUBNET_NAME。

    指定這個模式時,須視虛擬私有雲網路模式而定。

    • 如果虛擬私有雲網路使用舊版模式,請勿指定子網路。
    • 如果虛擬私有雲網路使用自動模式,則指定子網路為選用步驟。
    • 如果虛擬私有雲網路使用自訂模式,則必須指定這個欄位。
  • ZONE:選用。用於匯出的區域。 這個可用區必須與子網路的區域相符。舉例來說,如果 SUBNET 位於 us-west1 區域,匯出可用區必須是下列其中一項:us-west1-a、us-west1-b 或 us-west1-c。

    如果指定 SUBNET,則必須一併指定可用區。

舉例來說,下列指令會將 my-project 中的 example-image 映像檔匯出至名為 my-bucket 的 Cloud Storage bucket。在本範例中,虛擬私有雲網路 (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

  1. 將圖片新增至 Cloud Storage。

  2. 在 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-import/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:Shared VPC 子網路的完整路徑。例如:projects/HOST_PROJECT_ID/regions/REGION/subnetworks/SUBNET_NAME。

      指定這個模式時,須視虛擬私有雲網路模式而定。

      • 如果虛擬私有雲網路使用舊版模式,請勿指定子網路。
      • 如果虛擬私有雲網路使用自動模式,則可選擇是否指定子網路。
      • 如果虛擬私有雲網路使用自訂模式,則必須指定這個欄位。
    • 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。

如何建立及匯出映像檔:

  1. 選用:建立快照前,請停止磁碟所連線的執行個體。停止執行個體可確保快照中磁碟內容的完整性。

  2. 建立磁碟的快照,並將快照命名為 image-snapshot。

    gcloud compute disks snapshot DISK_NAME \
        --snapshot-names image-snapshot

    將 DISK_NAME 替換成要用來建立快照的磁碟名稱。您可以列出磁碟來找出磁碟名稱。

  3. 執行下列指令,使用 image-snapshot 快照建立名為 image-disk 的新磁碟:

    gcloud compute disks create image-disk \
        --source-snapshot image-snapshot
  4. 建立名為 temporary-disk 的暫時磁碟來存放 tar 檔案,並指定磁碟的 SIZE,使其至少比映像檔磁碟大 50%。

    您可以在日後卸離並刪除這個磁碟。

    gcloud compute disks create temporary-disk \
        --size SIZE

    其中 SIZE 是臨時磁碟的大小,單位為 GB 或 TB。例如,指定 100GB 即可建立 100 GB 的磁碟。

  5. 建立執行個體並在執行個體上啟用 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。

    如有需要,請參閱啟動新執行個體相關詳細資訊。

  6. 連線至執行個體。 將 VM_NAME 替換為要連線的執行個體名稱。

    gcloud compute ssh VM_NAME
  7. 格式化及掛接暫時磁碟。一旦格式化磁碟,暫時磁碟的內容將會全部刪除。

    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
  8. 選用:掛接映像檔磁碟,並在建立 tar 檔案前進行其他變更。舉例來說,如果不想讓 /home 目錄中的現有檔案成為映像檔的一部分,可以將這些檔案刪除。接著,掛接您要修改的磁碟分區,修改磁碟中您要變更的檔案,然後在完成後卸載磁碟。

    1. 建立您要掛接磁碟或分區的目錄。

      sudo mkdir /mnt/image-disk
    2. 使用 ls 指令決定您要掛接的磁碟或磁碟分區。

      ls /dev/disk/by-id/

      這個指令會輸出磁碟 ID 和分區的清單。舉例來說,以下範例中的磁碟有分區資料表,其中有一個分區。google-image-disk ID 代表您要從其中建立映像檔的完整磁碟,google-image-disk-part1 ID 則代表這個磁碟上的第一個分區。如果您需要對這個磁碟進行變更,請掛接該分區,然後建立完整磁碟的映像檔。

      google-image-disk
      google-image-disk-part1
      
    3. 掛接該磁碟或分區。如果您的磁碟有分區資料表,請掛接磁碟上的個別分區。例如,掛接 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
    4. 修改 /mnt/image-disk 目錄中的檔案來設定磁碟中的檔案。舉例來說,您可能想移除 /mnt/image-disk/home/[USER]/.ssh/authorized_keys 檔案來避免他人共用您的安全殼層 (SSH) 金鑰組。

    5. 檔案修改完成後,請卸載磁碟。

      sudo umount /mnt/image-disk/
  9. 建立圖片的 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

  10. 將圖片上傳至 Cloud Storage。

    如要將 tar 檔案上傳至 Cloud Storage,請使用執行個體預先安裝的 Google Cloud CLI。

    1. 使用 gcloud CLI 建立 bucket。

      建立 bucket 前,請務必詳閱bucket 和物件命名規範。然後使用下列指令建立 bucket。將 BUCKET_NAME 替換為要建立的 bucket 名稱。

      me@example-instance:~$ 
      gcloud storage buckets create gs://BUCKET_NAME
    2. 將檔案複製到新 bucket。將 BUCKET_NAME 替換為要複製檔案的 bucket 名稱。

      me@example-instance:~$ 
      gcloud storage cp /mnt/tmp/myimage.tar.gz gs://BUCKET_NAME

您已將檔案匯出至 Cloud Storage。現在你可以與他人分享圖片,或使用 tar 檔案將新圖片新增至Google Cloud 控制台專案。

後續步驟