Préparer un disque dur virtuel Debian pour Azure

S’applique à : ✔️ Machines virtuelles Linux ✔️ Groupes de machines virtuelles identiques flexibles

Prérequis

Cette section suppose que vous avez déjà installé un système d’exploitation Linux Debian à l’aide d’un fichier .iso téléchargé à partir du site web de Debian sur un disque dur virtuel. Plusieurs outils permettent de créer des fichiers .vhd. Hyper-V n’est qu’un seul exemple. Pour obtenir des instructions sur l’utilisation d’Hyper-V, consultez Installer le rôle Hyper-V et configurer une machine virtuelle.

Notes d'installation

Important

La préparation NVMe à distance décrite dans cet article est facultative. Effectuez cette opération uniquement si vous créez une image que vous envisagez de déployer avec un contrôleur de disque NVMe distant. Si la machine virtuelle cible utilise SCSI, ignorez la section NVMe distante et conservez les paramètres standard. Le NVMe à distance nécessite une image Gen2. Avant de créer une image NVMe, vérifiez que la version de Debian figure dans les images de système d’exploitation prise en charge pour le NVMe distant et que la taille exacte de la machine virtuelle cible indique NVMe dans sa capacité DiskControllerTypes.

  • Pour obtenir d’autres conseils sur la préparation de Linux pour Azure, consultez les notes générales sur l’installation de Linux.
  • Azure ne prend pas en charge le format VHDX plus récent. Vous pouvez convertir le disque au format VHD en utilisant le gestionnaire Hyper-V ou la cmdlet convert-vhd.
  • Quand vous installez le système Linux, nous vous recommandons d’utiliser les partitions standard plutôt que le gestionnaire de volumes logiques (LVM, Logical Volume Manager), qui constitue souvent le choix par défaut pour de nombreuses installations. L’utilisation de partitions permet d’éviter les conflits de noms LVM avec des machines virtuelles clonées, en particulier si un disque de système d’exploitation doit être attaché à une autre machine virtuelle à des fins de dépannage. Vous pouvez également utiliser LVM ou RAID sur des disques de données.
  • Ne configurez pas une partition d’échange sur le disque du système d’exploitation. Vous pouvez configurer l’agent Linux Azure pour créer un fichier d’échange sur le disque de ressources temporaire. Vous trouverez plus d’informations dans les étapes suivantes.
  • Tous les VHD sur Azure doivent avoir une taille virtuelle alignée sur 1 Mo. Lorsque vous convertissez un disque brut en VHD, vous devez vous assurer que la taille du disque brut est un multiple de 1 Mo avant la conversion. Pour plus d’informations, consultez les notes d’installation de Linux.

Important

Les conseils d’échange qui utilisent le disque de ressource temporaire s’appliquent uniquement aux tailles de machine virtuelle qui incluent le stockage temporaire local. Le type de contrôleur de disque distant, SCSI ou NVMe, ne détermine pas si un disque de ressource est disponible.

Préparer une image Debian pour Azure

Vous pouvez créer l’image cloud Azure Debian de base avec le générateur d’images cloud FAI (Fully Automatic Installation). Pour préparer une image sans FAI, consultez l’article sur les étapes génériques.

Les commandes git clone et apt install suivantes ont été extraites du référentiel d’images cloud Debian. Pour commencer, clonez le référentiel et installez les dépendances :

$ git clone https://salsa.debian.org/cloud-team/debian-cloud-images.git
$ sudo apt install --no-install-recommends ca-certificates debsums dosfstools \
    fai-server fai-setup-storage make python3 python3-libcloud python3-marshmallow \
    python3-pytest python3-yaml qemu-utils udev
$ cd ./debian-cloud-images

Facultatif : personnalisez la build en ajoutant des scripts (par exemple, des scripts d’interpréteur de commandes) à ./config_space/scripts/AZURE.

Exemple de script pour personnaliser l’image

