将 Linux 和Windows VM 从 SCSI 转换为 NVMe

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,需要执行以下高级步骤:

  1. 检查虚拟机系列是否支持 NVMe。
  2. 检查您的操作系统是否已做好支持 NVMe 的准备。
  3. 将虚拟机转换为 NVMe。
  4. 检查您的操作系统。

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 门户检查控制器类型

Azure 门户中虚拟机属性的屏幕截图,包括控制器类型。

2.2 准备迁移

使用 -FixOperatingSystemSettings 参数时,迁移脚本可以自动处理先决条件。

如果要手动进行所需的更改,请验证:

  • NVMe 模块已安装并属于 initrd/initramfs.
  • GRUB 配置包括参数 nvme_core.io_timeout=240
  • /etc/fstab 检查设备。

请与 OS 供应商联系,了解更新 initrd/initramfs所需的所有命令。

2.2.1 准备 PowerShell
  1. 使用 PowerShell 文档安装 PowerShell

  2. 使用 Connect-AzAccount 连接到Azure。

  3. 使用 Select-AzSubscription -Subscription [your-subscription-id] 选择正确的订阅。

  4. 使用 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门户中检查结果

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 磁盘和数据磁盘。

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.Compute 9.0 或更高版本
    • Az.Accounts 4.0 或更高版本
    • Az.Resources 7.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

该脚本自动执行以下步骤:

  1. 使用 VM SKU 验证模块版本、VM 是否存在、OS 类型、Windows版本、Gen2、当前控制器类型和 NVMe 功能。
  2. (可选)修复 stornvme 驱动程序服务(sc.exe config stornvme start=boot)并验证 NVMe 就绪性的其他 OS 设置(使用 -FixOperatingSystemSettings)。
  3. 停止并解除分配虚拟机。
  4. 通过 REST supportedCapabilities.diskControllerTypes 方法将 OS 磁盘上的 SCSI, NVMe 更新为 PATCH
  5. 将 VM 大小调整为目标 SKU。
  6. 启动 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 中的设备管理器进行确认

  1. 打开设备管理器
  2. 展开 存储控制器
  3. 确认列出了 标准 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