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 valeurNVMeDiskSizeInMiB
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 ?
Consultez les Questions fréquentes (FAQ) sur les tailles de machine virtuelle Azure sans disque temporaire local.
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.
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.
Sélectionnez un style de partition (MBR ou GPT) et les disques à initialiser, puis cliquez sur OK.
Cliquez avec le bouton droit sur le disque à partitionner, puis cliquez sur Nouveau volume simple.
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.
Pour terminer la partition et le formatage, passez en revue vos paramètres, puis sélectionnez Terminer.
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.
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.
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.
Cliquez sur l’onglet Avancé, puis sur le bouton Paramètres dans la section Performances.
Dans la fenêtre Options de performance, cliquez sur l’onglet Avancé, puis sur le bouton Modifier dans la section Mémoire virtuelle.
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.
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 ?
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
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
Activez l’espace d’échange :
root@D2adsv6:/ # swapon /dev/nvme0n1
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
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.