Compartir a través de


Preguntas más frecuentes sobre discos NVMe temporales

En este artículo se tratan algunas preguntas comunes sobre la compatibilidad con discos temporales no volátiles de Memory Express (NVMe) en máquinas virtuales (VM) creadas en Azure. En este artículo, el término "disco temporal" hace referencia al disco temporal que se crea en ssd local.

¿Cuáles son los requisitos previos para crear un disco temporal que use la interfaz NVMe para mi máquina virtual?

La compatibilidad con NVMe para discos temporales locales varía en un nivel de familia de máquinas virtuales (VM). Todas las nuevas máquinas virtuales v6 con disco local admiten discos temporales NVMe, pero es posible que las máquinas virtuales v5 y versiones anteriores no admitan discos temporales locales NVMe, ya que la mayoría de esos tamaños están en la interfaz SCSI. Algunas familias de máquinas virtuales, como la serie L, tienen ssd NVMe conectados localmente desde máquinas virtuales de generación Lsv2 en adelante. Consulte la información general de la familia de máquinas virtuales para determinar si se admiten discos temporales NVMe. Además, tenga en cuenta que el sistema operativo invitado debe tener compatibilidad con controladores NVMe para poder usar NVMe local, que la mayoría de las versiones más recientes del sistema operativo tienen de forma predeterminada.

¿En qué se diferencian los discos NVMe temporales en mis máquinas virtuales Dl/D/E_v6 de los discos NVMe remotos?

Una diferencia clave es que los discos NVMe temporales son transitorios y los datos de la máquina virtual pueden desaparecer, pero los datos de los discos NVMe remotos permanecen. Tenga en cuenta esta diferencia al elegir las opciones de almacenamiento de la máquina virtual.

A diferencia de nuestras anteriores máquinas virtuales de la serie D/E, las nuevas máquinas virtuales v6 vienen con discos NVMe sin formatear. Los clientes deben inicializar y dar formato a los discos en un sistema de archivos de su preferencia después de que se inicie la máquina virtual.

Las máquinas virtuales de la series Dl/D/E v6 están optimizadas para usar el disco NVMe temporal local en el nodo conectado directamente a la máquina virtual en lugar de usar previamente discos de interfaz de sistema de equipos pequeños (SCSI). Este método permite operaciones de entrada/salida más altas por segundo y un mayor rendimiento para las cargas de trabajo.

¿Para qué cambios debo prepararme al configurar mis máquinas virtuales con discos NVMe temporales?

  • Los discos deben inicializarse y formatearse después del arranque de la máquina virtual. Después de los eventos de detención, desasignación o mantenimiento planeado iniciados por el usuario y de recuperación automática iniciados por Azure, las máquinas virtuales arrancan solo con discos NVMe temporales sin procesar. No hay discos NVMe temporales visibles para las aplicaciones hasta después de que se inicialicen y tengan formato.

  • Puede abarcar unidades NVMe independientes en una según sea necesario después de que se inicie la máquina virtual.

  • Un archivo de páginas de Windows se coloca en discos del sistema operativo persistentes (a menos que use la característica de sistema operativo efímero), pero puede moverlo a discos NVMe temporales según sea necesario después de que se inicie la máquina virtual.

  • La característica de SO efímero, si se utiliza, convierte uno o varios discos NVMe (dependiendo de la VM y del tamaño de la imagen) en un disco basado en SCSI/VHD más lento, de forma similar a como ocurría en las VM v5 y anteriores. Para los tamaños de máquina virtual más grandes, las unidades restantes siguen siendo NVMe sin formato.

  • La lista de unidades de almacenamiento de existencias de recursos (SKU) de la API REST expone varias funcionalidades de las máquinas virtuales. La siguiente iteración de tamaños de máquina virtual usa el protocolo NVMe más rápido y eficaz para el almacenamiento local, en lugar del protocolo SCSI que usan los tamaños de máquina virtual anteriores.

    En el caso de las máquinas virtuales de Azure, el almacenamiento local basado en SCSI es un disco de recursos temporal y el valor MaxResourceVolumeMB especifica el tamaño de este disco. En cambio, el valor NVMeDiskSizeInMiB especifica el tamaño del almacenamiento local basado en NVMe.

¿Cuál es el cifrado mínimo que ofrece Azure para los discos NVMe temporales?

