当您的ECS实例需要通过已有的但未安装NVMe(Non-Volatile Memory Express)驱动的自定义镜像部署业务,并计划通过NVMe协议来增强存储性能时,您可以按照本文操作为已有的自定义镜像安装NVMe驱动,才能确保ECS实例正常启动、业务稳定运行。
非易失性存储器标准接口NVMe是一种专为固态存储(如基于闪存的SSD)设计的高速接口协议,相比SCSI、virtio-blk等传统驱动协议,它具有速度更快、传输带宽更高的特点。关于NVMe的更多介绍,请参见NVMe协议介绍。
操作场景
您可能在以下场景中会涉及已有自定义镜像未安装NVMe驱动的情况,需要按照本文操作:
您是本地制作的自定义镜像,在导入阿里云时通过镜像检测功能发现镜像未安装NVMe驱动。
在购买支持NVMe协议的ECS实例规格时,无法选到自定义镜像,可能因为镜像与实例规格的NVMe属性不匹配。
说明支持基于NVMe协议挂载云盘的实例规格族信息,请参见实例规格族。您也可以通过API接口DescribeInstanceTypes中的
NvmeSupport
参数确认实例规格族是否支持NVMe。您可以通过API接口DescribeImages中的
NvmeSupport
参数确认镜像是否支持NVMe。关于创建ECS实例时看不到某些镜像的更多说明,请参见为什么创建ECS实例时看不到某些镜像?。
操作步骤
通过已有自定义镜像创建一台ECS实例,用于中转自定义镜像的数据。
具体操作,请参见使用自定义镜像创建实例。
重要创建的中转实例会产生费用,待新的自定义镜像创建完成后,建议您及时释放实例,避免持续产生费用。
远程连接新建ECS实例。
具体操作,请参见连接方式概述。
查看新建ECS实例是否包含NVMe驱动,并安装NVMe驱动。
云助手自动配置
云助手提供了
ecs_nvme_config
插件,可以帮助您快速完成NVMe驱动配置,但是有操作系统限制。运行以下命令,检查实例内是否已安装云助手Agent,并检查客户端内是否提供了
ecs_nvme_config
插件。acs-plugin-manager --list
如果您运行命令后没有返回云助手相关信息,则需要先在实例内安装云助手Agent。具体操作,请参见安装云助手Agent。
如果返回了云助手插件列表且存在
ecs_nvme_config
插件,请继续下一步操作。
使用
ecs_nvme_config
插件,完成NVMe相关的配置。运行以下命令,使用
ecs_nvme_config
插件检查当前实例内是否有NVMe模块,以及是否可以配置NVMe模块。sudo acs-plugin-manager --exec --plugin ecs_nvme_config --params --check
如果返回结果中存在如下提示信息,则表示实例中已安装NVMe驱动,您无需进行NVMe相关的配置,可直接创建自定义镜像。
[SUCCESS] Summary: Your image can Runnig on nvme instance
如果返回结果中存在类似如下
[ERROR]
提示信息,则需要继续执行下一步操作。[ERROR] 1.initrd/initramfs not has nvme module, Please run acs-plugin-manager --exec --plugin ecs_nvme_config --params -f/--fix to enable nvme;
根据检查结果中的提示信息,配置NVMe驱动以及相关参数信息。
sudo acs-plugin-manager --exec --plugin ecs_nvme_config --params --fix
完成配置后,运行以下命令,重启实例。
sudo reboot
重启实例后,重新检查NVMe模块是否配置成功。
sudo acs-plugin-manager --exec --plugin ecs_nvme_config --params --check
配置成功的返回示例如下:
[OK] 1.initrd/initramfs already contain nvme module; [OK] 2.fstab file looks fine and does not contain any device names; [OK] 3.The nvme parameters already included. [SUCCESS] Summary: Your image can Runnig on nvme instance
手动配置(CentOS/Alibaba Cloud Linux系列)
运行以下命令,查看系统内核是否已经加载了NVMe驱动。
cat /boot/config-`uname -r` | grep -i nvme | grep -v "^#"
如果返回结果
CONFIG_BLK_DEV_NVME=y
,则表示该操作系统可以直接在支持NVMe协议的实例规格族上启动,可以直接执行步骤ⅳ。如果返回结果
CONFIG_BLK_DEV_NVME=m
,需要依次完成以下操作。
运行以下命令,查看initramfs中是否包含NVMe驱动。
sudo lsinitrd /boot/initramfs-`uname -r`.img | grep -i nvme | awk '{print $NF}'
如果返回如图所示的结果,则表示该操作系统可以直接在支持NVMe协议的实例规格族上启动,可以直接执行步骤ⅳ。
如果没有返回如图所示的结果,需要依次完成以下操作。
依次运行以下命令,使initramfs支持NVMe驱动。
mkdir -p /etc/dracut.conf.d echo 'add_drivers+=" nvme nvme-core "' | sudo tee /etc/dracut.conf.d/nvme.conf > /dev/null sudo dracut -v -f
说明如果您的操作系统没有安装dracut工具,您需要先运行sudo yum -y install dracut安装dracut工具。
在GRUB中添加NVMe相关的
io_timeout
参数。说明在GRUB中添加NVMe相关的
io_timeout
参数主要是为了应对Linux系统中与NVMe设备相关的超时错误问题。将超时值设为最大,系统在处理NVMe设备的I/O请求时不会因超时问题而导致故障。大部分Linux发行版本中
io_timeout
参数默认配置为30秒。在新版本的内核中,需要将io_timeout
参数设置为最大值4,294,967,295秒,低内核版本中需要设置为255秒。
运行以下命令,打开grub文件。
sudo vi /etc/default/grub
按i键进入编辑模式,在
GRUB_CMDLINE_LINUX=
一行中,添加nvme_core.io_timeout=4294967295 nvme_core.admin_timeout=4294967295
参数信息。添加参数后,文件内容如下图所示:
说明如果配置文件中默认已存在相同的参数信息,则无需再次添加。
按Esc键退出编辑模式,输入
:wq
并按Enter键,保存退出文件。
运行以下命令,使配置的GRUB生效。
根据ECS实例的启动模式不同,选择以下适用于您的命令:
BIOS(Legacy)启动模式
sudo grub2-mkconfig -o /boot/grub2/grub.cfg
UEFI启动模式
sudo grub2-mkconfig -o /boot/efi/EFI/centos/grub.cfg
说明关于ECS实例启动模式的更多说明,请参见ECS实例启动模式最佳实践。
重新运行以下命令,查看是否有NVMe相关的返回信息。
sudo lsinitrd /boot/initramfs-`uname -r`.img | grep -i nvme | awk '{print $NF}'
如果有类似于如下图所示的返回结果,则表示已配置完成,该操作系统可以直接在支持NVMe协议的实例规格族上启动。
手动配置(Ubuntu/Debian系列)
(可选)运行以下命令,查看initrd中包含的NVMe驱动。
lsinitramfs /boot/initrd.img-`uname -r` | grep -i nvme
返回结果如下所示,Ubuntu系列操作系统的initrd中默认已经加载了NVMe驱动。
在GRUB中添加NVMe相关的
io_timeout
参数。说明在GRUB中添加NVMe相关的
io_timeout
参数主要是为了应对Linux系统中与NVMe设备相关的超时错误问题。将超时值设为最大,系统在处理NVMe设备的I/O请求时不会因超时问题而导致故障。大部分Linux发行版本中
io_timeout
参数默认配置为30秒。在新版本的内核中,需要将io_timeout
参数设置为最大值4,294,967,295秒,低内核版本中需要设置为255秒。
运行以下命令,打开/etc/default/grub文件。
sudo vi /etc/default/grub
按i键进入编辑模式,在
GRUB_CMDLINE_LINUX=
一行中,添加nvme_core.multipath=n nvme_core.io_timeout=4294967295 nvme_core.admin_timeout=4294967295
参数信息。添加参数后,文件内容如下图所示:
说明如果配置文件中默认已存在相同的参数信息,则无需再次添加。
按Esc键退出编辑模式,输入
:wq
并按Enter键,保存退出文件。
运行以下命令,使配置的GRUB生效。
根据ECS实例的启动模式不同,选择以下适用于您的命令:
不区分启动模式(该命令仅适用于Ubuntu系统)
sudo update-grub2
BIOS(Legacy)启动模式
sudo grub-mkconfig -o /boot/grub/grub.cfg
UEFI启动模式
sudo grub-mkconfig -o /boot/efi/EFI/debian/grub.cfg
说明关于ECS实例启动模式的更多说明,请参见ECS实例启动模式最佳实践。
通过ECS实例创建新的自定义镜像,新建的自定义镜像已包含NVMe驱动。
具体操作,请参见使用实例创建自定义镜像。
修改新自定义镜像的NVMe驱动属性为支持。
具体操作,请参见修改镜像的属性和标签。
(可选)通过新建已支持NVMe的自定义镜像重新部署业务,例如创建ECS实例。
具体操作,请参见使用自定义镜像创建实例。在创建过程中,ECS实例规格请选择支持NVMe协议的实例规格。
说明业务部署完成后,建议您及时删除旧自定义镜像,避免资源浪费。具体操作,请参见删除自定义镜像。
相关文档
基于NVMe协议的ECS实例规格仅支持挂载ESSD云盘和ESSD AutoPL云盘,ESSD云盘和ESSD AutoPL云盘可以开启多重挂载功能,支持同时挂载到多台ECS实例上以实现数据共享。更多信息,请参见开启多重挂载功能。
如果ECS实例中NVMe云盘的
io_timeout
参数配置不当, 导致NVMe云盘不可用问题,您可以参考Linux系统的ECS实例中NVMe磁盘IO超时参数配置不当,导致NVMe磁盘不可用如何处理?处理。