В этой статье рассматриваются некоторые распространенные вопросы о поддержке временных дисков NVM Express (temp NVMe) на виртуальных машинах, созданных в Azure.
Каковы предварительные требования для включения интерфейса temp NVMe на виртуальной машине?
Чтобы включить временный интерфейс NVMe на виртуальной машине, необходимо выполнить следующие предварительные требования:
- Выберите семейство виртуальных машин, которое поддерживает NVMe (например, виртуальные машины версии 6).
- Выбор операционной системы, поддерживающей NVMe
- Убедитесь, что вы используете виртуальную машину поколения 2, так как NVMe поддерживает только образы поколения 2.
Как временные диски NVMe на виртуальных машинах Dl/D/E_v6 отличаются от удаленных дисков NVMe?
Ключевое различие заключается в том, что временные диски NVMe являются временными, а данные на виртуальных машинах могут исчезнуть, но данные на удаленных дисках NVMe остаются. Учитывайте это различие при выборе параметров хранилища виртуальной машины.
В отличие от предыдущих виртуальных машин серии D/E, новые виртуальные машины версии 6 поставляются с необработанными дисками NVMe без форматирования. После запуска виртуальной машины клиенты должны инициализировать и отформатировать диски в файловую систему.
Виртуальные машины серии Dl/D/E версии 6 оптимизированы для использования локального диска NVMe локальной среды NVMe на узле, подключенном непосредственно к виртуальной машине, а не к локальным дискам SCSI. Этот метод обеспечивает более высокую пропускную способность операций ввода и вывода в секунду и более высокую пропускную способность для рабочих нагрузок.
Какие изменения следует подготовить при настройке виртуальных машин с временными дисками NVMe?
Диски следует инициализировать и отформатировать после запуска виртуальной машины. После остановки, размещения сделки или планового обслуживания и событий автоматического восстановления, инициированных Azure, виртуальные машины запускаются только с необработанных дисков NVMe. Диски NVMe temp не отображаются для приложений до тех пор, пока они не инициализированы и отформатированы.
После запуска виртуальной машины можно охватывать отдельные диски NVMe.
Файл страниц Windows помещается на постоянные диски ОС (если вы не используете функцию эфемерной ОС), но ее можно переместить на временные диски NVMe по мере необходимости после запуска виртуальной машины.
Функция эфемерной ОС, если она используется, преобразует один или несколько дисков NVMe (в зависимости от размера виртуальной машины и образа) в более медленный диск на основе SCSI/VHD, аналогичный тому, как он был на виртуальных машинах версии 5 и более старых виртуальных машин. Для больших размеров виртуальных машин остальные диски остаются необработанными NVMe без форматирования.
Список номеров SKU ресурсов в REST API предоставляет несколько возможностей виртуальных машин. Следующая итерация размеров виртуальных машин использует более быстрый и эффективный протокол NVMe для локального хранилища вместо протокола SCSI, используемого ранее размерами виртуальных машин.
Для виртуальных машин Azure локальный диск на основе SCSI является временным диском ресурсов, а
MaxResourceVolumeMB
значение определяет размер этого диска. Напротив,NVMeDiskSizeInMiB
значение указывает размер локального хранилища на основе NVMe.
Как зашифровать временные диски NVMe?
Диски temp NVMe поддерживают функцию шифрования неактивных данных. Уникальный ключ шифрования данных (DEK) шифрует данные для каждого диска NVMe, назначенного виртуальной машине. Ключ шифрования ключей (KEK) помогает защитить DEK. При удалении виртуальной машины данные на диске NVMe temp удаляются криптографически. Все виртуальные машины версии 6, представленные с 2024 года и более поздних версий, имеют свои локальные диски NVMe, зашифрованные по умолчанию с помощью аппаратного шифрования с управляемым ключом платформы.
Как изменить размер виртуальной машины версии 5 или более ранней версии с временным диском до версии 6?
Ознакомьтесь с часто задаваемыми вопросами о размерах виртуальных машин Azure без локального временного диска.
Как определить диск NVMe temp?
Для Windows можно выполнить следующую команду:
Get-PhysicalDisk | where { $_.FriendlyName.contains("NVMe Direct Disk")}
Для Linux можно выполнить следующую команду:
sudo nvme id-ns /dev/nvme0n1 -b | dd bs=1 skip=384 status=none | sed 's/\x00*$//'
Как форматировать и инициализировать временные диски NVMe в Windows при создании виртуальной машины?
Вы можете использовать графический интерфейс или Azure PowerShell.
Графический пользовательский интерфейс
Совет
Следующий пример графического интерфейса предназначен для иллюстрирующих целей. Рекомендуется создавать скрипты для автоматизации этого рабочего процесса для рабочих развертываний.
Выберите клавиши с логотипом Windows + R, чтобы открыть диалоговое окно "Запуск ". Введите diskmgmt.msc и выберите клавишу ВВОД.
Выберите стиль секции (MBR или GPT) и диски, которые необходимо инициализировать, и нажмите кнопку "ОК".
Щелкните правой кнопкой мыши диск для секционирования и выберите новый простой том.
Чтобы указать такие элементы, как размер тома, буква диска, файловая система и метка тома, выполните мастер создания простого тома. Нажмите кнопку "Далее", чтобы перейти к мастеру.
Чтобы завершить секцию и формат, просмотрите параметры и нажмите кнопку "Готово".
Убедитесь, что форматированные и инициализированные диски NVMe отображаются в средстве управления дисками Windows, аналогично тому, как в этом примере отображается новый том (E: ).
Скрипт Azure PowerShell
Совет
Следующий скрипт инициализирует, форматирует и назначает буквы диска. Однако она удаляет все данные на диске. Прежде чем развертывать его в рабочей среде, необходимо тщательно протестировать его на виртуальных машинах.
# 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
Как форматировать и инициализировать временные диски NVMe в Linux?
В следующем скрипте приведен пример инициализации дисков NVMe в Linux. Скрипт перечисляет все временные диски NVMe на виртуальной машине, объединяет диски в один массив RAID 0 и создает форматированную секцию указанной файловой системы.
Диски temp NVMe отличаются номером модели, который отображается Microsoft NVMe Direct Disk
в гостевой ОС. Этот скрипт использует nvme-cli id-ctrl
команду для запроса номера модели каждого устройства NVMe.
Скрипт сначала проверяет наличие всех уже созданных томов дисков NVMe (идентифицируемых filesystem
меткой). Если массив, как представляется, присутствует, скрипт проверяет целостность массива и повторяет процесс инициализации при необходимости. Массив повторно инициализируется в следующих случаях:
- Отсутствует один или несколько временных дисков массива.
- В массиве еще не включены временные диски.
- Массив дисков находится в недопустимом или неизвестном состоянии.
- Связанные файлы конфигурации отсутствуют или недопустимы.
#!/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
Как переместить файл страницы Windows с диска ОС на временный диск NVMe?
Вы можете использовать графический интерфейс или Azure PowerShell.
Графический пользовательский интерфейс
Совет
Следующий пример графического интерфейса предназначен для иллюстрирующих целей. Рекомендуется создавать скрипты для автоматизации этого рабочего процесса для рабочих развертываний.
Выберите клавиши с логотипом Windows + R, чтобы открыть диалоговое окно "Запуск ". Введите sysdm.cpl и выберите клавишу ВВОД.
Перейдите на вкладку "Дополнительно " и нажмите кнопку "Параметры " в разделе "Производительность ".
В диалоговом окне "Параметры производительности" выберите вкладку "Дополнительно" и нажмите кнопку "Изменить" в разделе "Виртуальная память".
Снимите размер файла автоматического управления разбиением на страницы для всех дисков . Если файл страницы установлен на диск ОС, выберите диск ОС, выберите параметр "Нет разбиения на страницы", а затем нажмите кнопку "Задать ". Выберите локальный диск NVMe в локальной среде, выберите параметр "Управляемый системой" размер и нажмите кнопку "Задать ". Нажмите кнопку "ОК", чтобы закрыть все диалоговые окна.
Чтобы эти изменения вступили в силу, может потребоваться перезапустить виртуальную машину.
Скрипт 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
Чтобы эти изменения вступили в силу, может потребоваться перезапустить виртуальную машину.
Как переместить файл буфера Linux с диска ОС на временный NVMe-диск?
Выберите диск NVMe, используемый для буферного пространства:
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
Создайте пространство подкачки на диске:
root@D2adsv6:/ # mkswap /dev/nvme0n1 Setting up swapspace version 1, size = 75 GiB (80530632704 bytes) no label, UUID=064bdcfb-86ae-49f3-bf9d-b956493e2a1d
Включите пространство подкачки:
root@D2adsv6:/ # swapon /dev/nvme0n1
Убедитесь, что пространство подкачки настроено правильно:
root@D2adsv6:/ # swapon -s Filename Type Size Used Priority /dev/nvme0n1 partition 78643196 0 -2
Добавьте пространство буфера, чтобы
/etc/fstab
сделать его постоянным во время перезапуска:root@D2adsv6:/ # echo '/dev/nvme0n1 swap swap defaults 0 0' >> /etc/fstab
Какие рекомендации следует учитывать при событиях обслуживания, повторном развертывании виртуальных машин и перезапусках виртуальных машин?
Диски Temp NVMe, подключенные к виртуальным машинам V6, являются временными, как и временные диски в других рядах виртуальных машин. Это означает, что все данные на виртуальной машине теряются после повторного развертывания или во время события обслуживания. Дополнительные сведения о событиях обслуживания и простоях см. в статье "Общие сведения о перезагрузках виртуальной машины: обслуживание и простой".
Если виртуальная машина перемещена на новое оборудование, эти диски отключены и новые неподключенные диски отображаются в операционной системе при резервном копировании. Если виртуальная машина не изменила оборудование, диски NVMe temp могут по-прежнему присутствовать. Предыдущий сценарий для подключения дисков проверяет наличие отключенных дисков перед попыткой подключения.
Рекомендуется автоматически запускать скрипт подключения при каждом запуске виртуальной машины и откладывать все другие скрипты запуска, которые нуждаются в дисках до завершения работы скрипта подключения.