Créer une image de disque persistant à partir d'un fichier ISO


Le support d'installation pour les applications Windows est souvent fourni sous forme de fichier ISO, mais Compute Engine ne permet pas d'exposer un fichier ISO en tant que lecteur DVD virtuel sur une instance de VM.

Pour accéder au contenu du fichier ISO sur une seule VM Windows, vous pouvez effectuer l'une des opérations suivantes :

  • Copiez le fichier ISO sur la VM et installez-le localement. Cette approche fonctionne bien si vous n'avez besoin d'accéder au contenu du fichier ISO que sur une seule instance de VM.

  • Créez un disque persistant à partir du fichier ISO et associez le disque en mode lecture seule à une ou plusieurs instances de VM. Cette approche fonctionne bien si plusieurs VM nécessitent d'accéder au contenu du fichier ISO.

Ce document explique comment créer un disque persistant à partir du fichier ISO et l'associer en mode lecture seule à une ou plusieurs VM.

Avant de commencer

  • Si ce n'est pas déjà fait, configurez l'authentification. L'authentification est le processus permettant de valider votre identité pour accéder aux services et aux API Google Cloud. Pour exécuter du code ou des exemples depuis un environnement de développement local, vous pouvez vous authentifier auprès de Compute Engine en sélectionnant l'une des options suivantes:

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

      gcloud init
    2. Set a default region and zone.

Préparer le fichier ISO

Si le fichier ISO est accessible au public via HTTP, vous n'avez pas besoin de le télécharger au préalable. Pour utiliser un fichier ISO local, vous pouvez l'importer dans Cloud Storage.

URL HTTP

  1. Dans la console Google Cloud, ouvrez Cloud Shell en cliquant sur le bouton Activer Cloud Shell Activez Cloud Shell..

    Accédez à la console Google Cloud.

  2. Créez une variable d'environnement pour l'URL de téléchargement. Vous pouvez utiliser une URL HTTP ou HTTPS, pourvu qu'elle soit accessible de manière anonyme.

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

Fichier ISO local

  1. Dans la console Google Cloud, créez un bucket Cloud Storage.

    Accédez à la console Google Cloud.

  2. Importez le fichier ISO.

    En fonction de la taille du fichier ISO, l'importation peut prendre plusieurs minutes ou plusieurs heures.

  3. Dans le navigateur de stockage, accédez à l'objet importé.

  4. Sur la page Détails de l'objet, copiez l'URI de l'objet. L'URI commence par gs://.

  5. Ouvrez Cloud Shell en cliquant sur le bouton Activer Cloud Shell Activez Cloud Shell..

    Accédez à la console Google Cloud.

  6. Créez une variable d'environnement pour l'URL de téléchargement. Remplacez URI par l'URI que vous avez copié.

    ISO_URL=URI
    

Créer un disque avec le contenu du fichier ISO

Pour copier le contenu du fichier ISO sur un nouveau disque, créez une VM temporaire, puis créez une image à partir du disque :

  1. Dans Cloud Shell, spécifiez le nom que vous souhaitez attribuer au nouveau disque :

    DISK_NAME=iso
    
  2. Créez un disque sur lequel copier le contenu des fichiers ISO :

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

    Utilisez une taille de disque plus importante si votre fichier ISO dépasse 9 Go.

  3. Créez un script de démarrage pour la VM temporaire. Le script de démarrage effectue les actions suivantes :

    1. Formatage du disque secondaire avec le système de fichiers NTFS.
    2. Téléchargement du fichier ISO à partir de l'URL HTTP ou Cloud Storage que vous avez spécifiée.
    3. Installation du fichier ISO et copie de son contenu sur le disque secondaire.
    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. Créez une VM Windows Server 2019 qui utilise le script de démarrage et le disque que vous avez créés précédemment:

    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
    

    Le démarrage de la VM prend environ deux minutes. Selon la taille du fichier ISO, l'opération de copie du fichier peut prendre entre 5 et 15 minutes. Vous pouvez suivre la progression en exécutant la commande suivante :

    gcloud compute instances tail-serial-port-output iso-copier \
        --zone=$(gcloud config get-value compute/zone)
    
  5. Attendez que la VM ait terminé d'exécuter le script de démarrage :

    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. Arrêtez et supprimez la VM :

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

    Notez que le disque secondaire n'est pas supprimé, car il a été installé avec le paramètre auto-delete=no.

Le disque est maintenant prêt à être utilisé. Vous pouvez associer le disque en mode lecture seule à une ou plusieurs instances de VM dans la même zone.

Partager le disque entre plusieurs zones et régions en créant une image

Pour rendre le contenu du fichier ISO disponible dans d'autres zones ou régions, créez une image Compute Engine :

  1. Dans Cloud Shell, créez une image à partir du disque que vous avez créé dans la section précédente :

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

Effectuer un nettoyage

Pour éviter des frais supplémentaires une fois ce processus terminé, vous pouvez supprimer les ressources que vous avez créées :

  1. Supprimez le disque :

    gcloud compute disks delete $DISK_NAME \
        --zone=$(gcloud config get-value compute/zone) \
        --quiet
    
  2. Supprimez l'image :

    gcloud compute images delete $DISK_NAME
    

Étape suivante