Cree una imagen de disco persistente a partir de un archivo ISO


Los medios de instalación para aplicaciones de Windows a menudo se proporcionan como un archivo ISO, pero Compute Engine no permite exponer un archivo ISO como una unidad de DVD virtual a una instancia de VM.

Para acceder al contenido del archivo ISO en una única máquina virtual Windows, puede realizar cualquiera de las siguientes acciones:

  • Copie el archivo ISO a la VM y móntelo localmente . Este enfoque funciona bien si solo necesita acceder al contenido del archivo ISO en una única instancia de VM.

  • Cree un disco persistente a partir del archivo ISO y adjunte el disco en modo de solo lectura a una o más instancias de VM. Este enfoque funciona bien si varias máquinas virtuales necesitan acceder al contenido del archivo ISO.

Este documento describe cómo puede crear un disco persistente a partir del archivo ISO y conectar el disco en modo de solo lectura a una o más máquinas virtuales.

Antes de comenzar

  • Si aún no lo has hecho, configura la autenticación. La autenticación es el proceso mediante el cual se verifica su identidad para acceder a Google Cloud servicios y API. Para ejecutar código o muestras desde un entorno de desarrollo local, puedes autenticarte en Compute Engine seleccionando una de las siguientes opciones:

    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. After installing the Google Cloud CLI, initialize it by running the following command:

      gcloud init

      If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.

    2. Set a default region and zone.

Prepara el archivo ISO

Si el archivo ISO está disponible públicamente a través de HTTP, no es necesario descargarlo primero. Para utilizar un archivo ISO local, puede cargar el archivo ISO en Cloud Storage.

URL HTTP

  1. En la consola de Google Cloud, abra Cloud Shell haciendo clic en Activar Cloud ShellActive Cloud Shell. botón.

    Ve a la consola de Google Cloud

  2. Cree una variable de entorno para la URL de descarga. La URL puede ser una URL HTTP o HTTPS, pero se debe poder acceder a ella de forma anónima.

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

Archivo ISO local

  1. En la consola de Google Cloud, crea un depósito de Cloud Storage .

    Ve a la consola de Google Cloud

  2. Sube el archivo ISO .

    Dependiendo del tamaño del archivo ISO, la carga puede tardar varios minutos u horas.

  3. En el navegador de almacenamiento , navegue hasta el objeto cargado.

  4. En la página de detalles del objeto , copie el URI del objeto. El URI comienza con gs:// .

  5. Abra Cloud Shell haciendo clic en Activar Cloud ShellActive Cloud Shell. botón.

    Ve a la consola de Google Cloud

  6. Cree una variable de entorno para la URL de descarga. Reemplace URI con el URI que copió.

    ISO_URL=URI
    

Cree un disco que contenga el contenido del archivo ISO

Para copiar el contenido del archivo ISO a un disco nuevo, cree una máquina virtual temporal y luego cree una imagen desde el disco:

  1. Desde Cloud Shell, especifique el nombre que desea asignar al nuevo disco:

    DISK_NAME=iso
    
  2. Cree un nuevo disco al que copiar el contenido de los archivos ISO:

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

    Utilice un tamaño de disco mayor si su archivo ISO supera los 9 GB.

  3. Cree un script de inicio para la VM temporal. El script de inicio realiza las siguientes acciones:

    1. Formatee el disco secundario con el sistema de archivos NTFS.
    2. Descargue el archivo ISO desde la URL HTTP o de almacenamiento en la nube que especificó.
    3. Monte el archivo ISO y copie su contenido al disco secundario.
    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. Cree una máquina virtual Windows Server 2019 que utilice el script de inicio y el disco que creó anteriormente:

    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
    

    La máquina virtual tarda unos 2 minutos en iniciarse. Dependiendo del tamaño del archivo ISO, la operación de copia del archivo puede tardar entre 5 y 15 minutos en completarse. Puede observar el progreso ejecutando el siguiente comando:

    gcloud compute instances tail-serial-port-output iso-copier \
        --zone=$(gcloud config get-value compute/zone)
    
  5. Espere a que la VM termine de ejecutar el script de inicio:

    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. Apague y elimine la VM:

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

    Observe que el disco secundario no se elimina porque se montó con el parámetro auto-delete=no .

El disco ahora está listo para ser utilizado. Puede conectar el disco en modo de solo lectura a una o más instancias de VM dentro de la misma zona.

Comparta el disco entre zonas y regiones creando una imagen

Para que el contenido del archivo ISO esté disponible en otras zonas o regiones, crea una imagen de Compute Engine:

  1. Desde Cloud Shell, cree una imagen del disco que creó en la sección anterior:

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

Limpiar

Para evitar incurrir en costos adicionales después de haber completado este proceso, puede eliminar los recursos que creó:

  1. Eliminar el disco:

    gcloud compute disks delete $DISK_NAME \
        --zone=$(gcloud config get-value compute/zone) \
        --quiet
    
  2. Eliminar la imagen:

    gcloud compute images delete $DISK_NAME
    

¿Qué sigue?