將自訂映文件匯出至 Cloud Storage


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

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

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

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

事前準備

  • 閱讀映像檔頁面。
  • 如果匯出映文件的專案已定義可信映像檔政策,請將 projects/compute-image-importprojects/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

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

      gcloud init

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

    2. 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 CLIREST 匯出映像檔。

主控台

  1. 前往 Google Cloud 控制台的「Images」(映像檔) 頁面。

    前往「映文件」

  2. 按一下要匯出的映文件名稱,前往映文件詳細資料頁面。您無法匯出 Google 提供的公開映像檔。您只能匯出先前建立或匯入的映文件。

  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

我們建議您使用 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 旗標。有效格式包括 vmdkvhdxvpcvdiqcow2

示例

例如,以下指令可將 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:匯出映文件的格式。有效格式包括 vmdkvhdxvpcvdiqcow2
  • 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 CLIREST 匯出映文件。

gcloud

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

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

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

    詳情請參閱「為 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 服務帳戶相關聯的電子郵件地址。

示例

舉例來說,以下指令可將 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

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

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

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

    詳情請參閱「將必要角色授予 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-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:匯出映文件的格式。 有效格式包括 vmdkvhdxvpcvdiqcow2
    • 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 CLIREST 匯出映像檔。

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-aus-west1-bus-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

  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-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:匯出映文件的格式。 有效格式包括 vmdkvhdxvpcvdiqcow2
    • 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-aus-west1-bus-west1-c

      在大多數情況下,指定區域是選用功能。如果指定 SUBNET,則必須指定區域。

    如要瞭解可提供的其他 args 值,請參閱 VM 映像檔匯出 GitHub 頁面的選用標記部分。

手動建立及匯出映像檔

如果 gcloud compute images creategcloud 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-disktemporary-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_NAME 替換為要建立的值區名稱。

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

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

您已將檔案匯出至 Cloud Storage。現在可以與其他使用者共用映像檔,或使用 tar 檔案將映像檔新增到Google Cloud 控制台專案中。

後續步驟