Поделиться через


Часто задаваемые вопросы о временных дисках NVMe

В этой статье рассматриваются некоторые распространенные вопросы о поддержке временных дисков 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?

Как определить диск 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.

Графический пользовательский интерфейс

Совет

Следующий пример графического интерфейса предназначен для иллюстрирующих целей. Рекомендуется создавать скрипты для автоматизации этого рабочего процесса для рабочих развертываний.

  1. Выберите клавиши с логотипом Windows + R, чтобы открыть диалоговое окно "Запуск ". Введите diskmgmt.msc и выберите клавишу ВВОД.

    Снимок экрана: ввод команды управления дисками в диалоговом окне

  2. Выберите стиль секции (MBR или GPT) и диски, которые необходимо инициализировать, и нажмите кнопку "ОК".

    Снимок экрана: диалоговое окно инициализации диска для управления дисками.

  3. Щелкните правой кнопкой мыши диск для секционирования и выберите новый простой том.

    Снимок экрана: меню для выбора нового типа тома.

  4. Чтобы указать такие элементы, как размер тома, буква диска, файловая система и метка тома, выполните мастер создания простого тома. Нажмите кнопку "Далее", чтобы перейти к мастеру.

    Снимок экрана: указание размера тома в мастере создания простого тома.

    Снимок экрана: указание буквы диска в мастере создания простого тома.

    Снимок экрана: указание форматирования секций в мастере создания простого тома.

  5. Чтобы завершить секцию и формат, просмотрите параметры и нажмите кнопку "Готово".

    Снимок экрана: завершение работы мастера создания простого тома.

  6. Убедитесь, что форматированные и инициализированные диски 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.

Графический пользовательский интерфейс

Совет

Следующий пример графического интерфейса предназначен для иллюстрирующих целей. Рекомендуется создавать скрипты для автоматизации этого рабочего процесса для рабочих развертываний.

  1. Выберите клавиши с логотипом Windows + R, чтобы открыть диалоговое окно "Запуск ". Введите sysdm.cpl и выберите клавишу ВВОД.

    Снимок экрана: диалоговое окно запуска sysdm.cpl.

  2. Перейдите на вкладку "Дополнительно " и нажмите кнопку "Параметры " в разделе "Производительность ".

    Снимок экрана: кнопка для параметров производительности на вкладке

  3. В диалоговом окне "Параметры производительности" выберите вкладку "Дополнительно" и нажмите кнопку "Изменить" в разделе "Виртуальная память".

    Снимок экрана: вкладка

  4. Снимите размер файла автоматического управления разбиением на страницы для всех дисков . Если файл страницы установлен на диск ОС, выберите диск ОС, выберите параметр "Нет разбиения на страницы", а затем нажмите кнопку "Задать ". Выберите локальный диск 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-диск?

  1. Выберите диск 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
    
  2. Создайте пространство подкачки на диске:

    root@D2adsv6:/ # mkswap /dev/nvme0n1
    Setting up swapspace version 1, size = 75 GiB (80530632704 bytes)
    no label, UUID=064bdcfb-86ae-49f3-bf9d-b956493e2a1d
    
  3. Включите пространство подкачки:

    root@D2adsv6:/ # swapon /dev/nvme0n1
    
  4. Убедитесь, что пространство подкачки настроено правильно:

    root@D2adsv6:/ # swapon -s
    Filename                                Type            Size    Used    Priority
    /dev/nvme0n1                            partition       78643196        0       -2
    
  5. Добавьте пространство буфера, чтобы /etc/fstab сделать его постоянным во время перезапуска:

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

Какие рекомендации следует учитывать при событиях обслуживания, повторном развертывании виртуальных машин и перезапусках виртуальных машин?

Диски Temp NVMe, подключенные к виртуальным машинам V6, являются временными, как и временные диски в других рядах виртуальных машин. Это означает, что все данные на виртуальной машине теряются после повторного развертывания или во время события обслуживания. Дополнительные сведения о событиях обслуживания и простоях см. в статье "Общие сведения о перезагрузках виртуальной машины: обслуживание и простой".

Если виртуальная машина перемещена на новое оборудование, эти диски отключены и новые неподключенные диски отображаются в операционной системе при резервном копировании. Если виртуальная машина не изменила оборудование, диски NVMe temp могут по-прежнему присутствовать. Предыдущий сценарий для подключения дисков проверяет наличие отключенных дисков перед попыткой подключения.

Рекомендуется автоматически запускать скрипт подключения при каждом запуске виртуальной машины и откладывать все другие скрипты запуска, которые нуждаются в дисках до завершения работы скрипта подключения.