最近在搞CentOS7装机的事情,在此记录期间遇到关于网卡方面的坑,整理分享下,以免大家继续再踩。
一、在CentOS7默认装完系统之后网卡名称一改之前的名称习惯,网卡名称为enoxxxxx(之前命名规则为eth0-ethxxx)如下图
这种命名规则让习惯了ethxxx的同学很不习惯,对于业务其他方面也会有很大的影响,如对机器网卡监控方面,os每次装机升成的网卡名字不同,则没有办法对所有机器的网卡监控做统一,网卡识别起来不直观等(这尼玛很坑爹啊!)。对此我们通过udev对网卡进行了命名绑定(udev详解绑定自行google吧。),步骤如下:
cd /etc/udev/rules.d/
创建 70-persistent-net.rules
对网卡进行名称绑定
echo "SUBSYSTEM==\"net\", ACTION==\"add\", DRIVERS==\"?*\", ATTR{address}==\"$(ifconfig eth0|grep ether|awk '{print $2}')\", ATTR{type}==\"1\", KERNEL==\"eth*\", NAME=\"eth0\"" >/etc/udev/rules.d/70-persistent-net.rules
echo "SUBSYSTEM==\"net\", ACTION==\"add\", DRIVERS==\"?*\", ATTR{address}==\"$(ifconfig eth1|grep ether|awk '{print $2}')\", ATTR{type}==\"1\", KERNEL==\"eth*\", NAME=\"eth1\"" >>/etc/udev/rules.d/70-persistent-net.rules
echo "SUBSYSTEM==\"net\", ACTION==\"add\", DRIVERS==\"?*\", ATTR{address}==\"$(ifconfig eth2|grep ether|awk '{print $2}')\", ATTR{type}==\"1\", KERNEL==\"eth*\", NAME=\"eth2\"" >>/etc/udev/rules.d/70-persistent-net.rules
echo "SUBSYSTEM==\"net\", ACTION==\"add\", DRIVERS==\"?*\", ATTR{address}==\"$(ifconfig eth3|grep ether|awk '{print $2}')\", ATTR{type}==\"1\", KERNEL==\"eth*\", NAME=\"eth3\"" >>/etc/udev/rules.d/70-persistent-net.rules
然后进入cd /etc/sysconfig/network-scripts 对相应的网卡配置文件编辑,将DEVICE更改为绑定后的设备名称。以及对相应的配置文件重命名如下图
然后修改grub禁用可命名规则,编辑/etc/default/grub文件实现,在该文件的GRUB_CMDLINE_linux= 添加net.ifnames=0 biosdevname=0
如下图
重新升成grub.conf
grub2-mkconfig -o /boot/grub2/grub.cfg
这次重启机器查看网卡名称是不是成为我们想要的名字了呢?
已经变成我熟悉的ethxxx了。ps:心里莫名小激动呢。
二、网卡名称杂乱的问题我们已经解决了,但是在业务实际使用过程中,出现了机器重启后不能ping通的情况,经过调查发现,我们的修改后的网卡命名规则会有一定概率失效!原因是机器在启动中把最先启动的网卡识别在了前面,我们绑定的网卡启动在后面。导致的了机器把原本应该的eth0,识别为了eth1、eth2、eth3。这个问题真是很头疼,经过老司机的指点明白了原因:我们机房的环境是使用的万兆网络环境(即光纤环境),而服务器的万兆网卡非板载网卡,(pci接入)板载的网卡是千兆卡,这样机器在启动的时候先去识别的板载的网卡,而pci接口的万兆卡就在后面识别,导致这个情况的发生。(ps:找到这个原因,我内心毫无波澜,甚至还想送个迷之微笑送给大家。)
经过老司机的指点,解决方案是禁用千兆网卡驱动,操作如下:
此处以intel网卡为例
echo "blacklist igb" >> /etc/modprobe.d/blacklist.conf
sed -i '/GRUB_CMDLINE_LINUX/{s/"$//g;s/$/rdblacklist=igb"/}' /etc/default/grub
grub2-mkconfig -o /boot/grub2/grub.cfg;
这样机器就不会去识别千兆的网卡了。从而不会再出现绑定失败的情况。
Ps:在此讲一下我们之前的妥协方案,在机器中加入一条开机network服务延迟5秒启动的方案。用以解决网卡并行启动,导致网卡启动在udev绑定之前,这样会导致机器网卡启动失败,(目前只有CentOS7.0有发现这个问题,7.2 7.3暂未发现)操作如下。
#!/bin/bash
#关闭network开机自启动
chkconfig network off
#添加sa-network服务延迟5秒重启network服务
echo '#!/bin/bash' >> /etc/init.d/sa-network
echo '#chkconfig:2345 90 05' >> /etc/init.d/sa-network
echo 'sleep 5' >> /etc/init.d/sa-network
echo 'service network restart' >> /etc/init.d/sa-network
chmod +x /etc/init.d/sa-network
chkconfig --add sa-network
chkconfig sa-network on
三、批量装机中使用
在机房进行批量装机的时候,不可能每台都手动执行,或者发现机器不通再单用户修改密码,然后在执行以上一二步骤,会非常浪费时间,经过以上的经验总结中,我在装机的初始化中添加了如下操作,大家可以参考
# disable igb add Zack
osver=`cat /etc/redhat-release | grep -i "7.2" | wc -l`
osver73=`cat /etc/redhat-release | grep -i "7.3" | wc -l`
osver70=`cat /etc/redhat-release | grep -i "7.0" | wc -l`
udev_eth0_mac=`cat /etc/udev/rules.d/70-persistent-net.rules | grep -i eth0| awk -F '"' '{print $8}'`
ip_add_eth0_mac=`ip add | grep -A2 eth0 |grep -i 'ether' | awk '{print $2}'`
speed=`ethtool eth0 | grep -i 'Speed' |awk -F [:] '{print $2}'`
network_name=`ip add |grep -iB1 $udev_eth0_mac | grep -i eth|awk '{print $2}'| grep -i eth| awk -F ':' '{print $1}'`
network_failure_name=`ethtool $network_name | grep -i 'Speed' | awk -F ':' '{print $2}'`
if [ $udev_eth0_mac = $ip_add_eth0_mac ] && [ $speed = "10000Mb/s" ] ;then
echo "blacklist igb" >> /etc/modprobe.d/blacklist.conf
sed -i '/GRUB_CMDLINE_LINUX/{s/"$//g;s/$/rdblacklist=igb"/}' /etc/default/grub
grub2-mkconfig -o /boot/grub2/grub.cfg;
echo '默认万兆网卡,已禁用千兆igb驱动。'
elif [ $udev_eth0_mac != $ip_add_eth0_mac ] ;then
echo "blacklist igb" >> /etc/modprobe.d/blacklist.conf
sed -i '/GRUB_CMDLINE_LINUX/{s/"$//g;s/$/rdblacklist=igb"/}' /etc/default/grub
grub2-mkconfig -o /boot/grub2/grub.cfg
echo 'udev绑定网卡不匹配ip add网卡名称,已禁用千兆igb驱动,重启生效。'
elif [ $udev_eth0_mac = $ip_add_eth0_mac ] && [ $speed = "1000Mb/s" ] ;then
echo '默认千兆网卡,啥都不做。退出。'
fi
#兼容CentOS7.0 network 判断
if [[ "$osver70" == "1" ]]; then
#关闭network开机自启动
chkconfig network off
#添加sa-network服务延迟5秒重启network服务
echo '#!/bin/bash' >> /etc/init.d/sa-network
echo '#chkconfig:2345 90 05' >> /etc/init.d/sa-network
echo 'sleep 5' >> /etc/init.d/sa-network
echo 'service network restart' >> /etc/init.d/sa-network
chmod +x /etc/init.d/sa-network
chkconfig --add sa-network
chkconfig sa-network on
fi
if [ $osver70 = "1" ] && [ $network_name = "eth0" ] && [ $speed = "10000Mb/s" ] ;then
echo "blacklist igb" >> /etc/modprobe.d/blacklist.conf
sed -i '/GRUB_CMDLINE_LINUX/{s/"$//g;s/$/rdblacklist=igb"/}' /etc/default/grub
grub2-mkconfig -o /boot/grub2/grub.cfg;
echo 'CentOS7.0系统,网口名称为eth0且为万兆网卡,已禁用千兆igb驱动。'
fi
if [ $osver70 = "1" ] && [ $network_failure_name = "10000Mb/s" ]; then
echo "blacklist igb" >> /etc/modprobe.d/blacklist.conf
sed -i '/GRUB_CMDLINE_LINUX/{s/"$//g;s/$/rdblacklist=igb"/}' /etc/default/grub
grub2-mkconfig -o /boot/grub2/grub.cfg;
echo 'CentOS7.0系统,网口名称为eth*且为万兆网卡,已禁用千兆igb驱动。'
fi
贴两段执行结果
(写的很low,但至少能用,哈哈)
以上脚本我对部分服务器进行了测试包括dell和华为的机器,OS包括CentOS7.0 7.2 73其它机型和OS没有测试,资源有限哈哈。也希望大家能针对自身的环境灵活运用,不要死套用。有疑问可以直接回复我,我尽量回复大家。
在此建议大家使用CentOS7.2 7.3版本 相对会稳定很多。7.0毕竟是个过渡版本。
感谢大家能看完Thanks!
感谢工作中指点我的Kirin以及Xin Yan。
转载请说明出处www.houzhibo.com 谢谢!