Partager via


FAQ sur les disques NVMe temporaires

Cet article répond à certaines questions courantes sur la prise en charge des disques NVMe (Non Volatile Memory Express) temporaires sur des machines virtuelles créées dans Azure. Dans cet article, le terme « disque temporaire » fait référence au disque temporaire créé sur le disque SSD local.

Quelles sont les conditions préalables à la création d’un disque temporaire qui utilise l’interface NVMe pour ma machine virtuelle ?

La prise en charge de NVMe pour les disques temporaires locaux varie au niveau de la famille de machines virtuelles. Toutes les nouvelles machines virtuelles v6 avec disque local prennent en charge les disques temporaires NVMe, mais les machines virtuelles v5 et les versions antérieures peuvent ne pas prendre en charge les disques temporaires locaux NVMe, car la plupart de ces tailles sont sur l’interface SCSI. Certaines familles de machines virtuelles comme la série L ont des disques SSD NVMe attachés localement à partir de machines virtuelles de génération Lsv2. Reportez-vous aux présentations de la famille de machines virtuelles pour déterminer si les disques temporaires NVMe sont pris en charge. Notez également que votre système d’exploitation invité doit prendre en charge le pilote NVMe afin d’utiliser nvMe local, dont la plupart des versions récentes du système d’exploitation ont par défaut.

Qu’est-ce qui différencie les disques NVMe temporaires des machines virtuelles Dl/D/E_v6 des disques NVMe distants ?

Une différence clé est que les disques NVMe temporaires sont transitoires et les données sur les machines virtuelles peuvent disparaître, mais les données sur les disques NVMe distants restent. Tenez compte de cette différence lorsque vous choisissez les options de stockage de votre machine virtuelle.

Contrairement aux machines virtuelles de série D/E précédentes, les nouvelles machines virtuelles v6 sont fournies avec des disques NVMe bruts et non formatés. Les clients doivent initialiser et formater les disques dans un système de fichiers de leur préférence après le démarrage de la machine virtuelle.

Les machines virtuelles de la série Dl/D/E v6 sont optimisées pour utiliser le disque NVMe temporaire local sur le nœud attaché directement à la machine virtuelle, plutôt que les disques locaux des interfaces SCSI précédemment utilisés. Cette méthode offre des opérations d’entrée/sortie par seconde et un débit plus élevés pour vos charges de travail.

Quelles modifications dois-je anticiper lors de la configuration de machines virtuelles avec des disques NVMe temporaires ?

  • Les disques doivent être initialisés et formatés après le démarrage de la machine virtuelle. Après l’arrêt, la désallocation ou la maintenance planifiée initiés par l’utilisateur, et les événements de récupération automatique initiés par Azure, les machines virtuelles démarrent uniquement avec des disques NVMe temporaires bruts. Aucun disque NVMe temporaire n’est visible pour les applications jusqu’à qu’elles aient été initialisées et mises en forme.

  • Le cas échéant, vous pouvez étendre des lecteurs NVMe isolés en un après le démarrage de la machine virtuelle.

  • Un fichier d’échange Windows se trouve sur les disques de système d’exploitation persistants (sauf si vous utilisez la fonctionnalité de système d’exploitation éphémère). Toutefois et si nécessaire, vous pouvez le déplacer vers des disques NVMe temporaires après le démarrage de la machine virtuelle.

  • Le cas échéant, la fonctionnalité de système d’exploitation éphémère convertit un ou plusieurs disques NVMe (en fonction de la machine virtuelle et de la taille de l’image) en disque SCSI/VHD plus lent, similaire à celui des machines virtuelles v5 et antérieures. Pour les tailles de machine virtuelle supérieures, les lecteurs restants restent au format NVMe brut non formaté.

  • La liste des unités de conservation de stock de ressources (SKU) dans l’API REST expose plusieurs fonctionnalités de machines virtuelles. L’itération suivante des tailles de machine virtuelle utilise le protocole NVMe plus rapide et plus efficace pour le stockage local, au lieu du protocole SCSI utilisé par des tailles de machine virtuelle antérieures.

    Pour les machines virtuelles Azure, le stockage local basé sur SCSI est appelé disque de ressources temporaire. La valeur MaxResourceVolumeMB spécifie la taille de ce disque. En revanche, la valeur NVMeDiskSizeInMiB détermine la taille du stockage local basé sur NVMe.

