CentOS 7.3从IDC导入到AWS云后的ENA和NVMe驱动安装、dracut报错修复和磁盘扩容

更新了内核小版本的提示,确保安装的内核驱动与当前使用的小版本对应,否则其他版本的内核可能会加载非最新版ENA驱动。

一、背景

1、关于IDC迁移到AWS EC2之后的ENA网卡驱动

从IDC导入了一个CentOS 7.3镜像到AWS海外Region。导入成为新的AMI成功后,在t2.small等上几代机型上可正常启动,此时使用的是vif的驱动,可执行ethtool -i eth0查看。

此时无法将本EC2的机型修改到5系列、6系列等新机型。这是不支持的,界面上不允许选取。这是由于镜像没有打开ENA Support造成的。

此时可按照AWS官网文档,正常安装ENA网卡驱动,并为本EC2开起ENA Support。操作完成后,本EC2可以切换机型到5系列机型。

2、在新机型上启动过程加载分区失败

在完成以上工作后,5系列机型启动失败。

几个错误现象:

1) 用t2系列机器启动,执行modinfo nvme可看到NMVe启动信息,但是执行lsmod返回清单中不包含NVMe的信息。

2) 用t2系列机器启动,执行命令lsinitrd /boot/initramfs-$(uname -r).img | egrep "(ena|nvme)"无法获得NVMe相关的驱动。

3) 用AWSCLI为本机打开ENA Support后,用5系列EC2启动,但是健康检查不正常。如下截图。

4) 用5系列EC2启动,无法正常引导,使用串口控制台登录EC2,可看到加载系统盘时候报错。如下截图。

5) 用5系列EC2启动,以上报错后,EC2串口控制台可看到本机进入了dracut的rescure救援模式。在救援模式下执行ls -l /dev/,可看到其中没有找到任何磁盘设备,包括/dev/sda, /dev/xvda, /dev/nvmen0p0等都没有找打。

因此,以上故障诊断为本机没有正确的加载NVMe驱动。

3、从AMI到创建EC2的磁盘扩容问题

此外,在用AMI创建时候将系统盘设置为10GB,然后在创建新的EC2时候选择系统盘50GB,但是操作系统没有识别到扩容。

这一步是需要调整操作系统内的分区大小和LVM配置方可生效。需要注意的是,本步骤对于t2老机型和5系列机型,其操作的磁盘名称是不一样的,因为t2老机型的磁盘标识符为/dev/xvda,而新一代5系列和更高系列磁盘标识符是/dev/nvmen0p0这样的形式。

本文在NVMe驱动配置好的最后一步之后,再进行分区调整操作。

二、驱动安装过程

首先用t2.medium这个机型(2vCPU/4GB)启动,用来调试驱动。

1、升级Kernel小版本

确认CentOS的源正确,然后执行如下命令:

yum update -y kernel
reboot

这里重启的意义是,确认内核版本最新,因为安装内核驱动是跟随kernel小版本走的,一旦kernel升级,内核驱动需要重新安装,否则检测不到内核模块,无法启动。本文以CentOS7最终升级到3.10.0-1160.102.1.el7.x86_64为例继续后续安装。

2、加载ENA驱动

以root身份执行如下命令:

yum install gcc git kernel-devel tmux -y
git clone https://github.com/amzn/amzn-drivers
cd amzn-drivers/kernel/linux/ena
make
mkdir /etc/modules-load.d/
touch /etc/modules-load.d/ena.conf
echo "ena" > /etc/modules-load.d/ena.conf
rm /lib/modules/3.10.0-1160.102.1.el7.x86_64/ena.ko -f
cp ena.ko /lib/modules/3.10.0-1160.102.1.el7.x86_64/
rm /lib/modules/3.10.0-1160.102.1.el7.x86_64/kernel/drivers/net/ethernet/amazon/ena/ena.ko.xz -f
depmod
dracut -v -f
sed -i '/^GRUB\_CMDLINE\_LINUX/s/\"$/\ net\.ifnames\=0\"/' /etc/default/grub
grub2-mkconfig -o /boot/grub2/grub.cfg

先不要重启,继续操作。

3、加载NVMe驱动

以root身份执行如下命令:

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 -v -f

修改grub启动配置,编辑/etc/default/grub,找到如下GRUB_CMDLINE_LINUX="console=ttyS0 biosdevname=1 net.ifnames=0"这启动这一行,在其中增加nvme_core.io_timeout=4294967295 nvme_core.admin_timeout=4294967295,添加后整体结果如下:

GRUB_CMDLINE_LINUX="console=ttyS0 biosdevname=1 net.ifnames=0 nvme_core.io_timeout=4294967295 nvme_core.admin_timeout=4294967295"

重新生成grub配置文件,执行如下命令:

grub2-mkconfig -o /boot/grub2/grub.cfg

操作完毕,对EC2做关机。

三、修改EC2类型为支持ENA网络的新机型

请先确认目前镜像使用的是t2系列EC2,且处于关机状态。开机状态的无法修改。

在本地电脑安装AWSCLI,并配置AKSK密钥,然后执行如下命令修改EC2的类型。请替换其中的Instance ID为真实的值。

aws ec2 modify-instance-attribute --instance-id instance_id --ena-support

修改完毕。现在即可将EC2切换为c5.large或者c6i.large机型,启动即可成功。

四、在已经包含ENA和NVMe的5系列机型上进行磁盘扩容

在上一步启动成功后,来进行扩容。从镜像拉起新的EC2,或者直接修改EC2的系统盘,都可以进行扩容。扩容后还需要下面的操作方可让操作系统识别到扩容。

首先执行lsblk确认物理磁盘的容量。返回信息如下:

NAME            MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
nvme0n1         259:0    0   50G  0 disk
├─nvme0n1p1     259:1    0    1M  0 part
├─nvme0n1p2     259:2    0    2G  0 part /boot
└─nvme0n1p3     259:3    0  7.8G  0 part
  └─system-root 253:0    0  7.8G  0 lvm  /

当前镜像缺如下包,执行如下命令安装:

yum install cloud-utils-growpart gdisk -y

执行如下命令查看分区,如果有error,键入fix并按回车修复。

parted -l

执行如下命令扩展磁盘。其中/dev/nvme0n1表示设备,空格和3表示第三个分区,也就是p3

growpart /dev/nvme0n1 3

再次执行lsblk确认磁盘的容量,可以看到nvme0n1p3已经是扩容到了48GB了。返回信息如下:

NAME            MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
nvme0n1         259:0    0   50G  0 disk
├─nvme0n1p1     259:1    0    1M  0 part
├─nvme0n1p2     259:2    0    2G  0 part /boot
└─nvme0n1p3     259:3    0   48G  0 part
  └─system-root 253:0    0  7.8G  0 lvm  /

继续扩展LVM和文件系统:

pvresize -v /dev/nvme0n1p3
lvextend -l +100%FREE /dev/mapper/system-root
resize2fs /dev/mapper/system-root

扩容完成。现在执行df -h即可看到。

五、制作新的AMI完成配置

在当前正在运行的5系列或者6系列的EC2上,创建AMI镜像。创建时候选择NO Reboot不用重启。

创建完毕后,这个新的镜像即可用于未来直接常见5系列和6系列的EC2使用。

六、参考文档

https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/enhanced-networking-ena.html