将运行 Linux 的虚拟机从 SCSI 转换为 NVMe

在本文中,我们将讨论将运行 Linux 的虚拟机(VM)从 SCSI 转换为 NVMe 存储的过程。 通过迁移到 NVMe,可以利用其改进的性能和可伸缩性。

SCSI 与 NVMe

Azure VM 支持两种类型的存储接口:小型计算机系统接口(SCSI)和 NVMe。 SCSI 接口是一种旧标准,提供计算机和外围设备之间的物理连接和数据传输。 NVMe 与 SCSI 类似,因为它提供连接和数据传输,但 NVMe 是服务器和存储系统之间数据传输的更快、更高效的接口。

支持 SCSI 接口的虚拟机

Azure 继续支持提供 SCSI 存储的 VM 产品/服务的 SCSI 接口。 但是,并非所有新的 VM 系列都有 SCSI 存储作为未来选项。

您的虚拟机有什么变化?

将主机接口从 SCSI 更改为 NVMe 不会更改远程存储(OS 磁盘或数据磁盘),但更改作系统查看磁盘的方式。

Disk 已启用 SCSI 的 VM 具有 SCSI tempdisk 的 NVMe VM(例如Ebds_v5) 具有 NVMe tempdisk 的 NVMe VM
OS 磁盘 /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,确保充分利用这些性能改进,并在云计算环境中保持竞争优势。

将虚拟机(VM)从 SCSI 迁移到 NVMe

若要从 SCSI 迁移到 NVMe,需要执行一些步骤:

  1. 检查虚拟机系列是否支持 NVMe
  2. 检查操作系统是否支持 NVMe
  3. 将虚拟机转换为 NVMe
  4. 检查操作系统

1.检查虚拟机系列是否支持 NVMe

Azure Boost 概述站点的可用性表中描述了支持 NVMe 附加磁盘的受支持虚拟机。

2. 检查操作系统是否支持 NVMe

操作系统需要支持 NVMe 设备,例如,需要对设备驱动程序和用于启动期间的临时文件系统 initrdm 进行准备。 此外,还需要验证文件系统的装入点,因为它们检查你是否使用 SCSI 设备名称(/dev/sdX)。

使用迁移脚本时,-FixOperatingSystemSettings 可以自动处理这些就绪检查。

2.1 检查 VM 的控制器类型

2.1.1 使用 PowerShell 检查控制器类型
PS C:\Users\user1> $vm = Get-AzVM -name [your-vm-name]
PS C:\Users\user1> $vm.StorageProfile.DiskControllerType
SCSI
PS C:\Users\user1>
2.1.2 使用 Azure CLI 检查控制器类型
$ az vm show --name [your-vm-name] --resource-group [your-resource-group-name]
{
"additionalCapabilities": {
...
 "storageProfile": {
 ...
   "diskControllerType": "SCSI",
 ...
2.1.3 使用 Azure 门户检查控制器类型

用于检查控制器的 Azure 门户的屏幕截图。

2.2 准备迁移

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

如果要手动处理所需的更改验证

  • 已安装的 NVMe 模块,并且是 initrd/initramfs 的一部分。
  • GRUB 配置包括参数 nvme_core.io_timeout=240
  • /etc/fstab 检查设备是否存在

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

2.2.1 准备 PowerShell

小窍门

在 Azure CloudShell 中运行脚本时不需要此步骤

  1. 使用https://aka.ms/powershell安装 PowerShell

  2. 使用 Connect-AzAccount 连接到 Azure,并使用 Select-AzSubscription -Subscription [your-subscription-id] 选择正确的订阅。

  3. 使用 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 ".\NVMe-Conversion.ps1"

2.3 运行迁移

该脚本具有多个可用参数:

参数 Description 必选
-ResourceGroupName VM 的资源组名称 是的
-VMName Azure 上的虚拟机的名称 是的
-NewControllerType VM 应转换为的存储控制器类型(NVMe 或 SCSI) 是的
-VMSize 要将 VM 转换为的 Azure VM SKU 是的
-StartVM 转换后启动 VM
-IgnoreSKUCheck 忽略 VM SKU 的检查
-IgnoreWindowsVersionCheck 忽略 Windows 版本检查
-FixOperatingSystemSettings 使用 Azure RunCommands 自动修复 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: 232b6759-xxxx-yyyy-zzzz-757472230e6c
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/232b6759-xxxx-yyyy-zzzz-757472230e6c/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 检查结果

2.4.1 在 Azure 门户中检查结果

Azure 门户的屏幕截图。

2.4.2 在 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 虚拟机上,集成在 waagent(Azure 代理)中的 udev 规则创建了用于 /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 #
3.2.1 手动下载 udev 文件

若要下载新的 udev 规则文件,请使用以下命令: curl https://raw.githubusercontent.com/Azure/SAP-on-Azure-Scripts-and-Utilities/refs/heads/main/NVMe-Preflight-Check/88-azure-nvme-data-disk.rules 然后运行 udevadm control --reload-rules && udevadm trigger 以重新加载 udev 规则。

3.2.2 准备使用 Azure VM utils 安装包

/results/cjp256/azure-vm-utils/ 的索引上提供了多个发行版的预编译包。

多个分发版已开始集成包。 可以直接从其存储库安装它。

分销 最低版本
SUSE SLES 15 SP5 或更高版本
Ubuntu Ubuntu 25.04 或更高版本