升级网卡驱动是一个很常见的操作,通常执行一条命令就可以搞定。但有时也会因为一些原因需要做一些额外的操作。本文简单介绍一个升级网卡驱动的例子。
需求背景
客户在生产环境中会发现网络延迟抖动的现象,偶发性会延迟会达到1000毫秒,由于客户属于金融系统,对网络延迟要求很高,所以这个问题必须解决,经过测试最后发现该问题是操作系统自带的inbox驱动导致的。升级由联系提供的OOB驱动后问题得到解决。 客户使用的OS是CentOS7并且不是标准内核,内核做过修改。所以在升级驱动时需要按内核版本进行编译后再安装。
编译驱动
1.从联想官方网站按网卡型号下载对应的操作系统版本的驱动包并上传到操作系统当中。
2.将下载的驱动包解压出来并找到SRPM目录。SRPM目录中就是驱动的源码文件。
3.进入到SRPM目录,再进入对应的OS发行版目录,比如这里是“redhat-release-server-7.6”。网卡型号是X710,所以对应的驱动源码文 件是“i40e-xx.xx.rpm”。
4.如下图执行rpmbuild命令编译驱动。
# rpmbuild --rebuild i40e-2.12.6.1.src.rpm
注意:
如果编译失败,通常是由于系统中缺少编译环境所致。一般情况下需要安装以下必要组件。并确保安装的kernel-devel kernel-headers包的内核版本与安装驱动程序的操作系统内核版本保持一致。
#yum install kernel-devel kernel-headers gcc rpm-build
#yum groups install "Development Tools"
5.编译完成后,新驱动保存在如下图中的目录里。这里“kmod-i40e-xxx.rpm” 就是编译好的驱动.
6.如下图中所示的“iavf-4.0.xxxx.rpm”是VF驱动,如果开启了SR-IOV,此驱动也需要编译。
7.编译方法前面相同,执行rpmbuild。
# rpmbuild --rebuild iavF-4.0.1-1.src.rpm
8.编译完成后,就得到了两个新的OOB驱动。
安装驱动
1.执行rpm -ivh命令安装OOB驱动,Warning信息不影响驱动的安装。
# rpm -ivh kmod-xxx.xxx.rpm
2.驱动更新完成后,重启服务器并检查驱动版本正确。
3.确认网卡已经正确加载使用新安装的OOB驱动。
4.如果一切正常,OOB驱动安装就完成了。
附加操作
如果遇到新装驱动没有自动加载的情况,一般是由于不同的驱动加载路径导致的。可以通过以下方法来解决。
1.执行以下命令找到驱动加载的路径。之里可以看到inbox驱动和OOB驱动的名称完全不同,属于不同类型的驱动,所以加载路径会有区别。
# find /|grep -i i40evf
# find /|grep -i iavf
2.找到驱动的KO文件后,使用cp命令将iavf.ko文件复制到原始的驱动加载目录并重命名为i40evf.ko 例如
# cp /usr/lib/modules/3.10.0-862.el7.x86_64/extra/iavf/iavf
/usr/lib/modules/3.10.0-862.el7.x86_64/kernel/drivers/net/ethernet/intel/i40evf/i40evf.ko
3.进入到如下目录。
# cd /usr/lib/modules/3.10.0-862.el7.x86_64/kernel/drivers/net/ethernet/intel/i40evf/
4.创建一个任意名称的新文件夹,然后将i40evf.ko.xz移动到新目录中,例如下图中的“iavf”目录为新建目录。
# mkdir iavf
# mv i40evf.ko.xz iavf
5.重新生成内核模块依赖关系列表和关联的映射文件。
# depmod –a
6.更新内核参数。
# dracut --force
7.重启服务器并检查OOB驱动正确加载。
回退操作
标准的业务变更都需要有回退方案,以免更新驱动后出现新的严重问题可以及时回退的变更前的环境。这里简单介绍一下回退到inbox驱动。
1.卸载OOB驱动。
# modprobe -r i40e
# modprobe -r iavf
2.删除OOB驱动。
# rpm -e kmod-i40e-2.12.6-1.x85_64
# rpm -e kmod-iavf-4.0.1-1.x86_64
3.切换到如下目录:
# cd /usr/lib/modules/3.10.0-862.el7.x86_64/kernel/drivers/net/ethernet/intel/i40evf/
4.删除之前copy过来的驱动文件,并将之前备份的驱动文件移动回来。
# rm -rf i40evf.ko
# cp /usr/lib/modules/3.10.0862.el7.x86_64/kernel/drivers/net/ethernet/intel/i40evf/i
avf/i40evf.ko.xz /usr/lib/modules/3.10.0-862.el7.x86_64/kernel/drivers/net/ethernet/intel/i40evf/
5.重新生成模块依赖的映射文件。
# depmod –a
6.更新内核参数。
# dracut --force
7.重启服务器,确认回滚成功,inbox驱动再次被加载。