Todos los discos NVMe locales en máquinas virtuales (VM) de Azure tienen el cifrado integrado habilitado de forma predeterminada para la protección de datos. Los discos NVMe temporales admiten la característica de cifrado de datos en reposo. Una clave de cifrado de datos única (DEK) cifra los datos de cada disco NVMe temporal asignado a la máquina virtual. Una clave de cifrado de claves (KEK) ayuda a proteger la DEK. Al eliminar una máquina virtual, los datos de su disco NVMe temporal se borran criptográficamente. Todas las máquinas virtuales v6 que se introducen desde 2024 y versiones posteriores, tienen sus unidades NVMe locales cifradas de forma predeterminada mediante el cifrado basado en hardware con una clave administrada de plataforma.

  • Los datos se cifran mediante XTS-AES-256, AES-256-GCM o un cifrado más seguro.
  • El dispositivo genera una clave de cifrado multimedia única (MEK) para cada disco de la máquina virtual.
  • El MEK es:
    • Generado y almacenado completamente dentro del hardware del dispositivo.
    • Nunca se expone al host, la máquina virtual o ningún componente externo, incluido el operador o el sistema de Azure.
  • Todas las operaciones de cifrado y descifrado se producen dentro del dispositivo mediante mek.
  • El MEK se destruye al eliminar la máquina virtual, lo que garantiza que ningún componente pueda acceder a los datos después.

¿Qué es el cifrado mejorado en reposo?

El cifrado mejorado en reposo es otra capa de protección que está disponible en las máquinas virtuales de la serie V6 y Lsv4 de Azure a través de la compatibilidad con estándares de TCG-OPAL. No es necesario realizar ninguna acción para esta característica, es el valor predeterminado para estos tipos de máquina virtual.

  • La infraestructura de Azure genera y almacena de forma segura un valor de PIN para cada MEK.
  • El PIN se pasa a través de una función de derivación de claves (KDF) dentro del dispositivo de almacenamiento para generar una clave de cifrado de claves (KEK). El PIN actúa como clave de administración de plataformas (PMK).
  • El MEK se cifra mediante la KEK y se almacena internamente en el dispositivo de almacenamiento.
  • La KEK no se almacena en ningún lugar y el dispositivo de almacenamiento genera dinámicamente cuando el PIN se usa para autenticarlo correctamente. Sin este PIN, el dispositivo no puede descifrar sus propios datos almacenados, incluso si se accede físicamente.
  • El dispositivo de almacenamiento se autentica cuando se inicia la máquina virtual y se bloquea cuando la máquina virtual se detiene, lo que garantiza que el acceso a los datos solo está disponible cuando se ejecuta la máquina virtual.

¿Cómo puedo cambiar el tamaño de una VM v5 o anterior con disco temporal a v6?

¿Cómo puedo identificar mi disco NVMe temporal?

Puede ejecutar el siguiente comando para Windows:

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

Puede ejecutar el siguiente comando para Linux:

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

¿Cómo puedo formatear e inicializar discos NVMe temporales en Windows al crear una máquina virtual?

Puede usar la GUI o Azure PowerShell.

Interfaz Gráfica de Usuario (GUI)

Sugerencia

El siguiente ejemplo de GUI está diseñado para fines ilustrativos. Se recomienda crear scripts para automatizar este flujo de trabajo para implementaciones de producción.

  1. Seleccione la tecla del logotipo de Windows + R para abrir el cuadro de diálogo Ejecutar. Escriba diskmgmt.msc y seleccione la tecla Entrar.

    Captura de pantalla de la entrada de un comando de administración de discos en el cuadro de diálogo Ejecutar.

  2. Seleccione un estilo de partición (MBR o GPT) y los discos que se van a inicializar y, a continuación, seleccione Aceptar.

    Captura de pantalla del cuadro de diálogo para inicializar un disco para la administración de discos.

  3. Haga clic con el botón derecho en el disco para crear particiones y, a continuación, seleccione Nuevo volumen simple.

    Captura de pantalla del menú de selección de nuevos tipos de volumen.

  4. Para especificar elementos como el tamaño del volumen, la letra de unidad, el sistema de archivos y la etiqueta de volumen, siga el Asistente para nuevo volumen simple. Seleccione el botón Siguiente para avanzar a través del asistente.

    Captura de pantalla de la especificación del tamaño del volumen en el Asistente para nuevo volumen simple.

    Captura de pantalla de la especificación de la letra de unidad en el Asistente para nuevo volumen simple.

    Captura de pantalla de la especificación del formato de partición en el Asistente para nuevo volumen simple.

  5. Para completar la partición y el formato, revise la configuración y seleccione Finalizar.

    Captura de pantalla del Asistente para nuevo volumen simple.

  6. Confirme que los discos NVMe con formato e inicializados aparecen en la herramienta Administración de discos de Windows, similar a cómo Nuevo volumen (E:) aparece en este ejemplo.

    Captura de pantalla de la herramienta Administración de discos que muestra un nuevo volumen.

Script de Azure PowerShell

Sugerencia

El siguiente script inicializa, da formatos y asigna letras de unidad. Sin embargo, borra todos los datos del disco. Debe probarlo exhaustivamente en las máquinas virtuales antes de implementarlo en producción.

# 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

¿Cómo puedo formatear e inicializar discos NVMe temporales en Linux?

El script siguiente proporciona un ejemplo de inicialización de discos NVMe temporales en Linux. El script enumera todos los discos NVMe temporales de la máquina virtual, combina los discos en una única matriz RAID 0 y crea una partición formateada del sistema de archivos especificado.