Quel est le chiffrement minimal proposé par Azure pour les disques NVMe temporaires ?

Tous les disques NVMe locaux sur des machines virtuelles Azure ont un chiffrement intégré activé par défaut pour la protection des données. Les disques NVMe temporaires prennent en charge la fonctionnalité de chiffrement de données au repos. Une clé de chiffrement de données unique chiffre les données de chaque disque NVMe temporaire affecté à la machine virtuelle. Une clé de chiffrement à clé (KEK) permet de protéger la clé DEK. Lorsque vous supprimez une machine virtuelle, les données sur le disque NVMe temporaire sont effacées par chiffrement. Toutes les machines virtuelles v6 introduites à partir de 2024 et ultérieures ont leurs lecteurs NVMe locaux chiffrés par défaut à l’aide du chiffrement basé sur le matériel avec une clé gérée par la plateforme.

  • Les données sont chiffrées à l’aide de XTS-AES-256, AES-256-GCM ou d’un chiffrement plus fort.
  • L’appareil génère une clé MEK (Media Encryption Key) unique pour chaque disque de la machine virtuelle.
  • Le MEK est :
    • Généré et stocké entièrement dans le matériel de l’appareil.
    • Jamais exposé à l’hôte, à la machine virtuelle ou à tout composant externe, y compris l’opérateur ou le système Azure.
  • Toutes les opérations de chiffrement et de déchiffrement se produisent dans l’appareil à l’aide de la clé MEK.
  • Le MEK est détruit lorsque vous supprimez votre machine virtuelle, ce qui garantit qu’aucun composant ne peut accéder aux données par la suite.

Qu’est-ce que le chiffrement amélioré au repos ?

Le chiffrement amélioré au repos est une autre couche de protection disponible sur les machines virtuelles de la série V6 et Lsv4 Azure via la prise en charge des normes TCG-OPAL. Vous n’avez pas besoin d’effectuer d’action pour cette fonctionnalité, il s’agit de la valeur par défaut pour ces types de machines virtuelles.

  • Une valeur de code confidentiel est générée et stockée en toute sécurité par l’infrastructure Azure pour chaque MEK.
  • Le code confidentiel est transmis via une fonction de dérivation de clé (KDF) au sein de l’appareil de stockage pour générer une clé de chiffrement de clé (KEK). Le code confidentiel agit en tant que clé de gestion de plateforme (PMK).
  • Le MEK est chiffré à l’aide de la clé KEK et stocké en interne dans l’appareil de stockage.
  • La clé KEK n’est pas stockée n’importe où et est générée dynamiquement par l’appareil de stockage lorsque le code confidentiel est utilisé pour l’authentifier correctement. Sans ce code confidentiel, l’appareil ne peut pas déchiffrer ses propres données stockées, même s’il est accessible physiquement.
  • L’appareil de stockage est authentifié lorsque la machine virtuelle est démarrée et verrouillée lorsque la machine virtuelle est arrêtée, ce qui garantit que l’accès aux données est disponible uniquement lorsque la machine virtuelle est en cours d’exécution.

Comment redimensionner une machine virtuelle v5 ou antérieure avec un disque temporaire vers v6 ?

Comment puis-je identifier mon disque NVMe temporaire ?

Vous pouvez exécuter la commande suivante pour Windows :

Get-PhysicalDisk | where { $_.FriendlyName.contains("NVMe Direct Disk")}

Vous pouvez exécuter la commande suivante pour Linux :

sudo nvme id-ns /dev/nvme0n1 -b | dd bs=1 skip=384 status=none | sed 's/\x00*$//'

Comment formater et initialiser des disques NVMe temporaires dans Windows lorsque je crée une machine virtuelle ?

Vous pouvez utiliser l’interface graphique utilisateur ou Azure PowerShell.

Interface graphique utilisateur

Conseil

