Linux脚本程序自动修改网卡配置文件中的MAC地址
在玩Linux虚拟机的时候,一个安装好linux系统的virtual HDD会用于创建多个虚拟机,这样就不需要在创建每个虚拟机都安装一遍系统了。virtual HDD加载到虚拟机后,新的虚拟机的MAC地址就会和virtual系统中ifcfg-eth[0-9]中的MAC地址不一样,进入系统后,ifconfig -a看到的网卡编号是接着原来系统中网卡序号编号的。
假如原来系统中有四块网卡,那么对应的编号是:eth0,eth1,eth2,eth3;那么你用virtual HDD来创建一个新虚拟机,新的虚拟机同样配置了四块网卡,那么在进入系统后,用ifconfig -a 应该看到以下这样的网卡编号:eth4,eth5,eth6,eth7。
我经常会遇到这样的问题,每次修复这类问题,都要花上很长时间,实在纠结。我不得不考虑自动化的问题。于是下面的这个脚本程序就诞生了。
这个脚本程序主要修改以下两个文件:
ifcfg-eth[0-9]:[0-9]是泛指,这是正则表达式的表示方法,别说看不懂。这些网卡配置文件中的MAC地址全部要修改为当前机器上网卡的MAC。
70-persistent-net.rules:决定网卡的编号。这个文件中的内容,是系统启动时检测到的网卡,是系统自动生成;这个文件可以直接清空,我这里为了练手,所以我也对其做了细化处理。
执行完这个脚本后,重启系统,就一切OK了。就看到了熟悉的eth0,eth1……之类的了。
此脚本程序适应于RHEL系列,CentOS。
#!/bin/bash
#update:2012-12-16
#author:Sean_Gong
#version
#根据系统所识别到的网卡个数,决定修改ifcfg-eth$x文件,在修改这个网卡配置文件之前首先确定这个文件是否存在。
#如果存在,则把系统识别到的所有网卡的MAC地址写入该文件作为注释,便于记录和检查。
#在处理70-persistent-net.rules时,可以简单的把该文件清空。
#系统重启后,会自己把识别到的网卡添加到这个文件中,不需要人工干预。
#这里我之所以处理这个文件,是为了练习sed对文本的处理,和程序逻辑的锻炼,对程序整体的掌控能力。
cdate=$(date '+%Y%m%d')
num=$(ifconfig -a | grep eth | wc -l)
for ((n=0;n<${num};n++))
do
j=$((n+1))
[ -e 70-persistent-net.rules_${cdate} ] || cp -fa /etc/udev/rules.d/70-persistent-net.rules 70-persistent-net.rules_${cdate}
if [ -e /etc/sysconfig/network-scripts/ifcfg-eth${n} ] ; then
[ -e ifcfg-eth${n}_${cdate} ] || cp -fa /etc/sysconfig/network-scripts/ifcfg-eth${n} ./ifcfg-eth${n}_${cdate}
cat ifcfg-eth${n}_${cdate} | sed '/^#eth.*$/d' > ifcfg-eth${n}_temp
ifconfig -a | grep "HWaddr" | awk '{print "#"$1" : "$5}' >> ifcfg-eth${n}_temp
newmac=$(ifconfig -a | grep "eth" | sort | awk '{print $5}' | nl -n ln | grep "^${j}" | awk '{print $2}')
sed "s/HWADDR.*$/HWADDR=$newmac/g" ifcfg-eth${n}_temp > ifcfg-eth${n}_vi
cp -fa ifcfg-eth${n}_vi /etc/sysconfig/network-scripts/ifcfg-eth${n} && rm -f ifcfg-eth${n}_temp
grep -i ${newmac} 70-persistent-net.rules_${cdate} | sed "s/NAME=.*$/NAME=/"eth${n}/"/g" >> 70-persistent-net.rules_temp
else
newmac=$(ifconfig -a | grep "eth" | sort | awk '{print $5}' | nl -n ln | grep "^${j}" | awk '{print $2}')
grep -i ${newmac} 70-persistent-net.rules_${cdate} | sed "s/NAME=.*$/NAME=/"eth${n}/"/g" >> 70-persistent-net.rules_temp
continue
fi
done
cat 70-persistent-net.rules_temp > 70-persistent-net.rules_vi && rm -f 70-persistent-net.rules_temp
cp -fa 70-persistent-net.rules_vi /etc/udev/rules.d/70-persistent-net.rules