Azure虚拟机(VM)支持两种类型的存储接口:小型计算机系统接口(SCSI)和 NVM Express(NVMe)。 SCSI 接口是一种旧标准,提供计算机和外围设备之间的物理连接和数据传输。 NVMe 与 SCSI 类似,因为它提供连接和数据传输,但 NVMe 是服务器和存储系统之间数据传输的更快、更高效的接口。
本文介绍如何使用 Azure Boost 和 Azure NVMe 转换脚本,将运行 Linux 或 Windows 的 Azure VM 的磁盘控制器从 SCSI 转换为 NVMe。
Azure 继续支持提供 SCSI 存储的 VM 产品/服务的 SCSI 接口。 但是,并非所有新的 VM 系列都有 SCSI 存储作为未来选项。
你的 VM 将发生哪些变化?
将主机接口从 SCSI 更改为 NVMe 不会更改远程存储(OS 磁盘或数据磁盘),但它会更改操作系统使用磁盘的方式。
| Disk | 已启用 SCSI 的 VM | 具有 SCSI 临时磁盘的 NVMe VM(例如,Ebds_v5) | 具有 NVMe 临时磁盘的 NVMe VM |
|---|---|---|---|
| 操作系统盘 | /dev/sda |
/dev/nvme0n1 |
/dev/nvme0n1 |
| 临时磁盘 | /dev/sdb |
/dev/sda |
/dev/nvme1n1 |
| 第一个数据磁盘 | /dev/sdc |
/dev/nvme0n2 |
/dev/nvme0n2 |
小窍门
某些 VM 类型有多个临时磁盘(例如,E64ds_v6)。
使用 Azure Boost 将 Azure VM 从 SCSI 转换为 NVMe 有助于充分利用这些性能改进,并在云计算环境中保持竞争优势。
将 Linux VM 从 SCSI 迁移到 NVMe
若要从 SCSI 迁移到 NVMe,需要执行以下高级步骤:
- 检查虚拟机系列是否支持 NVMe。
- 检查您的操作系统是否已做好支持 NVMe 的准备。
- 将虚拟机转换为 NVMe。
- 检查您的操作系统。
1.检查虚拟机系列是否支持 NVMe
Azure Boost 可用性表列出了 NVMe 附加磁盘支持的虚拟机。
2. 检查操作系统是否支持 NVMe
操作系统需要支持 NVMe 设备。 例如,你需要准备设备驱动程序,以及 initrd启动期间使用的临时文件系统。 还需要验证文件系统的装入点,因为它们检查你是否使用 SCSI 设备名称 (/dev/sdX)。
当你使用 -FixOperatingSystemSettings 时,迁移脚本可以自动为你处理这些就绪检查。
2.1 检查 VM 的控制器类型
使用 PowerShell 检查控制器类型
PS C:\Users\user1> $vm = Get-AzVM -name [your-vm-name]
PS C:\Users\user1> $vm.StorageProfile.DiskControllerType
SCSI
PS C:\Users\user1>
使用 Azure CLI 检查控制器类型
$ az vm show --name [your-vm-name] --resource-group [your-resource-group-name]
{
"additionalCapabilities": {
...
"storageProfile": {
...
"diskControllerType": "SCSI",
...
使用 Azure 门户检查控制器类型
2.2 准备迁移
使用 -FixOperatingSystemSettings 参数时,迁移脚本可以自动处理先决条件。
如果要手动进行所需的更改,请验证:
- NVMe 模块已安装并属于
initrd/initramfs. - GRUB 配置包括参数
nvme_core.io_timeout=240。 -
/etc/fstab检查设备。
请与 OS 供应商联系,了解更新 initrd/initramfs所需的所有命令。
2.2.1 准备 PowerShell
使用
Connect-AzAccount连接到Azure。使用
Select-AzSubscription -Subscription [your-subscription-id]选择正确的订阅。使用
Set-ExecutionPolicy -ExecutionPolicy Unrestricted.. 设置执行策略。
2.2.2 下载脚本
可以使用 PowerShell 命令下载脚本:
Invoke-WebRequest -Uri "https://raw.githubusercontent.com/Azure/SAP-on-Azure-Scripts-and-Utilities/refs/heads/main/Azure-NVMe-Utils/Azure-NVMe-Conversion.ps1" -OutFile ".\Azure-NVMe-Conversion.ps1"
2.3 运行迁移
该脚本具有多个可用参数:
| 参数 | Description | 必选 |
|---|---|---|
-ResourceGroupName |
VM 的资源组名称。 | 是的 |
-VMName |
Azure上的 VM 的名称。 | 是的 |
-NewControllerType |
VM 应转换为的存储控制器类型(NVMe 或 SCSI)。 | 是的 |
-VMSize |
要将该 VM 转换为的 Azure VM SKU。 | 是的 |
-StartVM |
转换后启动 VM。 | 否 |
-IgnoreSKUCheck |
忽略对 VM SKU 的检查。 | 否 |
-IgnoreWindowsVersionCheck |
忽略Windows版本检查。 | 否 |
-FixOperatingSystemSettings |
使用Azure运行命令自动修复 OS 设置。 | 否 |
-WriteLogfile |
创建日志文件。 | 否 |
-IgnoreAzureModuleCheck |
不要检查是否已安装 Azure 模块。 | 否 |
-IgnoreOSCheck |
请勿检查 OS 就绪情况。 预期 OS 已准备就绪。 | 否 |
-SleepSeconds |
Azure 在启动 VM 之前使更改生效所需的时间。 | 否 |
下面是一个示例命令:
# Example usage
.\Azure-NVMe-Conversion.ps1 -ResourceGroupName <your-RG> -VMName <your-VMname> -NewControllerType <NVMe/SCSI> -VMSize <new-VM-SKU> -StartVM -FixOperatingSystemSettings
小窍门
你随时可以切换回 SCSI。 该脚本提供一个命令,用于直接还原到原始配置。
2.3.1 示例输出
PS /home/philipp> ./NVMe-Conversion.ps1 -ResourceGroupName testrg -VMName testvm -NewControllerType NVMe -VMSize Standard_E4bds_v5 -StartVM -FixOperatingSystemSettings
00:00 - INFO - Starting script Azure-NVMe-Conversion.ps1
00:00 - INFO - Script started at 06/27/2025 15:41:39
00:00 - INFO - Script version: 2025062704
00:00 - INFO - Script parameters:
00:00 - INFO - ResourceGroupName -> testrg
00:00 - INFO - VMName -> testvm
00:00 - INFO - NewControllerType -> NVMe
00:00 - INFO - VMSize -> Standard_E4bds_v5
00:00 - INFO - StartVM -> True
00:00 - INFO - FixOperatingSystemSettings -> True
00:00 - INFO - Script Version 2025062704
00:00 - INFO - Module Az.Compute is installed and the version is correct.
00:00 - INFO - Module Az.Accounts is installed and the version is correct.
00:00 - INFO - Module Az.Resources is installed and the version is correct.
00:00 - INFO - Connected to Azure subscription name: AG-GE-CE-PHLEITEN
00:00 - INFO - Connected to Azure subscription ID: aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e
00:00 - INFO - VM testvm found in Resource Group testrg
00:01 - INFO - VM testvm is running
00:01 - INFO - VM testvm is running Linux
00:01 - INFO - VM testvm is running SCSI
00:02 - INFO - Authentication token is a SecureString
00:02 - INFO - Authentication token received
00:02 - INFO - Getting available SKU resources
00:02 - INFO - This might take a while ...
00:06 - INFO - VM SKU Standard_E4bds_v5 is available in zone 1
00:06 - INFO - Resource disk support matches between original VM size and new VM size.
00:06 - INFO - Found VM SKU - Checking for Capabilities
00:06 - INFO - VM SKU has supported capabilities
00:06 - INFO - VM supports NVMe
00:06 - INFO - Pre-Checks completed
00:06 - INFO - Entering Linux OS section
00:37 - INFO - Script output: Enable succeeded:
00:37 - INFO - Script output: [stdout]
00:37 - INFO - Script output: [INFO] Operating system detected: sles
00:37 - INFO - Script output: [INFO] Checking if NVMe driver is included in initrd/initramfs...
00:37 - INFO - Script output: [INFO] NVMe driver found in initrd/initramfs.
00:37 - INFO - Script output: [INFO] Checking nvme_core.io_timeout parameter...
00:37 - INFO - Script output: [INFO] nvme_core.io_timeout is set to 240.
00:37 - INFO - Script output: [INFO] Checking /etc/fstab for deprecated device names...
00:37 - INFO - Script output: [INFO] /etc/fstab does not contain deprecated device names.
00:37 - INFO - Script output:
00:37 - INFO - Script output: [stderr]
00:37 - INFO - Script output:
00:37 - INFO - Errors: 0 - Warnings: 0 - Info: 7
00:37 - INFO - Shutting down VM testvm
01:18 - INFO - VM testvm stopped
01:18 - INFO - Checking if VM is stopped and deallocated
01:19 - INFO - Setting OS Disk capabilities for testvm_OsDisk_1_165411276cbe459097929b981eb9b3e2 to new Disk Controller Type to NVMe
01:19 - INFO - generated URL for OS disk update:
01:19 - INFO - https://management.chinacloudapi.cn/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/testrg/providers/Microsoft.Compute/disks/testvm_OsDisk_1_165411276cbe459097929b981eb9b3e2?api-version=2023-04-02
01:19 - INFO - OS Disk updated
01:19 - INFO - Setting new VM Size from Standard_E4s_v3 to Standard_E4bds_v5 and Controller to NVMe
01:19 - INFO - Updating VM testvm
01:54 - INFO - VM testvm updated
01:54 - INFO - Start after update enabled for VM testvm
01:54 - INFO - Waiting for 15 seconds before starting the VM
02:09 - INFO - Starting VM testvm
03:31 - INFO - VM testvm started
03:31 - INFO - As the virtual machine got started using the script you can check the operating system now
03:31 - INFO - If you have any issues after the conversion you can revert the changes by running the script with the old settings
03:31 - IMPORTANT - Here is the command to revert the changes:
03:31 - INFO - .\Azure-NVMe-Conversion.ps1 -ResourceGroupName testrg -VMName testvm -NewControllerType SCSI -VMSize Standard_E4s_v3 -StartVM
03:31 - INFO - Script ended at 06/27/2025 15:45:11
03:31 - INFO - Exiting
PS /home/philipp>
如果以后无法访问操作系统,请检查:
- 适用于 Linux 操作系统的串行控制台。
- Azure 门户中操作系统的屏幕截图。
如有必要,始终可以使用脚本末尾显示的命令还原到 SCSI:
.\Azure-NVMe-Conversion.ps1 -ResourceGroupName testrg -VMName testvm -NewControllerType SCSI -VMSize Standard_E4s_v3 -StartVM
2.4 检查结果
在Azure门户中检查结果
在 PowerShell 中检查结果
PS C:\Users> $vm = Get-AzVM -name [your-vm-name]
PS C:\Users> $vm.StorageProfile.DiskControllerType
NVMe
PS C:\Users>
3. 检查操作系统
3.1 检查设备
您可以使用 nvme 命令检查设备。 如果缺少 nvme 命令,请使用 nvme-cli 安装 nvme list 软件包。
输出应显示 OS 磁盘和数据磁盘。
3.2 获取 NVMe 的 udev 文件(可选)
在 SCSI 虚拟机上,集成到 udev Azure 代理中的 waagent 规则在 /dev/disk/azure/scsi1/lunX 中创建链接来标识数据磁盘。 由于不再使用 SCSI,因此规则不适用。
使用两种可用选项中的一种部署支持 NVMe 的 udev 规则后,您会在 /dev/disk/azure/data/by-lun 目录中看到新的符号链接。 此目录是/dev/disk/azure/scsi1的替代。
nvme-conversion-vm:/usr/lib/udev/rules.d # ls -l /dev/disk/azure/data/by-lun/
total 0
lrwxrwxrwx 1 root root 19 Jun 7 13:52 0 -> ../../../../nvme0n2
lrwxrwxrwx 1 root root 19 Jun 7 13:52 1 -> ../../../../nvme0n3
nvme-conversion-vm:/usr/lib/udev/rules.d #
手动下载 udev 文件
若要下载新的 udev 规则文件,请使用以下命令:curl https://raw.githubusercontent.com/Azure/SAP-on-Azure-Scripts-and-Utilities/refs/heads/main/Azure-NVMe-Utils/88-azure-nvme-data-disk.rules。 然后,运行 udevadm control --reload-rules && udevadm trigger 以重新加载 udev 规则。
来自 GitHub 的可直接安装的软件包
适用于多个发行版的来自 GitHub 上 Azure 虚拟机实用工具和 udev 规则集合 的预编译软件包可在 Index of /results/cjp256/azure-vm-utils/ 获取。
多个分发版已开始集成包。 可以直接从其存储库安装它。
| 分销 | 最低版本 |
|---|---|
| SUSE | SLES 15 SP5 或更高版本 |
| Red Hat | RHEL 9.6 或更高版本 |
| Ubuntu | Ubuntu 25.04 或更高版本 |
将Windows VM 从 SCSI 迁移到 NVMe
本部分介绍如何使用 Azure NVMe 转换脚本将 Windows VM 从 SCSI 转换为 NVMe。 该脚本会自动处理操作系统准备、虚拟机解除分配、磁盘控制器更新、可选调整大小以及虚拟机重启。
先决条件
在开始之前,请确保满足以下条件:
虚拟机采用第 2 代(Gen2)。 无法将 Gen1 VM 转换为 NVMe。
VM Windows Server 2019或更高版本运行。 除非使用
-IgnoreWindowsVersionCheck并手动验证驱动程序兼容性,否则不支持Windows Server 2016及更早版本。目标 VM SKU 支持 NVMe。
你未使用“受信任启动”来配置虚拟机。 无法将配置有受信任启动的 VM 从 SCSI 转换为 NVMe。
此脚本不支持从具有临时磁盘(例如,Standard_D4ds_v5)的 VM 转换为 v6 SKU(例如,Standard_D4ds_v6)。 将磁盘快照用于该迁移路径。
支持从没有临时磁盘的 VM(例如,Standard_D4s_v5)转换为 v6 SKU。
非Microsoft防病毒软件或安全软件可能会干扰在转换期间进行的驱动程序更改。 在运行脚本之前暂时禁用它。
如果 VM 在转换后显示蓝屏,请还原为 SCSI,并在禁用安全解决方案后重试。
安装了以下 Az 模块版本的 PowerShell:
-
Az.Compute9.0 或更高版本 -
Az.Accounts4.0 或更高版本 -
Az.Resources7.0 或更高版本
-
下载脚本
Invoke-WebRequest `
-Uri "https://raw.githubusercontent.com/Azure/SAP-on-Azure-Scripts-and-Utilities/refs/heads/main/Azure-NVMe-Utils/Azure-NVMe-Conversion.ps1" `
-OutFile ".\Azure-NVMe-Conversion.ps1"
该脚本是开源 SAP-on-Azure-Scripts-and-Utilities 存储库的一部分,并且根据 MIT 许可证获得许可。
执行转换
使用 -FixOperatingSystemSettings 开关让脚本自动配置 stornvme 驱动程序以启动。 Windows在 VM 重启后识别 NVMe 控制器需要此配置。 省略它要求在转换之前手动设置驱动程序。
.\Azure-NVMe-Conversion.ps1 `
-ResourceGroupName "<resource-group-name>" `
-VMName "<vm-name>" `
-NewControllerType NVMe `
-VMSize "<target-sku>" `
-FixOperatingSystemSettings `
-StartVM `
-WriteLogfile
该脚本自动执行以下步骤:
- 使用 VM SKU 验证模块版本、VM 是否存在、OS 类型、Windows版本、Gen2、当前控制器类型和 NVMe 功能。
- (可选)修复
stornvme驱动程序服务(sc.exe config stornvme start=boot)并验证 NVMe 就绪性的其他 OS 设置(使用-FixOperatingSystemSettings)。 - 停止并解除分配虚拟机。
- 通过 REST
supportedCapabilities.diskControllerTypes方法将 OS 磁盘上的SCSI, NVMe更新为PATCH。 - 将 VM 大小调整为目标 SKU。
- 启动 VM(使用
-StartVM)。
小窍门
脚本在成功运行结束时在输出中提供还原命令。 在关闭会话之前保存该命令,以便根据需要回滚到 SCSI。
Windows VM 的更改
与 Linux 不同,Windows使用驱动器号而不是设备路径,因此 OS 磁盘在转换后仍C:\。 但是,基础磁盘接口会更改。 如果不使用永久性磁盘标识符,数据磁盘分配可能会改变。
| Disk | 已启用 SCSI 的 VM | 已启用 NVMe 的 VM |
|---|---|---|
| 操作系统盘 |
C:\ (未更改) |
C:\ (未更改) |
| 临时磁盘 |
D:\ (通常) |
D:\(通常在 v6 SKU 上为 RAW) |
| 数据磁盘 | 按 LUN 顺序分配 | 按 NVMe 命名空间顺序分配 |
Important
在 v6 SKU 上,临时磁盘为 RAW,而不是使用 NTFS 预先格式化。 使用启动脚本或自定义脚本扩展在每次启动时格式化和装载它们。
验证转换
VM 重启后,确认磁盘控制器类型已成功更改。
使用 PowerShell 进行确认
$vm = Get-AzVM -ResourceGroupName "<resource-group-name>" -VMName "<vm-name>"
$vm.StorageProfile.DiskControllerType
输出应为 NVMe。
使用 VM 中的设备管理器进行确认
- 打开设备管理器。
- 展开 存储控制器。
- 确认列出了 标准 NVM Express 控制器 。
恢复为 SCSI
如果需要回滚,请使用 -NewControllerType SCSI 和原始 VM SKU 重新运行该脚本:
.\Azure-NVMe-Conversion.ps1 `
-ResourceGroupName "<resource-group-name>" `
-VMName "<vm-name>" `
-NewControllerType SCSI `
-VMSize "<original-SKU>" `
-StartVM `
-WriteLogfile