L’exemple d’interface graphique utilisateur suivant est fourni à des fins d’illustration. Il est recommandé de créer des scripts visant à automatiser ce workflow pour les déploiements de production.

  1. Appuyez sur la touche Windows + R pour ouvrir la boîte de dialogue Exécuter. Tapez diskmgmt.msc et appuyez sur la touche Entrée.

    Capture d’écran représentant la saisie d’une commande de gestion de disques dans la boîte de dialogue Exécuter.

  2. Sélectionnez un style de partition (MBR ou GPT) et les disques à initialiser, puis cliquez sur OK.

    Capture d’écran de la boîte de dialogue permettant d’initialiser un disque pour la gestion de disques.

  3. Cliquez avec le bouton droit sur le disque à partitionner, puis cliquez sur Nouveau volume simple.

    Capture d’écran du menu permettant de sélectionner un nouveau type de volume.

  4. Pour spécifier des éléments comme la taille du volume, la lettre de lecteur, le système de fichiers et l’étiquette de volume, suivez l’Assistant Nouveau volume simple. Cliquez sur le bouton Suivant pour avancer dans l’assistant.

    Capture d’écran de la spécification de la taille du volume dans l’Assistant Nouveau volume simple.

    Capture d’écran de la spécification de la lettre de lecteur dans l’Assistant Nouveau volume simple.

    Capture d’écran de la spécification du formatage de partition dans l’Assistant Nouveau volume simple.

  5. Pour terminer la partition et le formatage, passez en revue vos paramètres, puis sélectionnez Terminer.

    Capture d’écran de la fin de l’Assistant Nouveau volume simple.

  6. Vérifiez que les disques NVMe formatés et initialisés s’affichent dans l’outil de gestion des disques Windows de façon similaire à Nouveau volume (E:) dans cet exemple.

    Capture d’écran de l’outil de gestion des disques montrant un nouveau volume.

Script Azure PowerShell

Conseil

Le script suivant initialise, formate et attribue les lettres de lecteur. Toutefois, il efface toutes les données sur le disque. Vous devez le tester soigneusement sur vos machines virtuelles avant de le déployer en production.

# Select the raw NVMe disks to partition and format 

$RawNvmeDisks = Get-PhysicalDisk -CanPool $True | where { $_.FriendlyName.contains("NVMe Direct Disk")} 

# Create a pool of the existing disks

New-StoragePool -FriendlyName NVMePool -StorageSubsystemFriendlyName "Windows Storage*" -PhysicalDisks $RawNvmeDisks -ResiliencySettingNameDefault Simple 

#Create a new disk, initialize, partition, and format

$Disk = New-VirtualDisk -FriendlyName NVMeTemporary -StoragePoolFriendlyName NVMePool -NumberOfColumns @($RawNvmeDisks).count  -PhysicalDiskRedundancy 0 -ResiliencySettingName "Simple" -UseMaximumSize

$Disk | Initialize-Disk 

#Create a partition and format. Ignore the pop-up. 

New-Partition -DiskId $Disk.UniqueId  -AssignDriveLetter -UseMaximumSize | Format-Volume

Comment puis-je formater et initialiser des disques NVMe temporaires dans Linux ?

Le script suivant fournit un exemple d’initialisation de disques NVMe temporaires dans Linux. Le script énumère tous les disques NVMe temporaires sur la machine virtuelle, combine les disques dans un seul tableau RAID 0 et crée une partition formatée du système de fichiers spécifié.

Les disques NVMe temporaires sont distingués par le numéro de modèle, qui apparaît sous la forme Microsoft NVMe Direct Disk au système d’exploitation invité. Ce script utilise la commande nvme-cli id-ctrl pour interroger le numéro de modèle de chaque appareil NVMe.

Le script vérifie d’abord les volumes de disque NVMe temporaires déjà créés (identifiés par l’étiquette filesystem). Si un tableau semble présent, le script vérifie l’intégrité du tableau et répète le processus d’initialisation si nécessaire. Le tableau est réinitialisé dans les cas suivants :

  • Un ou plusieurs disques temporaires de tableau sont manquants.
  • Des disques temporaires ne sont pas encore incorporés dans le tableau.
  • Le tableau de disques est dans un état non valide ou inconnu.
  • Les fichiers de configuration associés sont manquants ou non valides.
#!/bin/bash 

# Script requirements:
#   nvme-cli
#   mdadm
#   gdisk
 
