從 ISO 檔案建立永久磁碟映像檔

Windows 應用程式的安裝媒體通常以 ISO 檔案的形式提供,但 Compute Engine 不允許您將 ISO 檔案公開為 VM 執行個體的虛擬 DVD 光碟機。

如要在單一 Windows VM 上存取 ISO 檔案內容,請執行下列任一操作:

  • 將 ISO 檔案複製到 VM,然後在本機掛接。如果您只需要在單一 VM 執行個體上存取 ISO 檔案的內容,這個方法就非常實用。

  • 從 ISO 檔案建立永久磁碟,並以唯讀模式將磁碟連接至一或多個 VM 執行個體。如果多部 VM 需要存取 ISO 檔案的內容,這個方法就很實用。

本文說明如何從 ISO 檔案建立永久磁碟,並以唯讀模式將磁碟連接至一或多個 VM。

事前準備

  • 如果尚未設定驗證,請先完成設定。 驗證可確認您的身分,以便存取 Google Cloud 服務和 API。如要從本機開發環境執行程式碼或範例,請選取下列其中一個選項,向 Compute Engine 進行驗證:

    選取這個頁面上的分頁,瞭解如何使用範例:

    控制台

    使用 Google Cloud 控制台存取 Google Cloud 服務和 API 時,無須設定驗證。

    gcloud

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

      gcloud init

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

  • 設定預設地區和區域

準備 ISO 檔案

如果 ISO 檔案可透過 HTTP 公開存取,您就不必先下載 ISO 檔案。如要使用本機 ISO 檔案,請將 ISO 檔案上傳至 Cloud Storage。

HTTP 網址

  1. 在 Google Cloud 控制台中,按一下「啟用 Cloud Shell」啟動 Cloud Shell。按鈕,開啟 Cloud Shell

    前往 Google Cloud 控制台

  2. 為下載網址建立環境變數。網址可以是 HTTP 或 HTTPS 網址,但必須可供匿名存取。

    ISO_URL=https://example.com/big.iso
    

本機 ISO 檔案

  1. 在 Google Cloud 控制台中建立 Cloud Storage 值區

    前往 Google Cloud 控制台

  2. 上傳 ISO 檔案

    視 ISO 檔案大小而定,上傳作業可能需要數分鐘至數小時才能完成。

  3. 在「Storage browser」中,前往上傳的物件。

  4. 在「物件詳細資料」頁面中,複製物件的 URI。URI 開頭為 gs://

  5. 按一下「啟用 Cloud Shell」啟動 Cloud Shell。 按鈕,開啟 Cloud Shell

    前往 Google Cloud 控制台

  6. 為下載網址建立環境變數。將 URI 替換為您複製的 URI。

    ISO_URL=URI
    

建立包含 ISO 檔案內容的磁碟

