Vorbereiten einer Debian-VHD für Azure

Gilt für: ✔️ Linux-VMs ✔️ Flexible Skalierungsgruppen

Voraussetzungen

In diesem Abschnitt wird davon ausgegangen, dass Sie bereits ein Debian Linux-Betriebssystem auf der Grundlage einer ISO-Datei von der Debian-Website auf einer virtuellen Festplatte (Virtual Hard Disk, VHD) installiert haben. Zum Erstellen von VHD-Dateien stehen mehrere verschiedene Tools bereit. Hyper-V ist nur ein Beispiel. Anweisungen zur Verwendung von Hyper-V finden Sie unter Installieren von Hyper-V und Erstellen eines virtuellen Computers.

Installationshinweise

Important

Die Remote-NVMe-Vorbereitung in diesem Artikel ist optional. Führen Sie dies nur aus, wenn Sie ein Image erstellen, das Sie mit einem Remote-NVMe-Datenträgercontroller bereitstellen möchten. Wenn die Ziel-VM SCSI verwendet, überspringen Sie den Remote-NVMe-Abschnitt, und behalten Sie die Standardeinstellungen bei. Remote NVMe erfordert ein Gen2-Image. Bevor Sie ein NVMe-Image erstellen, vergewissern Sie sich, dass das Debian-Release in Unterstützte Betriebssystemimages für Remote-NVMe aufgeführt ist und dass die genaue Ziel-VM-Größe NVMe in ihrer DiskControllerTypes-Eigenschaft ausweist.

  • Weitere Tipps zur Vorbereitung von Linux für Azure finden Sie unter Allgemeine Installationshinweise für Linux.
  • Das modernere VHDX-Format wird in Azure nicht unterstützt. Sie können den Datenträger mit dem Hyper-V-Manager oder dem convert-vhd-Cmdlet in das VHD-Format konvertieren.
  • Beim Installieren des Linux-Systems wird empfohlen, anstelle von LVM (Logical Volume Manager, logische Volumeverwaltung) – bei vielen Installationen oftmals voreingestellt – die Standardpartitionen zu verwenden. Durch die Verwendung von Partitionen wird vermieden, dass ein LVM-Namenskonflikt mit geklonten VMs auftritt, insbesondere dann, wenn ein Betriebssystemdatenträger zu Fehlerbehebungszwecken mit einer anderen VM verbunden wird. LVM oder RAID können ebenfalls auf Datenträgern verwendet werden.
  • Konfigurieren Sie keine Auslagerungspartition auf dem Betriebssystemdatenträger. Der Azure-Linux-Agent kann konfiguriert werden, eine Auslagerungsdatei auf dem temporären Ressourcendatenträger zu erstellen. Weitere Informationen erhalten Sie in den folgenden Schritten.
  • Alle VHDs in Azure müssen eine virtuelle Größe aufweisen, die an 1 MB ausgerichtet ist. Stellen Sie beim Konvertieren von einem RAW-Datenträger in VHD sicher, dass die Größe des RAW-Datenträgers vor der Konvertierung ein Vielfaches von 1 MB beträgt. Weitere Informationen finden Sie in den Linux-Installationshinweisen.

Important

Hinweise zur Swapkonfiguration, die den temporären Ressourcendatenträger verwenden, gelten nur für VM-Größen, die lokalen temporären Speicher umfassen. Der Typ des Remotedatenträgercontrollers, SCSI oder NVMe, bestimmt nicht, ob ein Ressourcendatenträger verfügbar ist.

Vorbereiten eines Debian-Images für Azure

Sie können das Azure Debian-Basis-Cloud-Image mit dem FAI-Cloud-Image-Builder (Fully Automatic Installation, vollautomatische Installation) erstellen. Um ein Image ohne FAI vorzubereiten, lesen Sie den Artikel mit den allgemeinen Schritten.

Die folgenden git clone- und apt-Installationsbefehle wurden aus dem Debian-Cloudimagerepository gepullt. Klonen Sie zunächst das Repository, und installieren Sie Abhängigkeiten:

$ 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

Optional: Passen Sie den Build an, indem Sie Skripte (z. B. Shell-Skripte) zu ./config_space/scripts/AZURE hinzufügen.

Skriptbeispiel zum Anpassen des Images

$ 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

Stellen Sie allen Befehlen, die Sie zur Anpassung des Images verwenden möchten, $ROOTCMD voran. Als Alias wird chroot $target verwendet.

Überprüfen der Debian-Datenträgerkonfiguration

Fügen Sie für SCSI- und NVMe-Images ein FAI-Anpassungsskript hinzu, das nichtpersistent Datenträgernamen überprüft /etc/fstab und ablehnt:

