手上有个技嘉的迷你pc,安装了CentOS 6.6,通过ifcfg配置了静态ip。但是这个pc有个很奇怪的现象,就是如果开机的时候网线没有插上,等开机以后再插网线,或者开机以后拔出网线再插上,这个静态IP就无效了,表现为其他电脑无法ping通这个ip,这台pc也无法ping通网关。这时必须手动ifdown再ifup重启网卡,还要过很久一会才能重新联网。开始以为是网卡配置问题,google了很久,试了各种各样的办法例如修改ifcfg的配置,安装NetworkManager,安装netplug,总之各种折腾,依然没有解决问题。通过tcpdump抓包,发现在重新插上网线的时候,网卡接收不到来自局域网的ARP、组播等数据包,ping网关之前主机会发送ARP咨询网关对应的MAC地址,但是没有收到响应导致无法ping出去。于是开始怀疑是网卡驱动有问题。百度了一下,也说CentOS自带的r8169驱动太古老了,问题多多。
先用lspci查看网卡的型号
03:00.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller (rev 15)
8168和8169型号不要弄错了。CentOS默认只有8169的驱动,所以用来驱动8168的网卡总是怪怪的
在realtek官网下载r8168的linux驱动0010-r8168-8.045.08.tar.bz2。安装步骤参考里面的readme文件
不过,realtek官网的说明实际上还是省略了一些步骤。要编译驱动,首先要安装内核源码和gcc、perl
yum install perl gcc
内核源码不要用yum安装。因为yum安装的是内核的最新版本,可能会比系统当前的内核版本高,导致驱动无法运行。如果要用yum安装kernel-devel,要先yum update把内核升级到最新版本。否则,从centos光盘的Packages目录找到kernel-devel的rpm包,用rpm -ivh安装进去。
r8168的驱动代码在centos 6.6之中会有一个编译错误。编辑src/r8168.h,把eth_hw_addr_random的定义注释掉
#if LINUX_VERSION_CODE < KERNEL_VERSION(3,4,0)
static inline void eth_hw_addr_random(struct net_device *dev)
{
random_ether_addr(dev->dev_addr);
}
#endif
安装完r8168驱动之后,把原来的r8169驱动改个名字,避免下次重启的时候又加载到错误的驱动
cd /lib/modules/2.6.32-504.el6.x86_64/kernel/drivers/net
mv r8169.ko r8169.ko.bak
depmod -a