你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

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

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

SCSI 与 NVMe

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

注意

配置有受信任启动的 VM 无法从 SCSI 移动到 NVMe。

VM 上的 SCSI 接口支持

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

VM 会发生哪些变化?

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

支持 SCSI 的 VM 支持 NVMe 的 VM
OS 磁盘 /dev/sda /dev/nvme0n1
临时磁盘 /dev/sdb /dev/sda
第一个数据磁盘 /dev/sdc /dev/nvme0n2

在以下部分中,我们提供了一个指南,介绍如何使用 Azure Boost 将 Azure VM 从 SCSI 转换为 NVMe,确保充分利用这些性能改进,并在云计算环境中保持竞争优势。

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

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

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

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

支持 NVMe 附加磁盘的受支持虚拟机在可用性表 Azure Boost 概述站点上进行了介绍。

重要

如果未列出 VM 类型,请更改 VM 类型。

2.检查操作系统是否存在 NVMe 就绪情况

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

为了简化此过程,我们创建了一个 bash 脚本来为你执行预验证。

2.1 检查 VM 的控制器类型

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

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

2.2 运行预检检查脚本

bash 脚本不会自动更改系统上的任何内容。 它仅提供有关要运行的命令的建议。

建议包括

  • NVMe 模块
  • GRUB 配置
  • /etc/fstab 检查设备

要开始脚本,请使用以下命令 (curl):

curl -s -S -L https://raw.githubusercontent.com/Azure/SAP-on-Azure-Scripts-and-Utilities/main/NVMe-Preflight-Check/azure-nvme-preflight-check.sh | sh -s -- -v
As an alternative you can also use wget:
wget --no-verbose -O - https://raw.githubusercontent.com/Azure/SAP-on-Azure-Scripts-and-Utilities/main/NVMe-Preflight-Check/azure-nvme-preflight-check.sh | sh -s -- -v
Third option is to download the script from the [GitHub repository](https://github.com/Azure/SAP-on-Azure-Scripts-and-Utilities/tree/main/NVMe-Preflight-Check) and run it manually.

nvme-conversion-vm:/home/azureuser # curl -s -S -L https://raw.githubusercontent.com/Azure/SAP-on-Azure-Scripts-and-Utilities/main/NVMe-Preflight-Check/azure-nvme-preflight-check.sh | sh -s -- -v
------------------------------------------------
START of script
------------------------------------------------
------------------------------------------------
OK NVMe Module is installed and available on your VM
------------------------------------------------
------------------------------------------------
ERROR NVMe Module is not loaded in the initramfs image.

     mkdir -p /etc/dracut.conf.d
     echo 'add_drivers+=" nvme nvme-core nvme-fabrics nvme-fc nvme-rdma nvme-loop nvmet nvmet-fc nvme-tcp "' >/etc/dracut.conf.d/nvme.conf
     dracut -f -v

------------------------------------------------
GRUB_CMDLINE_LINUX_DEFAULT="console=ttyS0 net.ifnames=0 dis_ucode_ldr earlyprintk=ttyS0 multipath=off rootdelay=300 scsi_mod.use_blk_mq=1 USE_BY_UUID_DEVICE_NAMES=1 nvme_core.io_timeout=240"
------------------------------------------------
OK GRUB contains timeouts.
------------------------------------------------
------------------------------------------------
OK fstab file doesn't contain device names
------------------------------------------------
Please crosscheck your /etc/fstab file
------------------------------------------------
END of script
------------------------------------------------
nvme-conversion-vm:/home/azureuser #

在此示例中,initrd 和内核尚未准备好用于 NVMe,请运行 dracut 命令来启用操作系统。

nvme-conversion-vm:/home/azureuser # mkdir -p /etc/dracut.conf.d
nvme-conversion-vm:/home/azureuser # echo 'add_drivers+=" nvme nvme-core nvme-fabrics nvme-fc nvme-rdma nvme-loop nvmet nvmet-fc nvme-tcp "' >/etc/dracut.conf.d/nvme.conf
nvme-conversion-vm:/home/azureuser # dracut -f -v
dracut: Executing: /usr/bin/dracut -f -v
...
dracut: *** Creating initramfs image file '/boot/initrd-5.14.21-150500.55.65-default' done ***
nvme-conversion-vm:/home/azureuser # reboot

3.将虚拟机转换为 NVMe

若要转换操作系统,需要执行多个步骤。

更改 OS 磁盘的元数据以包括 NVMe 功能 将 SCSI 控制器更改为 NVMe 此过程是使用 PowerShell 脚本自动执行的。

3.1 下载 PowerShell 脚本

若要从 GitHub 存储库下载 PowerShell 脚本,请使用以下命令:

Invoke-WebRequest -Uri "https://raw.githubusercontent.com/Azure/SAP-on-Azure-Scripts-and-Utilities/main/NVMe-Preflight-Check/azure-nvme-VM-update.ps1" -OutFile ".\azure-nvme-VM-update.ps1"

3.2. 转换虚拟机

若要转换运行脚本,GitHub 存储库中还提供了详细的文档。

例如,可以决定是否应在重新配置后自动启动 VM。

.\azure-nvme-VM-update.ps1 -subscription_id XXXXXXXX-a961-4fb7-88c0-757472230e6c -resource_group_name nvme-conversion -vm_name nvme-conversion-vm -disk_controller_change_to NVMe -vm_size_change_to Standard_E64bds_v5
INFO - OS Disk found
INFO - Access token generated
INFO - Getting VM info
INFO - Getting all VM SKUs available in Region swedencentral
INFO - This will take about a minute ...
INFO - Found VM SKU - Checking for Capabilities
INFO - VM supports NVMe
INFO - Checking for TrustedLaunch
INFO - Checking if VM is stopped and deallocated
INFO - Stopping VM
   Tenant: 72f988bf-86f1-41af-91ab-2d7cd011db47
SubscriptionName SubscriptionId                      Account                Environment
---------------- --------------                      -------                -----------
XX-XX-XX-XX      XXXXXXX-a961-4fb7-88c0-757472230e6c xxxxxx@microsoft.com   AzureCloud

OperationId : cf02d28c-c711-4fe5-89fc-854fba31b67a
Status : Succeeded
StartTime : 07.06.2024 15:18:35
EndTime : 07.06.2024 15:19:17
Error :
Name :

INFO - Setting OS Disk to SCSI/NVMe
INFO - Getting VM config to prepare new config
INFO - Setting new VM size
INFO - Setting disk controller for VM
INFO - Updating the VM configuration

RequestId :
IsSuccessStatusCode : True
StatusCode : OK
ReasonPhrase :

INFO - Not starting VM

3.3 检查结果

3.3.1 检查 Azure 门户中的结果

Azure 门户的屏幕截图。

3.3.2 检查 PowerShell 中的结果
PS C:\Users> $vm = Get-AzVM -name nvme-conversion-vm
PS C:\Users> $vm.StorageProfile.DiskControllerType
NVMe
PS C:\Users>

4.检查操作系统

4.1 检查设备

可以使用 nvme 命令检查设备,如果缺少 nvme 命令,就安装“nvme-cli”包。

nvme list

输出应显示 OS 磁盘和数据磁盘。 OS 磁盘和数据磁盘的屏幕截图。

4.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 #
4.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 规则。

4.2.2 准备使用 Azure NVMe utils 安装包

/results/cjp256/azure-nvme-utils/ 的索引上为多种分发提供预编译包。 我们正在努力在所有主要分发版中启用和集成 Azure NVMe utils。