將自訂映像檔匯出至 Google Cloud Storage

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

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

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

Examples of creation and reuse of custom images
圖 1:建立和重複使用自訂映像檔範例

事前準備

使用單一指令匯出映像檔

我們建議您使用 gcloud compute images export 指令,將映像檔匯出到 Cloud Storage。這個指令會使用 Daisy 連結匯出映像檔所需的多項步驟。它會假設您已經建立映像檔,例如利用 gcloud compute images create 指令來建立。

使用 gcloud 指令列工具,然後執行以下指令:

gcloud compute images export --destination-uri [DESTINATION_URI] \
    --image [IMAGE]

其中:

  • [DESTINATION_URI] 是虛擬磁碟匯出檔的 Cloud Storage URI 目的地。
  • [IMAGE] 是要匯出的磁碟映像檔名稱。

例如,以下指令可將 my-project 中名為 my-image 的映像檔匯出至名為 my-bucket 的 Cloud Storage 值區。根據預設,系統會將映像檔匯出成 disk.raw 檔案,並壓縮成 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 參考說明文件。

手動建立及匯出映像檔

如果 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 屬性。

    gcloud compute instances create [INSTANCE_NAME] --scopes storage-rw \
        --disk name=image-disk,device-name=image-disk \
        --disk name=temporary-disk,device-name=temporary-disk
    

    其中 [INSTANCE_NAME] 為要建立的執行個體名稱。

    請注意,您將導入服務帳戶範圍,因此可以在後續步驟中將檔案上傳至 Google Cloud Storage。

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

  6. 連線至執行個體

    gcloud compute ssh [INSTANCE_NAME]
    

    其中 [INSTANCE_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 和 gzip 格式壓縮檔案:

    cd /mnt/tmp
    
    sudo tar czvf myimage.tar.gz disk.raw
    

    這個指令會在以下位置中建立執行個體的映像檔:

    /mnt/tmp/myimage.tar.gz
    
  10. 將映像檔上傳至 Google Cloud Storage。

    如要將 tar 檔案上傳至 Google Cloud Storage,請使用執行個體上預先安裝的 gsutil 指令列工具。

    1. 使用 gsutil 建立值區。

      建立值區前,請務必參閱《值區和命名規範》,再使用以下指令建立值區:

      me@example-instance:~$ gsutil mb gs://[BUCKET_NAME]

      其中 [BUCKET_NAME] 為您要建立的值區名稱。

    2. 複製檔案到新值區。

      me@example-instance:~$ gsutil cp /mnt/tmp/myimage.tar.gz gs://[BUCKET_NAME]

      其中 [BUCKET_NAME] 代表您要複製檔案的值區。

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

後續步驟

本頁內容對您是否有任何幫助?請提供意見:

傳送您對下列選項的寶貴意見...

這個網頁
Compute Engine 說明文件