CentOS7内置Realtek网卡驱动r8169降级r8168
前几天装了几台服务器测试,在使用的过程中发现,每次重启系统,登录界面会弹出网卡提示 “r8169 0000:02:00 eth0 Invalid ocp reg 17758!”
系统版本:
经过测试发现:
1、开机前将eth0/eth1网口插上网线,系统启动后识别到eth0/eth1网口有网线连接,此时系统登录界面不会提示网卡信息。
2、如果开机前eth0/eth1没连网线,此时登录界面会弹出网卡提示,此时给eth0/eth1插上网线识别成功后,提示消失。紧接着拔掉eth0/eth1网线,也不会再弹出提示。
3、主板上还插了一个Intel的千兆四口PCI-E网卡,这个网卡倒是没有提示。
总结:当网卡配置为ONBOOT=yes,板载的两个网卡开机界面会提示,Intel网卡不提示。配置ONBOOT=no时,开机不启动网卡,也不会出现提示。
经过几天的折腾,发现是网卡驱动问题。
一、查看网卡驱动
查看系统当前所有网卡信息:
lspci |grep net
发现板载的2个网卡都是Realtek的网卡,版本是RTL8111/8168/8411
查看当前eth0使用网卡驱动版本:
ethtool -i eth0
发现系统当前使用的网卡驱动是r8169,(这个驱动版本应该是centos7默认安装的版本)
到这里怀疑是网卡驱动版本不匹配导致的,网上查了一下发现关于r8169和r8168的描述还挺多,大部分都是网络不通,网卡启动失败等。
既然版本不一样,那就让它一样呗,开搞。
二、更新网卡驱动
先去Realtek官网下载对应版本的网卡驱动:
发现最新版本更新到8.050.03了,才113kb,直接下载
解压安装:
tar -jxvf r8168-8.050.03.tar.bz2
cd r8168-8.050.03
#解压后有一个README文件,发现已经写好脚本了,直接执行脚本安装,简单
./autorun.sh
果然,事情不会那么顺利,这里发现无法直接编译通过。报了三处错误,如下图所示:
2.1编译错误处理
2.1.1、‘ether_addr_copy’重定义
根据报错提示的文件及行数,编辑文件:r8168.h,找到53行。
这里需要修改第52行内容,根据系统内核版本修改,我这个是3.10.0
#if LINUX_VERSION_CODE < KERNEL_VERSION(3,14,0)
改为:
#if LINUX_VERSION_CODE < KERNEL_VERSION(3,10,0)
2.1.2、初始值设定项里有未知的字段‘ndo_change_mtu’
先查看系统内核:
cat /usr/src/kernels/3.10.0-1160.el7.x86_64/include/linux/netdevice.h |grep ndo_change_mtu
发现有这个字段:ndo_change_mtu_rh74 ,修改r8168_n.c文件的第26768行,把ndo_change_mtu修改为ndo_change_mtu_rh74
.ndo_change_mtu = rtl8168_change_mtu,
改为
.ndo_change_mtu_rh74 = rtl8168_change_mtu,
2.1.3、‘struct net_device’没有名为‘last_rx’的成员
这个错误,直接注释掉即可,修改r8168_n.c文件的第29487行,将改行注释掉
修改完成后,继续编译:
没有报错,查看网卡驱动版本:
改过来了,重启后,发现系统加载的还是r8169,查了资料发现,Centos7版本替换驱动文件后,需要执行dracut --force
命令来更新initrd/initramfs,以防止加载旧版本的驱动。
执行完后,重启系统。查看网卡驱动信息:
加载的是r8168,这样,即使eth0/eth1不插网线,开机界面也不会提示网卡信息了。