readonly USAGE="Usage: $(basename "$0") <filesystem> <filesystem mount point (optional)>"
 
# Label used to identify the NVMe array file system and associated disks
# Can't exceed 16 characters
readonly RAID0_FILESYSTEM_LABEL="azure_nvme_temp"
# Device path used for the RAID 0 NVMe array
# Choose any unoccupied device path of format /dev/mdX (X = 0 to 99)
readonly RAID0_DEVICE_PATH="/dev/md0"
# Formatted RAID 0 partition is mounted here
readonly DEFAULT_MOUNT_POINT="/mnt/${RAID0_FILESYSTEM_LABEL}"
 
filesystem="$1"
if [ ! "$filesystem" ]; then
    printf "No filesystem specified. Usage: $USAGE\n"
    exit 1
fi
if ! [ -x "$(command -v mkfs.$filesystem)" ]; then
    printf "Filesystem \"$filesystem\" not supported by mkfs\n$USAGE\n"
    exit 1
fi
 
mount_point="$2"
if [ ! "$mount_point" ]; then
    printf "No mount point specified. Using default: $DEFAULT_MOUNT_POINT\n"
    mount_point=$DEFAULT_MOUNT_POINT
fi
 
# Make sure mdadm.conf is present
mdadm_conf_path=""
if [ -e "/etc/mdadm/mdadm.conf" ]; then
    mdadm_conf_path="/etc/mdadm/mdadm.conf"
elif [ -e "/etc/mdadm.conf" ]; then
    mdadm_conf_path="/etc/mdadm.conf"
else
    print "Couldn't find mdadm.conf file"
    exit 1
fi
 
# Enumerate unmounted NVMe direct disks
devices=$(lsblk -p -o NAME,TYPE,MOUNTPOINT | grep "nvme" | awk '$2 == "disk" && $3 == "" {print $1}')
nvme_direct_disks=()
for device in $devices
do
    if nvme id-ctrl "$device" | grep -q "Microsoft NVMe Direct Disk"; then
        nvme_direct_disks+=("$device")
    fi
