更新了内核小版本的提示,确保安装的内核驱动与当前使用的小版本对应,否则其他版本的内核可能会加载非最新版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