ISO ファイルからのイメージの作成

Windows アプリケーションのインストール メディアの多くは ISO ファイルとして提供されていますが、Compute Engine では、仮想 DVD ドライブとして ISO ファイルを VM インスタンスに公開することはできません。

1 台の Windows VM で ISO ファイルのコンテンツにアクセスするには、次の操作を行います。

  1. ISO ファイルを VM にコピーし、ローカルにマウントします。この方法は、1 つの VM インスタンスで ISO ファイルのコンテンツにアクセスする必要がある場合に適しています。
  2. ISO ファイルから永続ディスクを作成し、このディスクを読み取り専用モードで 1 つ以上の VM インスタンスに接続します。この方法は、複数の VM が ISO ファイルのコンテンツにアクセスする必要がある場合に適しています。

このドキュメントでは、ISO ファイルからイメージまたはディスクを作成する方法について説明します。

始める前に

ISO ファイルの準備

ISO ファイルが HTTP 経由で一般公開されている場合は、あらかじめ ISO ファイルをダウンロードしておく必要はありません。ローカルの ISO ファイルを使用する場合は、ISO ファイルを Cloud Storage にアップロードします。

HTTP URL

  1. Google Cloud Console で、[Cloud Shell をアクティブにする] Cloud Shell をアクティブにします。 ボタンをクリックして、Cloud Shell を開きます。

    Google Cloud Console に移動

  2. ダウンロード URL の環境変数を作成します。URL には HTTP または HTTPS の URL を指定できますが、匿名でアクセスできる必要があります。

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

ローカル ISO ファイル

  1. Google Cloud Consoleを開き、新しいストレージ バケットを作成します。
  2. Google Cloud Console または gsutil を使用して ISO ファイルをアップロードします。

    ISO ファイルのサイズによっては、アップロードに数分または数時間かかることがあります。

  3. ストレージ ブラウザで、アップロードしたオブジェクトに移動します。

  4. [オブジェクトの詳細] ページで、オブジェクトの URI をコピーします。URI は gs:// で始まります。

  5. [Cloud Shell をアクティブにする] Cloud Shell をアクティブにします。 ボタンをクリックして、Cloud Shell を開きます。

    Google Cloud Console に移動

  6. ダウンロード URL の環境変数を作成します。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 の URL から 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:')) {
        & gsutil 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 Core を実行する 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 パラメータでマウントされているため削除されません。

これでディスクを使用できるようになりました。同じゾーン内の 1 つ以上の 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
    

次のステップ