$ mkdir -p ./config_space/scripts/AZURE
$ cat > ./config_space/scripts/AZURE/10-custom <<EOF
#!/bin/bash

\$ROOTCMD bash -c "echo test > /usr/local/share/testing"
EOF
$ sudo chmod 755 ./config_space/scripts/AZURE/10-custom

Préfixez les commandes que vous souhaitez utiliser pour personnaliser l’image avec $ROOTCMD. Son alias est chroot $target.

Valider la configuration du disque Debian

Pour les images SCSI et NVMe, ajoutez un script de personnalisation FAI qui valide /etc/fstab et rejette les noms de disques non personnalisés :

$ cat > ./config_space/scripts/AZURE/15-storage-validation <<'EOF'
#!/bin/bash
set -eu

$ROOTCMD findmnt --verify --verbose

if $ROOTCMD grep -Eq '^[[:space:]]*[^#].*[[:space:]]/dev/(sd|nvme)' /etc/fstab; then
    echo 'Replace /dev/sd* and /dev/nvme* entries in /etc/fstab with UUIDs or another persistent identifier.' >&2
    exit 1
fi
EOF
$ sudo chmod 755 ./config_space/scripts/AZURE/15-storage-validation

Préparer l’image Debian pour un NVMe distant

Terminez cette section uniquement si vous créez une image pour un contrôleur de disque NVMe distant. Sinon, continuez à générer l’image Debian Azure sans ajouter ce script.

Ajoutez un autre script de personnalisation FAI avant de générer l’image NVMe. Le script rend les pilotes NVMe disponibles au démarrage précoce et définit le délai d’expiration des E/S NVMe Azure.

$ cat > ./config_space/scripts/AZURE/20-nvme <<'EOF'
#!/bin/bash
set -eu

$ROOTCMD bash -c "printf '%s\n' nvme nvme_core >> /etc/initramfs-tools/modules"
$ROOTCMD update-initramfs -u -k all
$ROOTCMD sed -i '/^GRUB_CMDLINE_LINUX_DEFAULT=/ s/"$/ nvme_core.io_timeout=240"/' /etc/default/grub
$ROOTCMD update-grub

$ROOTCMD modinfo nvme
$ROOTCMD modinfo nvme_core
$ROOTCMD bash -c "lsinitramfs /boot/initrd.img-\$(ls /lib/modules | sort -V | tail -1) | grep -Eq 'nvme(_core)?\\.ko'"
EOF
$ sudo chmod 755 ./config_space/scripts/AZURE/20-nvme

Important

Passez en revue la ligne de commande GRUB générée et /etc/initramfs-tools/modules pour connaître les entrées dupliquées si votre configuration FAI définit déjà ces valeurs. nvme et nvme_core doivent tous deux être présents dans l’initramfs généré.

Générer l’image Azure Debian

$ make image_[release]_azure_amd64

Cette commande génère quelques fichiers dans le répertoire actuel, notamment le fichier image image_[release]_azure_amd64.raw.

Convertissez l’image brute au format VHD pour Azure :

rawdisk="image_[release]_azure_amd64.raw"
vhddisk="image_[release]_azure_amd64.vhd"

MB=$((1024*1024))
size=$(qemu-img info -f raw --output json "$rawdisk" | \
gawk 'match($0, /"virtual-size": ([0-9]+),/, val) {print val[1]}')

rounded_size=$(((($size+$MB-1)/$MB)*$MB))
rounded_size_adjusted=$(($rounded_size + 512))

echo "Rounded Size Adjusted = $rounded_size_adjusted"

sudo qemu-img resize "$rawdisk" $rounded_size
qemu-img convert -f raw -o subformat=fixed,force_size -O vpc "$rawdisk" "$vhddisk"

Ce processus crée un VHD image_[release]_azure_amd64.vhd avec une taille arrondie afin qu’il puisse être copié correctement sur un disque Azure.

Remarque