如要將 ISO 檔案的內容複製到新磁碟,請建立臨時 VM,然後從該磁碟建立映像檔:

  1. 在 Cloud Shell 中,指定要指派給新磁碟的名稱:

    DISK_NAME=iso
    
  2. 建立新磁碟,將 ISO 檔案的內容複製到該磁碟:

    gcloud compute disks create $DISK_NAME \
      --size=10GB \
      --zone=$(gcloud config get-value compute/zone)
    

    如果 ISO 檔案超過 9 GB,請使用較大的磁碟大小。

  3. 為臨時 VM 建立開機指令碼。開機指令碼會執行下列動作:

    1. 以 NTFS 檔案系統格式化次要磁碟。
    2. 從您指定的 HTTP 或 Cloud Storage 網址下載 ISO 檔案。
    3. 掛接 ISO 檔案,並將內容複製到次要磁碟。
    cat << "EOF" > startup.ps1
    
    $DownloadDirectory = 'c:\download\'
    $ErrorActionPreference = 'Stop'
    $MetadataUrl = 'http://metadata.google.internal/computeMetadata/v1/instance'
    
    $DownloadUrl = (Invoke-RestMethod `
        -Headers @{"Metadata-Flavor" = "Google"} `
        -Uri "$MetadataUrl/attributes/iso")
    
    mkdir $DownloadDirectory\Source -Force
    
    Write-Host '== Formatting secondary disk... ===' -ForegroundColor Black -BackgroundColor Yellow
    Set-Disk -Number 1 -IsOffline $false
    Clear-Disk -Number 1 -RemoveData -Confirm:$false -ErrorAction SilentlyContinue
    Initialize-Disk -Number 1 -PartitionStyle MBR
    New-Partition -DiskNumber 1 -UseMaximumSize -DriveLetter D -IsActive |
    Format-Volume -FileSystem 'NTFS' -Confirm:$false
    
    Write-Host '== Downloading ISO... =============' -ForegroundColor Black -BackgroundColor Yellow
    if ($DownloadUrl.StartsWith('gs:')) {
        & gcloud storage cp $DownloadUrl "$DownloadDirectory\Source\image.iso" | Out-Default
    }
    else {
        Import-Module BitsTransfer
        Start-BitsTransfer -Source $DownloadUrl -Destination "$DownloadDirectory\Source\image.iso"
    }
    
    Write-Host '== Mounting ISO... ================' -ForegroundColor Black -BackgroundColor Yellow
    Mount-DiskImage -ImagePath "$DownloadDirectory\Source\image.iso" -StorageType ISO
    
    Write-Host '== Copying ISO contents... ========' -ForegroundColor Black -BackgroundColor Yellow
    Copy-Item 'e:\*' 'd:\' -Force -Recurse -PassThru `
        | Where-Object { -Not $_.PSIsContainer } `
        | Set-ItemProperty -Name IsReadOnly -Value $False
    
    Write-Host '== Completed. =====================' -ForegroundColor Black -BackgroundColor Yellow
    Invoke-RestMethod `
        -Headers @{'Metadata-Flavor'='Google'}  `
        -Method PUT  `
        -Uri "$MetadataUrl/guest-attributes/vm/ready" `
        -Body true
    EOF
    
  4. 建立使用開機指令碼和先前建立磁碟的 Windows Server 2019 VM:

    gcloud compute instances create iso-copier \
        --machine-type=n1-standard-2 \
        --image-family=windows-2019-core \
        --image-project=windows-cloud \
        --disk=name=$DISK_NAME,auto-delete=no \
        --metadata=enable-guest-attributes=true,iso=$ISO_URL \
        --metadata-from-file=windows-startup-script-ps1=startup.ps1 \
        --scopes=https://www.googleapis.com/auth/devstorage.read_only
    

    VM 大約需要 2 分鐘才能啟動。視 ISO 檔案大小而定,檔案複製作業可能需要 5 到 15 分鐘才能完成。您可以執行下列指令來觀察進度:

    gcloud compute instances tail-serial-port-output iso-copier \
        --zone=$(gcloud config get-value compute/zone)
    
  5. 等待 VM 執行完畢開機指令碼:

    until gcloud compute instances get-guest-attributes iso-copier \
        --zone=$(gcloud config get-value compute/zone) \
        --query-path=vm/ready > /dev/null 2>&1
    do
        sleep 5 && echo waiting for VM to finish...
    done
    
  6. 關機並刪除 VM:

    gcloud compute instances delete iso-copier \
        --zone=$(gcloud config get-value compute/zone) \
        --quiet
    

    請注意,由於次要磁碟是透過 auto-delete=no 參數掛接,因此不會遭到刪除。

現在可以使用磁碟了。您也可以將處於唯讀模式的磁碟連接至同一區域內的一或多個 VM 執行個體

建立映像檔,在區域和地區之間共用磁碟

如要在其他可用區或區域提供 ISO 檔案的內容,請建立 Compute Engine 映像檔:

  1. 在 Cloud Shell 中,從您在上一節建立的磁碟建立映像檔:

    gcloud compute images create $DISK_NAME \
        --source-disk=$DISK_NAME \
        --source-disk-zone=$(gcloud config get-value compute/zone)
    

清除所用資源

如要避免在完成此程序後產生額外費用,可以刪除您建立的資源:

  1. 刪除磁碟:

    gcloud compute disks delete $DISK_NAME \
        --zone=$(gcloud config get-value compute/zone) \
        --quiet
    
  2. 刪除映像檔:

    gcloud compute images delete $DISK_NAME
    

後續步驟