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


El medio de instalación de las aplicaciones de Windows suele proporcionarse como un archivo ISO, pero Compute Engine no te permite exponer un archivo ISO como unidad de DVD virtual en una instancia de VM.

Para acceder al contenido del archivo ISO en una sola VM de Windows, puedes hacer lo siguiente:

  • Copia el archivo ISO en la VM y móntalo localmente. Este enfoque funciona bien si solo necesitas acceder al contenido del archivo ISO en una única instancia de VM.

  • Crea un disco persistente a partir del archivo ISO y conéctalo en modo de solo lectura a una o varias instancias de VM. Este método es adecuado si varias máquinas virtuales necesitan acceder al contenido del archivo ISO.

En este documento se describe cómo crear un disco persistente a partir del archivo ISO y cómo montar el disco en el modo de solo lectura en una o varias VMs.

Antes de empezar

  • Si aún no lo has hecho, configura la autenticación. La autenticación verifica tu identidad para acceder a Google Cloud servicios y APIs. Para ejecutar código o ejemplos 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. Instala Google Cloud CLI. Después de la instalación, inicializa la CLI de Google Cloud ejecutando el siguiente comando:

      gcloud init

      Si utilizas un proveedor de identidades (IdP) externo, primero debes iniciar sesión en la CLI de gcloud con tu identidad federada.

    2. Set a default region and zone.

Preparar el archivo ISO

Si el archivo ISO está disponible públicamente a través de HTTP, no es necesario que lo descargues primero. Para usar un archivo ISO local, puedes subirlo a Cloud Storage.

URL de HTTP

  1. En la Google Cloud consola, abre Cloud Shell haciendo clic en el botón Activar Cloud Shell Activa Cloud Shell..

    Ir a la Google Cloud consola

  2. Crea una variable de entorno para la URL de descarga. La URL puede ser HTTP o HTTPS, pero debe ser accesible de forma anónima.

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

Archivo ISO local

  1. En la Google Cloud consola, crea un segmento de Cloud Storage.

    Ir a la Google Cloud consola

  2. Sube el archivo ISO.

    En función del tamaño del archivo ISO, la subida puede tardar varios minutos o varias horas.

  3. En el explorador de almacenamiento, vaya al objeto subido.

  4. En la página Detalles del objeto, copia el URI del objeto. El URI empieza por gs://.

  5. Abre Cloud Shell haciendo clic en el botón Activar Cloud Shell Activa Cloud Shell..

    Ir a la Google Cloud consola

  6. Crea una variable de entorno para la URL de descarga. Sustituye URI por el URI que has copiado.

    ISO_URL=URI
    

Crear un disco que contenga el contenido del archivo ISO

Para copiar el contenido del archivo ISO en un disco nuevo, crea una máquina virtual temporal y, a continuación, crea una imagen a partir del disco:

  1. En Cloud Shell, especifica el nombre que quieras asignar al nuevo disco:

    DISK_NAME=iso
    
  2. Crea un disco en el que copiar el contenido de los archivos ISO:

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

    Usa un tamaño de disco mayor si tu archivo ISO supera los 9 GB.

  3. Crea una secuencia de comandos de inicio para la VM temporal. La secuencia de comandos de inicio realiza las siguientes acciones:

    1. Formatea el disco secundario con el sistema de archivos NTFS.
    2. Descarga el archivo ISO de la URL HTTP o de Cloud Storage que hayas especificado.
    3. Monta el archivo ISO y copia su contenido en el 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. Crea una VM de Windows Server 2019 que use la secuencia de comandos de inicio y el disco que has creado 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 VM tarda unos 2 minutos en iniciarse. En función del tamaño del archivo ISO, la operación de copia del archivo puede tardar entre 5 y 15 minutos en completarse. Para ver el progreso, ejecuta el siguiente comando:

    gcloud compute instances tail-serial-port-output iso-copier \
        --zone=$(gcloud config get-value compute/zone)
    
  5. Espera a que la VM termine de ejecutar la secuencia de comandos 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. Apaga y elimina la máquina virtual:

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

    Ten en cuenta que el disco secundario no se ha eliminado porque se ha montado con el parámetro auto-delete=no.

El disco ya está listo para usarse. Puedes conectar el disco en modo de solo lectura a una o varias instancias de VM de la misma zona.

Comparte 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. En Cloud Shell, crea una imagen a partir del disco que has creado en la sección anterior:

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

Limpieza

Para evitar que se te apliquen más cargos después de completar este proceso, puedes eliminar los recursos que has creado:

  1. Elimina el disco:

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

    gcloud compute images delete $DISK_NAME
    

Siguientes pasos