Au lieu de cloner le référentiel de salsa et de créer des images localement, les images stables actuelles peuvent être créées et téléchargées à partir de FAI.

Après avoir créé une image de disque dur virtuel Debian stable et avant de la charger, vérifiez que les packages suivants sont installés :

sudo apt update
sudo apt install hyperv-daemons
sudo apt install waagent # *(Optional but recommended for password resets and the use of extensions)*
sudo apt-get install cloud-init

Effectuez ensuite une mise à niveau complète :

sudo apt full-upgrade

Vous devez à présent créer les ressources Azure pour cette image. Cet exemple utilisant la variable $rounded_size_adjusted, elle doit donc provenir du même processus d’interpréteur de commandes que celui de l’étape précédente.

Définissez la génération Hyper-V avant de créer le disque managé. L’exemple est défini par défaut V1 pour une image SCSI standard. Remplacez-la par V2 uniquement si vous effectuez la préparation NVMe à distance ou préparez autrement une image de 2e génération.

HYPER_V_GENERATION=V1

az group create -l $LOCATION -n $RG

az disk create \
    -n $DISK \
    -g $RG \
    -l $LOCATION \
    --for-upload --upload-size-bytes "$rounded_size_adjusted" \
    --sku standard_lrs --hyper-v-generation $HYPER_V_GENERATION

ACCESS=$(az disk grant-access \
    -n $DISK -g $RG \
    --access-level write \
    --duration-in-seconds 86400 \
    --query accessSas -o tsv)

azcopy copy "$vhddisk" "$ACCESS" --blob-type PageBlob

az disk revoke-access -n $DISK -g $RG
az image create \
    -g $RG \
    -n $IMAGE \
    --os-type linux \
    --hyper-v-generation $HYPER_V_GENERATION \
    --source $(az disk show \
        -g $RG \
        -n $DISK \
        --query id -o tsv)
az vm create \
    -g $RG \
    -n $VM \
    --ssh-key-value $SSH_KEY_VALUE \
    --public-ip-address-dns-name $VM \
    --image $(az image show \
        -g $RG \
        -n $IMAGE \
        --query id -o tsv)

Si la bande passante entre votre ordinateur local et le disque Azure est à l’origine d’un long délai de traitement du chargement avec azcopy, vous pouvez utiliser un serveur de rebond (jumpbox) de machine virtuelle Azure pour accélérer le processus. Voici comment effectuer ce processus :

  1. Créez une archive tar du VHD sur votre ordinateur local : tar -czvf ./image_buster_azure_amd64.vhd.tar.gz ./image_[release]_azure_amd64.vhd.
  2. Créez une machine virtuelle Azure Linux (distribution de votre choix). Assurez-vous de le créer avec un disque d’une taille suffisante pour contenir le VHD extrait.
  3. Téléchargez l’utilitaire azcopy sur la machine virtuelle Azure Linux. Vous pouvez l’obtenir à partir de Get started with AzCopy.
  4. Copiez l’archive tar sur la machine virtuelle : scp ./image_buster_azure_amd64.vhd.tar.gz <vm>:~.
  5. Sur la machine virtuelle, extrayez le VHD : tar -xf ./image_buster_azure_amd64.vhd.tar.gz. Cette étape prend un peu de temps en fonction de la taille du fichier.
  6. Enfin, sur la machine virtuelle, copiez le VHD sur le disque Azure à l’aide de azcopy (la commande précédente).

Vous êtes maintenant prêt à utiliser votre disque dur virtuel Linux Debian pour créer des machines virtuelles dans Azure. S’il s’agit de votre premier chargement du fichier .vhd sur Azure, consultez Créer une machine virtuelle Linux à partir d’un disque personnalisé.

Pour une machine virtuelle Azure existante que vous devez passer de SCSI à NVMe, utilisez Convertir des machines virtuelles Linux et Windows de SCSI en NVMe. Pour plus d’informations sur l’architecture et la prise en charge, consultez la vue d’ensemble de NVMe.