done
nvme_direct_disk_count=${#nvme_direct_disks[@]}
printf "Found $nvme_direct_disk_count NVMe Direct Disks\n"
 
# Check if there's already an NVMe Direct Disk RAID 0 disk (or remnant data)
if grep "$RAID0_FILESYSTEM_LABEL" /etc/fstab > /dev/null; then
    fstab_entry_present=true
fi
if grep "$RAID0_FILESYSTEM_LABEL" $mdadm_conf_path > /dev/null; then
    mdadm_conf_entry_present=true
fi
if [ -e $RAID0_DEVICE_PATH ]; then
    nvme_raid0_present=true
fi
if [ "$fstab_entry_present" = true ] || [ "$mdadm_conf_entry_present" = true ] || [ "$nvme_raid0_present" = true ]; then
    # Check if the RAID 0 volume and associated configurations are still intact or need to be reinitialized
    #
    # If reinitialization is needed, clear the old RAID 0 information and associated files
 
    reinit_raid0=false
    if [ "$fstab_entry_present" = true ] && [ "$mdadm_conf_entry_present" = true ] && [ "$nvme_raid0_present" = true ]; then
        # Check RAID 0 device status
        if ! mdadm --detail --test $RAID0_DEVICE_PATH &> /dev/null; then
            reinit_raid0=true
        # Test the NVMe direct disks for valid mdadm superblocks
        else
            for device in "${nvme_direct_disks[@]}"
            do
                if ! mdadm --examine $device &> /dev/null; then
                    reinit_raid0=true
                    break
                fi
            done
        fi
    else
        reinit_raid0=true
    fi
 
    if [ "$reinit_raid0" = true ]; then
        echo "Errors found in NVMe RAID 0 temp array device or configuration. Reinitializing."
 
        # Remove the file system and partition table, and stop the RAID 0 array
        if [ "$nvme_raid0_present" = true ]; then
            if [ -e ${RAID0_DEVICE_PATH}p1 ]; then
                umount ${RAID0_DEVICE_PATH}p1
                wipefs -a -f ${RAID0_DEVICE_PATH}p1
            fi
            sgdisk -o $RAID0_DEVICE_PATH &> /dev/null
            mdadm --stop $RAID0_DEVICE_PATH
        fi
 
        # Remove any mdadm metadata from all NVMe Direct Disks
        for device in "${nvme_direct_disks[@]}"
        do
            printf "Clearing mdadm superblock from $device\n"
            mdadm --zero-superblock $device &> /dev/null
        done
 
        # Remove any associated entries in fstab and mdadm.conf
        sed -i.bak "/$RAID0_FILESYSTEM_LABEL/d" /etc/fstab
        sed -i.bak "/$RAID0_FILESYSTEM_LABEL/d" $mdadm_conf_path
    else
        printf "Valid NVMe RAID 0 array present and no additional Direct Disks found. Skipping\n"
        exit 0
    fi
fi
 
if [ "$nvme_direct_disk_count" -eq 0 ]; then
    printf "No NVMe Direct Disks found\n"
    exit 1
elif [ "$nvme_direct_disk_count" -eq 1 ]; then
    additional_mdadm_params="--force"
fi
 
# Initialize enumerated disks as RAID 0
printf "Creating RAID 0 array from:\n"
printf "${nvme_direct_disks[*]}\n\n"
if ! mdadm --create $RAID0_DEVICE_PATH --verbose $additional_mdadm_params --name=$RAID0_FILESYSTEM_LABEL --level=0 --raid-devices=$nvme_direct_disk_count ${nvme_direct_disks[*]}; then
    printf "Failed to create RAID 0 array\n"
    exit 1
fi
 
# Create a GPT partition entry
readonly GPT_PARTITION_TYPE_GUID="0FC63DAF-8483-4772-8E79-3D69D8477DE4"
printf "\nCreating GPT on $RAID0_DEVICE_PATH..\n"
sgdisk -o $RAID0_DEVICE_PATH &> /dev/null
if ! sgdisk --new 1::0 --typecode 1:$GPT_PARTITION_TYPE_GUID $RAID0_DEVICE_PATH  &> /dev/null; then
    printf "Failed to create partition on $RAID0_DEVICE_PATH\n"
    exit 1
fi
 
# Format the partition
partition_path="${RAID0_DEVICE_PATH}p1"
printf "\nCreating $filesystem filesystem..\n"
if ! mkfs.$filesystem -q -L $RAID0_FILESYSTEM_LABEL $partition_path; then
    printf "Failed to create $filesystem filesystem\n"
    exit 1
fi
printf "The operation has completed successfully.\n"
 
# Add the partition to /etc/fstab
echo "LABEL=$RAID0_FILESYSTEM_LABEL $mount_point $filesystem defaults,nofail 0 0" >> /etc/fstab
 
# Add RAID 0 array to mdadm.conf
mdadm --detail --scan >> $mdadm_conf_path
update-initramfs -u
 
# Mount the partition
printf "\nMounting filesystem to $mount_point..\n"
mkdir $mount_point &> /dev/null
if ! mount -a; then
    printf "Failed to automount partition\n"
    exit 1
fi
printf "The operation has completed successfully.\n"
 
exit 0

Comment déplacer le fichier d’échange Windows du disque de système d’exploitation vers un disque NVMe temporaire ?

Vous pouvez utiliser l’interface graphique utilisateur ou Azure PowerShell.

Interface graphique utilisateur

Conseil

L’exemple d’interface graphique utilisateur suivant est fourni à des fins d’illustration. Il est recommandé de créer des scripts visant à automatiser ce workflow pour les déploiements de production.

  1. Appuyez sur la touche Windows + R pour ouvrir la boîte de dialogue Exécuter. Tapez sysdm.cpl et appuyez sur la touche Entrée.

    Capture d’écran de la boîte de dialogue Exécuter ouvrant sysdm.cpl.

  2. Cliquez sur l’onglet Avancé, puis sur le bouton Paramètres dans la section Performances.

    Capture d’écran du bouton des paramètres de performances en surbrillance dans l’onglet Avancé des propriétés système.

  3. Dans la fenêtre Options de performance, cliquez sur l’onglet Avancé, puis sur le bouton Modifier dans la section Mémoire virtuelle.

    Capture d’écran de l’onglet Avancé des Options de performance.

  4. Décochez la case Gérer automatiquement la taille du fichier d’échange pour tous les lecteurs. Si un fichier d’échange est défini sur le disque de système d’exploitation, sélectionnez le disque de système d’exploitation, sélectionnez l’option Aucun fichier d’échange, puis cliquez sur le bouton Définir. Sélectionnez le lecteur NVMe temporaire local et cliquez sur l’option Taille gérée par le système, puis sur le bouton Définir. Sélectionnez OK pour fermer toutes les boîtes de dialogue.

    Capture d’écran de la boîte de dialogue associée à la mémoire virtuelle.

Vous devrez peut-être redémarrer la machine virtuelle pour appliquer ces modifications.

Script Azure PowerShell

$OsDisk = "C:"
# This value can vary, depending on which drive letter is assigned to the disk
$NVMeDisk = "E:"

# Disable automatic pagefile management
$Computer = Get-WmiObject Win32_computersystem -EnableAllPrivileges
$Computer.AutomaticManagedPagefile = $false
$Computer.Put()

# Delete the pagefile on the OS disk
$PageFile = Get-WmiObject -Query "select * from Win32_PageFileSetting where name='$OsDisk\\pagefile.sys'"
$PageFile.Delete()

# Create a new pagefile on the NVMe drive with system-managed size
Set-WMIInstance -Class Win32_PageFileSetting -Arguments @{name="$NVMeDisk\\pagefile.sys"; InitialSize=0; MaximumSize=0} -EnableAllPrivileges

Vous devrez peut-être redémarrer la machine virtuelle pour appliquer ces modifications.

Comment déplacer le fichier d’échange Linux d’un disque de système d’exploitation vers un disque NVMe temporaire ?

  1. Sélectionnez le disque NVMe utilisé pour l’espace d’échange :

    root@D2adsv6:/ # lsblk -p
        NAME              MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
        /dev/nvme1n1      259:0    0   30G  0 disk
        ├─/dev/nvme1n1p1  259:1    0 29.9G  0 part /
        └─/dev/nvme1n1p15 259:3    0  106M  0 part /boot/efi
        /dev/nvme0n1      259:4    0   75G  0 disk
    
  2. Créez un espace d’échange sur le disque :

    root@D2adsv6:/ # mkswap /dev/nvme0n1
    Setting up swapspace version 1, size = 75 GiB (80530632704 bytes)
    no label, UUID=064bdcfb-86ae-49f3-bf9d-b956493e2a1d
    
  3. Activez l’espace d’échange :

    root@D2adsv6:/ # swapon /dev/nvme0n1
    
  4. Vérifiez que l’espace d’échange est correctement configuré :

    root@D2adsv6:/ # swapon -s
    Filename                                Type            Size    Used    Priority
    /dev/nvme0n1                            partition       78643196        0       -2
    
  5. Ajoutez l’espace d’échange à /etc/fstab pour le rendre persistant entre les redémarrages :

    root@D2adsv6:/ # echo '/dev/nvme0n1 swap swap defaults 0 0' >> /etc/fstab 
    

Quelles considérations prendre en compte pour les événements de maintenance, les redéploiements de machine virtuelle et les redémarrages de machine virtuelle ?

Les disques NVMe temporaires attachés à des machines virtuelles V6 sont éphémères, similaires aux lecteurs temporaires sur d’autres séries de machines virtuelles. Cela signifie que vous perdez toutes les données de la machine virtuelle à l’issue d’un redéploiement ou pendant un événement de maintenance. Pour plus d’informations sur les événements de maintenance et les temps d’arrêt, consultez Comprendre les redémarrages des machines virtuelles.

Si la machine virtuelle est déplacée vers un nouveau matériel, ces lecteurs démontent des disques et de nouveaux disques non montés sont présentés au système d’exploitation lorsqu’il se relance. Si la machine virtuelle n’a pas changé de matériel, les disques NVME temporaires peuvent encore être présents. Les scripts de montage des lecteurs précédents vérifient si des lecteurs non montés sont présents avant de tenter le montage.

Il est recommandé d’exécuter automatiquement le script de montage chaque fois que la machine virtuelle démarre et de retarder tous les autres scripts de démarrage qui ont besoin des lecteurs jusqu’à la fin de l’exécution du script de montage.