In diesem Artikel werden einige häufige Fragen zur Unterstützung von temporären NVM Express-Datenträgern (temp NVMe) auf VMs behandelt, die in Azure erstellt werden.
Um die temporäre NVMe-Schnittstelle auf Ihrer VM zu aktivieren, müssen die folgenden Voraussetzungen erfüllt sein:
- Wählen Sie eine VM-Familie aus, die NVMe unterstützt (z. B. die v6-VMs).
- Auswählen eines Betriebssystems, das NVMe unterstützt
- Stellen Sie sicher, dass Sie eine VM der Generation 2 verwenden, da NVMe nur Images der Generation 2 unterstützt.
Wie unterscheiden sich temporäre NVMe- Datenträger in meinen Dl/D/E_v6 VMs von Remote-NVMe-Datenträgern?
Ein wichtiger Unterschied besteht darin, dass temporäre NVMe-Datenträger vorübergehend sind und Daten auf VMs verschwinden können, aber Daten auf Remote-NVMe-Datenträgern verbleiben. Berücksichtigen Sie diesen Unterschied bei der Auswahl der Speicheroptionen für Ihre VM.
Im Gegensatz zu früheren VMs der D-/E-Serie enthalten die neuen v6-VMs unformatierte NVMe-Datenträger. Kundinnen und Kunden sollten die Datenträger nach dem Start der VM in ein Dateisystem ihrer Wahl initialisieren und formatieren.
Die VMs der Dl/D/E v6-Serie sind für die Verwendung des lokalen temporären NVMe-Datenträgers auf dem Knoten optimiert, der direkt an die VM angefügt ist, anstatt wie zuvor lokale SCSI-Datenträger zu verwenden. Diese Methode ermöglicht mehr Ein- und Ausgabevorgänge pro Sekunde und einen höheren Durchsatz für Ihre Workloads.
Auf welche Änderungen sollte ich mich einstellen, wenn ich meine VMs mit temporären NVMe-Datenträgern konfiguriere?
Die Datenträger sollten nach dem Start der VM initialisiert und formatiert werden. Nach benutzerinitiierten Stopps, Deallokationen oder geplanten Wartungsarbeiten und von Azure initiierten automatischen Wiederherstellungsereignissen starten die VMs nur mit leeren temporären NVMe-Festplatten. Die temporären NVMe-Datenträger sind für Anwendungen erst sichtbar, nachdem sie initialisiert und formatiert wurden.
Sie können einzelne NVMe-Laufwerke nach dem Start der VM bei Bedarf zu einem einzigen zusammenfassen.
Eine Windows-Auslagerungsdatei wird auf den Datenträgern des permanenten Betriebssystems abgelegt (es sei denn, Sie verwenden die Funktion für ephemere Betriebssysteme), aber Sie können sie nach Bedarf auf temporäre NVMe-Datenträger verschieben, nachdem die VM gestartet wurde.
Wenn Sie die Funktion des kurzlebigen Betriebssystems verwenden, werden eine oder mehrere NVMe-Datenträger (je nach VM und Imagegröße) in einen langsameren SCSI/VHD-basierten Datenträger umgewandelt, ähnlich wie bei v5 und älteren VMs. Bei den größeren VMs bleiben die übrigen Datenträger als leere, unformatierte NVMe-Laufwerke erhalten.
Die Liste der Ressourcen-SKUs in der REST-API zeigt verschiedene Fähigkeiten von VMs auf. Die nächste Iteration der VM-Größen verwendet das schnellere und effizientere NVMe-Protokoll für den lokalen Speicher anstelle des SCSI-Protokolls, das frühere VM-Größen verwenden.
Für Azure-VMs ist der SCSI-basierte lokale Speicher ein temporärer Ressourcendatenträger, und der
MaxResourceVolumeMB
-Wert gibt die Größe dieses Datenträgers an. Im Gegensatz dazu gibt derNVMeDiskSizeInMiB
-Wert die Größe des NVMe-basierten lokalen Speichers an.
Temporäre NVMe-Datenträger unterstützen die Funktion der Datenverschlüsselung im Ruhezustand. Für jeden temporären NVMe-Datenträger, der der VM zugewiesen ist, werden dessen Daten durch einen eindeutigen Datenverschlüsselungsschlüssel (Data Encryption Key, DEK) verschlüsselt. Ein Schlüsselverschlüsselungsschlüssel (Key Encryption Key, KEK) schützt die DEK. Wenn Sie eine VM löschen, werden die Daten auf dem temporären NVMe-Datenträger kryptografisch gelöscht. Alle v6-VMs, die ab 2024 eingeführt werden, verfügen standardmäßig über hardwarebasierte Verschlüsselung mit einem Platform Managed Key über ihre lokalen NVMe-Laufwerke.
Weitere Informationen finden Sie in den häufig gestellten Fragen zu Azure-VM-Größen ohne lokalen temporären Datenträger.
Sie können den folgenden Befehl unter Windows ausführen:
Get-PhysicalDisk | where { $_.FriendlyName.contains("NVMe Direct Disk")}
Sie können den folgenden Befehl unter Linux ausführen:
sudo nvme id-ns /dev/nvme0n1 -b | dd bs=1 skip=384 status=none | sed 's/\x00*$//'
Wie kann ich temporäre NVMe-Datenträger in Windows formatieren und initialisieren, wenn ich eine VM erstelle?
Sie können hierzu die GUI oder Azure PowerShell verwenden.
Tipp
Das folgende GUI-Beispiel dient zur Veranschaulichung. Sie sollten Skripts zum Automatisieren dieses Workflows für Produktionsbereitstellungen zu erstellen.
Wählen Sie die Windows-Logo-Taste+R, um das Dialogfeld Ausführen zu öffnen. Geben Sie diskmgmt.msc ein, und drücken Sie die Eingabetaste.
Wählen Sie einen Partitionsstil (MBR oder GPT) und die zu initialisierenden Datenträger aus, und wählen Sie dann OK aus.
Klicken Sie mit der rechten Maustaste auf den Datenträger, der partitioniert werden soll, und wählen Sie dann Neues einfaches Volume aus.
Folgen Sie dem Assistenten für neue einfache Volumes, um Elemente wie Volumegröße, Laufwerkbuchstabe, Dateisystem und Volumebezeichnung anzugeben. Wählen Sie die Schaltfläche Weiter aus, um den Assistenten zu durchlaufen.
Überprüfen Sie Ihre Einstellungen, und wählen Sie dann Fertig stellen aus, um die Partition und die Formatierung fertigzustellen.
Stellen Sie sicher, dass die formatierten und initialisierten NVMe-Datenträger in der Windows-Datenträgerverwaltung angezeigt werden, ähnlich wie Neues Volume (E:) in diesem Beispiel angezeigt wird.
Tipp
Das folgende Skript initialisiert, formatiert und weist Laufwerkbuchstaben zu. Es löscht jedoch alle Daten auf dem Datenträger. Sie sollten es gründlich auf Ihren VMs testen, bevor Sie es in der Produktion bereitstellen.
# 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
Das folgende Skript enthält ein Beispiel für die Initialisierung temporärer NVMe-Datenträger unter Linux. Das Skript listet alle temporären NVMe-Datenträger auf der VM auf, kombiniert die Datenträger zu einem einzigen RAID 0-Array und erstellt eine formatierte Partition des angegebenen Dateisystems.
Temporäre NVMe-Datenträger werden durch die Modellnummer unterschieden, die als Microsoft NVMe Direct Disk
für das Gastbetriebssystem angezeigt wird. Dieses Skript verwendet den Befehl nvme-cli id-ctrl
, um die Modellnummer jedes NVMe-Geräts abzufragen.
Das Skript sucht zunächst nach bereits erstellten temporären NVMe-Datenträgervolumes (identifiziert durch die Bezeichnung filesystem
). Wenn ein Array vorhanden zu sein scheint, überprüft das Skript die Integrität des Arrays und wiederholt den Initialisierungsprozess bei Bedarf. Das Array wird in den folgenden Fällen neu initialisiert:
- Mindestens ein temporärer Arraydatenträger fehlt.
- Es gibt temporäre Datenträger, die noch nicht in das Array integriert sind.
- Das Datenträgerarray befindet sich in einem anderen ungültigen oder unbekannten Zustand.
- Zugeordnete Konfigurationsdateien fehlen oder sind ungültig.
#!/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
Wie kann ich die Windows-Auslagerungsdatei von einem Betriebssystemdatenträger auf einen temporären NVMe-Datenträger verschieben?
Sie können hierzu die GUI oder Azure PowerShell verwenden.
Tipp
Das folgende GUI-Beispiel dient zur Veranschaulichung. Sie sollten Skripts zum Automatisieren dieses Workflows für Produktionsbereitstellungen zu erstellen.
Wählen Sie die Windows-Logo-Taste+R, um das Dialogfeld Ausführen zu öffnen. Geben Sie sysdm.cpl ein, und drücken Sie die Eingabetaste.
Wählen Sie die Registerkarte Erweitert und dann im Abschnitt Leistung Einstellungen aus.
Wählen Sie im Dialogfeld Leistungsoptionen die Registerkarte Erweitert aus und wählen Sie dann die Schaltfläche Ändern im Bereich Virtueller Arbeitsspeicher aus.
Deaktivieren Sie das Kontrollkästchen Auslagerungsdateigröße für alle Laufwerke automatisch verwalten. Wenn eine Auslagerungsdatei auf Ihren Betriebssystemdatenträger festgelegt ist, wählen Sie Ihren Betriebssystemdatenträger aus, wählen Sie die Option Keine Auslagerungsdatei aus, und wählen Sie dann die Schaltfläche Festlegen aus. Wählen Sie Ihr lokales temporäres NVMe-Laufwerk aus, und klicken Sie auf das Optionsfeld Größe wird vom System verwaltet und dann auf Festlegen. Klicken Sie zum Schließen sämtlicher Dialogfelder auf OK.
Sie müssen Ihre VM möglicherweise neu starten, damit diese Änderungen wirksam werden.
$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
Sie müssen Ihre VM möglicherweise neu starten, damit diese Änderungen wirksam werden.
Wie kann ich die Linux-Auslagerungsdatei von einem Betriebssystemdatenträger auf einen temporären NVMe-Datenträger verschieben?
Auswahl des NVMe-Datenträgers, der für den Auslagerungsbereich verwendet wird:
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
Erstellen des Auslagerungsbereichs auf dem Datenträger:
root@D2adsv6:/ # mkswap /dev/nvme0n1 Setting up swapspace version 1, size = 75 GiB (80530632704 bytes) no label, UUID=064bdcfb-86ae-49f3-bf9d-b956493e2a1d
Aktivieren des Auslagerungsbereichs:
root@D2adsv6:/ # swapon /dev/nvme0n1
Überprüfen, ob der Auslagerungsbereich ordnungsgemäß eingerichtet wurde:
root@D2adsv6:/ # swapon -s Filename Type Size Used Priority /dev/nvme0n1 partition 78643196 0 -2
Anfügen des Auslagerungsbereichs an
/etc/fstab
, damit er auch bei Neustarts persistent ist:root@D2adsv6:/ # echo '/dev/nvme0n1 swap swap defaults 0 0' >> /etc/fstab
Temporäre NVMe-Datenträger, die an V6-VMs angefügt sind, sind kurzlebig, ähnlich wie temporäre Laufwerke in anderen VM-Serien. Das bedeutet, dass nach erneuten Bereitstellen oder während eines Wartungsereignisses alle Daten auf der VM verloren gehen. Weitere Informationen zu Wartungsereignissen und Ausfallzeiten finden Sie unter Grundlegendes zu VM-Neustarts – Wartung vs. Downtime.
Wenn die VM auf neue Hardware verschoben wurde, werden diese Laufwerke nicht bereitgestellt, und neue nicht bereitgestellte Datenträger werden dem Betriebssystem angezeigt, wenn er wieder bereitgestellt wird. Wenn die Hardware der VM nicht geändert wurde, sind die temporären NVMe-Datenträger möglicherweise noch vorhanden. Die obigen Skripts für das Einbinden der Laufwerke suchen nach nicht eingebundenen Laufwerken, bevor die Einbindung versucht wird.
Es empfiehlt sich, das Einbindungsskript bei jedem Start der VM automatisch auszuführen und alle anderen Startup-Skripts zu verzögern, die die Laufwerke benötigen, bis das Einbindungsskript nicht mehr ausgeführt wird.