最近在调一个linux网卡名不是eth的问题:
简单总结一下Linux网卡启动在启动中的顺序,并不是很全面,够以后备查。linux版本是RHEL3.4.3-EL4。
1、inittab
这个文件在/etc/目录下
A、启动级别
id:3:initdefault, 3个数字代表启动级别,那么下面代码的部分将启动 13:3:wait:/etc/rc/d/rc 3 这一行,最终连接的是/etc/rc.d/rc3这个目录下,这个目录下以S开头的代表启动,以K开头的代表不启动,后面的数字排序后按照大小进行排序就是启动顺序,废话说多了,这个也不是启动的第一步。
B、第一个启动的脚本rc.sysinit
接下来启动的第一步开始了,rc.sysinit,目录不说了,直接可见。
这里介绍跟网卡启动相关的部分
eval `kmodule | while read devtype mod ; do
case "$devtype" in
"IDE") ide="$ide $mod"
echo "ide=\"$ide"\";;
"SCSI") scsi="$scsi $mod"
echo "scsi=\"$scsi"\";;
"NETWORK") network="$network $mod"
echo "network=\"$network"\";;
"AUDIO") audio="$audio $mod"
echo "audio=\"$audio"\";;
*) other="$other $mod"
echo "other=\"$other"\";;
esac
done`
这段代码是确定网卡的驱动类型,比如intel 网卡的igb或者e1000e,保存在network变量里。
# Network
pushd /etc/sysconfig/network-scripts >/dev/null 2>&1
interfaces=`ls ifcfg* | LC_ALL=C egrep -v '(ifcfg-lo|:|rpmsave|rpmorig|rpmnew)' | \
LC_ALL=C egrep -v '(~|\.bak)$' | \
LC_ALL=C egrep 'ifcfg-[A-Za-z0-9\._-]+$' | \
sed 's/^ifcfg-//g' |
sed 's/[0-9]/ &/' | LC_ALL=C sort -k 1,1 -k 2n | sed 's/ //'`
for i in $interfaces ; do
eval $(LC_ALL=C fgrep "DEVICE=" ifcfg-$i)
echo "shyy interfaces: $interfaces ,,$DEVICE">/dev/kmsg
ifconfig -a>/dev/kmsg
load_module $DEVICE
done
popd >/dev/null 2>&1
这段代码是找到/etc/sysconfig/network-scripts以eth开头的网卡放到interfaces里面。然后调用load_module进行加载eth网卡,这段我也不是很明白,为什么要在下面还要根据驱动加载一遍。
for module in $network ; do
load_module $module
done
是根据网卡信息继续加载网卡。网卡的服务基本上到此完毕。
C、rc.d这里主要讲解network服务,对应的脚本文件是/etc/rc.d.init.d/network脚本。
最终屏幕显示的是action $"Bringing up interface $i: " ./ifup $i boot这一行代码,这一行代码主要是使用的ifup命令,加载网卡。
ifup指令是一个脚本,在/sbin/目录下
目前查的最主要的是下面代码,根据etc/sysconfig/network-scripts文件夹下的ifcfg*文件进行mac地址和eth对应的匹配进行改名。
先说原因:新的设备网卡接到了PCIe插槽上,导致网卡启动和HWADDR字段的功能有冲突,导致的网卡加载的名字不对,而原来的设备网卡接在南桥芯片上,南桥芯片的网卡启动速度快,所以启动的时候使用HWADDR字段启动就没有问题