$ 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

Vorbereiten des Debian-Images für remote NVMe

Schließen Sie diesen Abschnitt nur ab, wenn Sie ein Image für einen REMOTE-NVMe-Datenträgercontroller erstellen. Fahren Sie andernfalls mit dem Build des Azure Debian-Images fort, ohne dieses Skript hinzuzufügen.

Fügen Sie ein weiteres FAI-Anpassungsskript hinzu, bevor Sie das NVMe-Image erstellen. Das Skript stellt die NVMe-Treiber während des frühen Starts zur Verfügung und legt das Azure NVMe-E/A-Timeout fest.

$ 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

Überprüfen Sie die generierte GRUB-Befehlszeile und /etc/initramfs-tools/modules auf doppelte Einträge, wenn ihre FAI-Konfiguration diese Werte bereits festlegt. Sowohl nvme als auch nvme_core müssen im generierten Initramfs vorhanden sein.

Erstellen des Azure Debian-Images

$ make image_[release]_azure_amd64

Mit diesem Befehl werden einige Dateien im aktuellen Verzeichnis ausgegeben, insbesondere die Imagedatei image_[release]_azure_amd64.raw.

Konvertieren Sie das unformatierte Image für Azure in das VHD-Format:

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"

Bei diesem Vorgang wird die VHD image_[release]_azure_amd64.vhd mit einer gerundeten Größe erstellt, sodass sie erfolgreich auf einen Azure-Datenträger kopiert werden kann.

Hinweis

Anstatt das Salsa-Repository zu klonen und Images lokal zu erstellen, können aktuelle stabile Images auf FAI erstellt und heruntergeladen werden.

Überprüfen Sie nach dem Erstellen eines stabilen Debian-VHD-Images und vor dem Hochladen, ob die folgenden Pakete installiert sind:

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

Führen Sie dann ein vollständiges Upgrade durch:

sudo apt full-upgrade

Jetzt müssen die Azure-Ressourcen für dieses Image erstellt werden. In diesem Beispiel wird die Variable $rounded_size_adjusted verwendet, daher sollte sie aus demselben Shellprozess aus dem vorherigen Schritt stammen.

Legen Sie die Hyper-V Generation fest, bevor Sie den verwalteten Datenträger erstellen. Im Beispiel wird für ein Standard-SCSI-Image standardmäßig V1 verwendet. Ändern Sie dies nur zu V2, wenn Sie den Abschnitt zur Remote-NVMe-Vorbereitung abschließen oder anderweitig ein Image der Generation 2 vorbereiten.

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)

Wenn die Bandbreite von Ihrem lokalen Computer zum Azure-Datenträger zu einer langwierigen Verarbeitung des Uploads mit azcopy führt, können Sie eine Azure-VM-Jumpbox verwenden, um den Prozess zu beschleunigen. Hier wird gezeigt, wie es geht:

  1. Erstellen Sie einen Tarball der VHD auf Ihrem lokalen Computer: tar -czvf ./image_buster_azure_amd64.vhd.tar.gz ./image_[release]_azure_amd64.vhd.
  2. Erstellen Sie eine Azure Linux-VM (Distribution Ihrer Wahl). Stellen Sie sicher, dass Sie es mit einem Datenträger erstellen, der groß genug ist, um die extrahierte VHD aufzunehmen.
  3. Laden Sie das Hilfsprogramm azcopy auf die Azure Linux-VM herunter. Sie können es unter Erste Schritte mit AzCopy abrufen.
  4. Kopieren Sie den Tarball auf die VM: scp ./image_buster_azure_amd64.vhd.tar.gz <vm>:~.
  5. Extrahieren Sie auf der VM die VHD: tar -xf ./image_buster_azure_amd64.vhd.tar.gz. Dieser Schritt dauert je nach Größe der Datei eine Weile.
  6. Zum Schluss kopieren Sie die VHD auf der VM mit azcopy (oben stehender Befehl) auf den Azure-Datenträger.

Sie können jetzt Ihre Debian Linux-VHD verwenden, um neue VMs in Azure zu erstellen. Wenn Sie die .vhd-Datei zum ersten Mal in Azure hochladen, siehe Erstellen einer Linux-VM aus einem benutzerdefinierten Datenträger.

Für eine vorhandene Azure-VM, die Sie von SCSI zu NVMe migrieren müssen, verwenden Sie Linux- und Windows-VMs von SCSI zu NVMe konvertieren. Informationen zu Architektur und Support finden Sie in der NVMe-Übersicht.