本文解决了有关在 Azure 中创建的虚拟机 (VM) 上对远程 NVM Express (NVMe) 磁盘的支持的一些常见问题。
在 VM 上启用远程 NVMe 接口的先决条件是什么?
在 VM 配置期间,可以使用 DiskControllerType
,选择将 NVMe 或小型计算机系统接口 (SCSI) 作为首选控制器类型。 如果未指定 DiskControllerType
值,平台将根据 VM 大小配置自动选择默认控制器。 如果 VM 大小默认配置为默认使用 SCSI,同时支持 NVMe,则除非将 DiskControllerType
值更新为 NVMe,否则 VM 会一直使用 SCSI。
若要在 VM 上启用 NVMe 接口,必须满足以下先决条件:
选择支持 NVMe 的 VM 系列。 Intel v5 代 VM 中只有 Ebsv5 和 Ebdsv5 VM 大小才配备 NVMe。
选择带有 NVMe 支持标记的操作系统映像。 选择支持的 VM 系列和 OS 映像值后,系统会提示选择 NVMe 磁盘控制器类型。
通过在 Azure 门户或 Azure 资源管理器、Azure CLI 或 Azure PowerShell 模板中选择 NVMe 磁盘控制器类型,选择加入 NVMe。 有关分步说明,请参阅常规 NVMe 常见问题解答。
请确保使用的是第 2 代 VM,因为 NVMe 仅支持第 2 代映像。
选择其中一个启用了 NVMe 的 Azure 区域。
是否可以加密远程 NVMe 磁盘?
Azure 中没有本机方式来加密这些磁盘。 你可以在 OS 中对其进行加密,但在启动时装载后需要重新加密。
如何将基于 SCSI 的 VM 大小重设为不同大小的远程已启用 NVMe 的 VM?
可以使用以下任一过程:
- 将使用无标记映像创建的基于 SCSI 的 VM 重设为不同大小的已启用 NVMe 的 VM,而无需重新创建 VM 配置且无需标记映像。
- 将基于 SCSI 的 VM 重设为不同大小的已启用 NVMe 的 VM,而无需重新创建 VM 配置。
源 VM 可以是:
- 支持 NVMe 的无标记 OS 映像。
- NVMe 标记的 OS 映像。
若要重设 VM 的大小,请使用以下命令运行 Azure PowerShell 脚本,该脚本会将 VM 的目标 discontrollertype
值设置为 NVMe:
azure-nvme-VM-update.ps1 [-subscription_id] <String> [-resource_group_name] <String> [-vm_name] <String> [[-disk_controller_change_to] <String>] [-vm_size_change_to] <String> [[-start_vm_after_update] <Boolean>] [[-write_logfile] <Boolean>]
如何检查映像是否已标记为 NVMe?
若要检查映像是否已标记为 NVMe,请使用以下命令:
az vm image show --urn URN_OF_IMAGE
如何标记支持远程磁盘 NVMe 的映像?
若要标记支持 NVMe 的映像,请执行以下步骤:
将 NVMe 支持的虚拟硬盘 (VHD) 上传到存储帐户。 AzCopy 是一种快速方法,但也可以使用门户上传。
azcopy copy <local path to your VHD> <container in your storage account>
使用 Azure PowerShell、门户或 Azure CLI 创建映像库。
创建映像定义。 请确保包含
--feature DiskControllerTypes=SCSI,NVMe
。以下是 Azure CLI 示例:
az sig image-definition create --resource-group <resourceGroupName> --gallery-name <galleryName> --gallery-image-definition <imageName> --publisher <publisher> --offer <offerName> --sku <skuName> --os-type <osType> --os-state <osState> --feature DiskControllerTypes=SCSI,NVMe
使用 NVMe 支持的 VHD 在 NVMe 标记的库下创建映像版本。
以下是 Azure CLI 示例:
az sig image-version create --resource-group <resourceGroupName> --gallery-name <galleryName> --gallery-image-definition <imageName> --gallery-image-version <version> --target-regions <region1> <region2> --replica-count <replicaCount> --os-vhd-uri <NVMe-supported vhd uri> --os-vhd-storage-account <storageAccount>
如何为创建 VM 配置 ARM 模板?
可以将 Azure 自定义脚本扩展与 Azure 资源管理器模板(ARM 模板)结合使用。 使用此解决方案,就可以在 Azure 虚拟机上下载和运行脚本,并且与 Windows 和 Linux 兼容。 有关详细指导,请参阅适用于 Windows 和 Linux 的 Azure 自定义脚本扩展文档。
如果要使用其他不支持远程 NVMe 磁盘的 VM 系列,会发生什么情况?
如果选择不受支持的 VM 系列,将收到这样一条错误消息:“所选 VM 大小无法使用 DiskControllerType 启动。 请检查提供的磁盘控制器类型是否为 VM 大小的受支持的磁盘控制器类型之一。”
务必选择支持 NVMe 接口的 VM 系列。 若要确定 VM 大小支持哪些磁盘控制器类型,请参阅 REST API 中的资源 SKU 列表。
哪些 Azure 磁盘存储选项与远程 NVMe 磁盘兼容?
NVMe 大小可与 Azure 高级 SSD v1、高级 SSD v2 和超级磁盘存储结合使用。 有关 Azure 磁盘产品/服务的更多信息,请参阅 Azure 托管磁盘类型。
Azure 支持在使用 NVMe VM 大小的磁盘上实时调整大小吗?
Azure 高级 SSD v1 磁盘、标准 SSD 磁盘和标准 HDD 磁盘都支持 NVMe 的实时调整大小。 还可以在不重启 VM 的情况下添加 NVMe 磁盘。
如何识别 Linux VM 上的远程 NVMe 磁盘?
获取
nvme-cli
包:sudo apt install nvme-cli
运行 NVMe
list
命令提取 NVMe 磁盘详细信息:sudo nvme list
下面是数据在响应 Azure PowerShell 命令时的显示方式:
如何识别 Windows VM 上的 NVMe 磁盘?
打开 Azure PowerShell 并使用以下命令:
wmic diskdrive get model,scsilogicalunit
ASAP 附加磁盘以模型字符串 Virtual_Disk NVME Premium
显示在来宾中。 SCSI 逻辑单元具有门户可见的 LUN ID 值,按 1 递增。
下面的快照展示了 NVMe 磁盘会如何显示在启用了 NVMe 的 Windows VM 中:
以下快照显示 LUN 0 和 LUN 4 处附加的数据磁盘的来宾输出 (CRP)。 LUN ID 等效于命名空间 ID。
是否可以将基于 SCSI 的 VM 转换为启用 NVMe,同时保留相同的 VM vCPU 大小,并具有 NVMe 标记的 OS 映像?
此方案仅在 Linux 操作系统上受支持,在 Windows 操作系统上不受支持。
启用了 NVMe 的 VM 是否支持远程磁盘中的共享磁盘?
高级 SSD、高级 SSD v2 和超级磁盘存储磁盘支持共享磁盘功能。
是否可以使用 Azure PowerShell 或 Azure CLI 从启用了 NVMe 的现有 blob 创建带有 OS 磁盘的 VM?
目前无法实现。 相反,可以使用以下 REST API 解决方法从启用了 NVMe 的现有 blob 创建带有 OS 磁盘的 VM:
$subscriptionID = '<Your Subscription ID>'
$resourceGroupName = '<Your Resource Group Name>'
$storageAccountName = '<Your Account Name>'
$storageAccountContainer = '<Your Account Container>'
$blobName = 'blob-nvme_OsDisk_1.vhd'
$diskName = 'test'
$diskSkuName = 'Standard_LRS'
$diskSizeGB = 30
$osType = 'Linux'
$hyperVGeneration = 'V2'
$location = 'eastus'
$azContext = Get-AzContext
$azProfile = [Microsoft.Azure.Commands.Common.Authentication.Abstractions.AzureRmProfileProvider]::Instance.Profile
$profileClient = New-Object -TypeName Microsoft.Azure.Commands.ResourceManager.Common.RMProfileClient -ArgumentList ($azProfile)
$token = ($profileClient.AcquireAccessToken($azContext.Subscription.TenantId)).AccessToken
$body = @{
location = $location
sku = @{ name = $diskSkuName }
properties = @{
osType = $osType
hyperVGeneration = $hyperVGeneration
supportedCapabilities = @{diskControllerTypes = 'SCSI, NVMe'}
diskSizeGB = $diskSizeGB
creationData = @{
storageAccountId = "/subscriptions/$subscriptionID/resourceGroups/$resourceGroupName/providers/Microsoft.Storage/storageAccounts/$storageAccountName"
sourceUri = "https://$storageAccountName.blob.core.windows.net/$storageAccountContainer/$blobName"
createOption = 'Import'
}
}
}
$apiVersion='2023-10-02'
$restUri = "https://management.azure.com/subscriptions/$subscriptionID/resourceGroups/$resourceGroupName/providers/Microsoft.Compute/disks/$diskName`?api-version=$apiVersion"
$authHeader = @{
'Content-Type'='application/json'
'Authorization'='Bearer ' + $token
}
Invoke-RestMethod `
-Uri $restUri `
-Method 'Put' `
-Headers $authHeader `
-Body ($body | ConvertTo-Json)