Los discos NVMe temporales se distinguen por el número de modelo, que aparece como Microsoft NVMe Direct Disk para el sistema operativo invitado. Este script usa el comando nvme-cli id-ctrl para consultar el número de modelo de cada dispositivo NVMe.

El script comprueba primero los volúmenes de disco NVMe temporales ya creados (identificados por la etiqueta filesystem). Si una matriz parece estar presente, el script comprueba la integridad de la matriz y repite el proceso de inicialización si es necesario. La matriz se vuelve a inicializar en los casos siguientes:

  • Faltan uno o varios discos temporales de matriz.
  • Hay discos temporales que aún no se han incorporado en la matriz.
  • La matriz de discos está en un estado no válido o desconocido.
  • Faltan archivos de configuración asociados o no son válidos.
#!/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

¿Cómo puedo mover el archivo de páginas de Windows del disco del SO a un disco NVMe temporal?

Puede usar la GUI o Azure PowerShell.

Interfaz Gráfica de Usuario (GUI)

Sugerencia

El siguiente ejemplo de GUI está diseñado para fines ilustrativos. Se recomienda crear scripts para automatizar este flujo de trabajo para implementaciones de producción.

  1. Seleccione la tecla del logotipo de Windows + R para abrir el cuadro de diálogo Ejecutar. Escriba sysdm.cpl y seleccione la tecla Entrar.

    Captura de pantalla del cuadro de diálogo Ejecutar abriendo sysdm.cpl.

  2. Seleccione la pestaña Opciones avanzadas y, a continuación, seleccione el botón Configuración de la sección Rendimiento.

    Captura de pantalla del botón para la configuración de rendimiento en la pestaña Opciones avanzadas de las propiedades del sistema.

  3. En el cuadro de diálogo Opciones de rendimiento, seleccione la pestaña Opciones avanzadas y, a continuación, seleccione el botón Cambiar en la sección Memoria virtual.

    Captura de pantalla de la pestaña Avanzadas de las Opciones de rendimiento.

  4. Desactive la casilla Administrar automáticamente el tamaño del archivo de paginación para todas las unidades. Si un archivo de página está establecido en el disco del sistema operativo, seleccione el disco del sistema operativo, seleccione la opción Sin archivo de paginación y, a continuación, seleccione el botón Establecer. Seleccione la unidad NVMe temporal local, seleccione la opción Tamaño administrado del sistema y, a continuación, seleccione el botón Establecer. Seleccione Aceptar para cerrar todos los cuadros de diálogo.

    Captura de pantalla del cuadro de diálogo para la memoria virtual.

Es posible que tenga que reiniciar la máquina virtual para que estos cambios surtan efecto.

Script de 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

Es posible que tenga que reiniciar la máquina virtual para que estos cambios surtan efecto.

¿Cómo puedo mover el archivo de intercambio de Linux desde el disco del SO a un disco NVMe temporal?

  1. Seleccione el disco NVMe utilizado para el espacio de intercambio:

    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. Creación de espacio de intercambio en el disco:

    root@D2adsv6:/ # mkswap /dev/nvme0n1
    Setting up swapspace version 1, size = 75 GiB (80530632704 bytes)
    no label, UUID=064bdcfb-86ae-49f3-bf9d-b956493e2a1d
    
  3. Habilitar el espacio de intercambio:

    root@D2adsv6:/ # swapon /dev/nvme0n1
    
  4. Compruebe que el espacio de intercambio está configurado correctamente:

    root@D2adsv6:/ # swapon -s
    Filename                                Type            Size    Used    Priority
    /dev/nvme0n1                            partition       78643196        0       -2
    
  5. Anexe el espacio de intercambio a /etc/fstab para que sea persistente en los reinicios:

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

¿Qué consideraciones debo tener en cuenta para los eventos de mantenimiento, las reimplementaciones de máquinas virtuales y los reinicios de máquinas virtuales?

Los discos NVMe temporales conectados a máquinas virtuales V6 son efímeros, similares a los discos temporales de otras series de máquinas virtuales. Esto significa que se pierden todos los datos de la máquina virtual después de la reimplementación o durante un evento de mantenimiento. Para más información sobre los eventos de mantenimiento y el tiempo de inactividad, consulte Descripción de los reinicios de la máquina virtual: mantenimiento frente al tiempo de inactividad.

Si la máquina virtual se ha movido al nuevo hardware, estas unidades se desmontan y se presentan nuevos discos desmontados al sistema operativo cuando se realiza la copia de seguridad. Si la máquina virtual no cambió el hardware, es posible que los discos NVMe temporales sigan estando presentes. El script anterior para montar las unidades comprueba si hay unidades desmontadas antes de intentar montar.

Se recomienda ejecutar el script de montaje automáticamente cada vez que la máquina virtual arranca y retrasa cualquier otro script de arranque que necesite las unidades hasta que finalice la ejecución del script de montaje.