ARM上的linux如何实现无线网卡的冷插拔和热插拔
- UID
- 1029342
- 性别
- 男
|
ARM上的linux如何实现无线网卡的冷插拔和热插拔
1. 冷插拔如果在系统上电之前就将RT2070/RT3070芯片的无线网卡(以下简称wlan)插上,即冷插拔。我们通过分析系统启动流程过程中的运行的脚本,将启动wlan的脚本加入其中,就可以实现自动运行wlan.。
系统启动后的第一个进程/sbin/init。init进程最主要的功能就是准备软件执行的环境,包括系统的主机名、网络配置、语系处理、文件系统格式以及其他服务的启动等。而所有的操作都会通过init的配置文件,即/etc/inittab来规划。
在inittab文件中有很多如下格式的语句:
label:runlevel:action:process
但是我们这里只关注下面这条语句:
# now run any rc scripts
null::wait:/etc/init.d/rcS
即运行所有的rc 脚本,这里是运行rcS脚本,rcS脚本内容如下:
~ >: cat /etc/init.d/rcS
#!/bin/sh
# Copyright (C) 2011 GuoWenxue <guowenxue@gmail.com QQ:281143292>
# Start all init scripts in /etc/init.d
# executing them in numerical order.
#
for i in /etc/init.d/S??* ;do
$i
done
~ >:
很简单的一个脚本,即运行/etc/init.d/目录下以S开头,两个?匹配任意两个字符
*匹配0或多个字符。该目录下有一个文件S01_network,内容如下:
注:绿色为注释
~ >: cat etc/init.d/S01_network
#!/bin/sh
# FILE:/etc/init.d/S01_network
# Copyright (C) 2012 GuoWenxue <guowenxue@gmail.com QQ:281143292>
# This file used to configure the network from the configure files
#network_cfg_dir变量是否为空,如果是将/apps/etc/network赋值给network_cfg_dir。
if [ -z "$network_cfg_dir" ] ; then
export network_cfg_dir=/apps/etc/network
Fi
#进入/apps/etc/network目录
cd $network_cfg_dir
#~ >: cd apps/etc/network/
/apps/etc/network >: ls
bakifcfg-wlan0 ifcfg-eth0 resolv.conf
gatewayD.conf ifcfg-ppp10 wpa_supplicant.conf
hostapd.conf ifcfg-wlan0
/apps/etc/network >:
#上面这个正则表达式的目的是提取出网卡名,例如eth0、wlan0,其中wlan0为我们所需要的。
interfaces=$( ls ifcfg* | \
sed -e '/ifcfg-[A-Za-z0-9\._-]\+$/ { s/^ifcfg-//g;s/[0-9]/ &/}' | \
sort -k 1,1 -k 2n | \
sed 's/ //')
#如果网卡还没有配置好,那么运行:#ifconfig 系统只会输出以lo 为首的部分。lo 是look-back网络接口,从IP地址127.0.0.1就可以看出,它代表本机。无论系统是否接入网络,这个设备总是存在的,除非你在内核编译的时候禁止了网络支持,这是一个称为回送设备的特殊设备,它自动由Linux配置以提供网络的自身连接。IP地址127.0.0.1是一个特殊的回送地址(即默认的本机地址),可以在自己的系统上用telnet对IP地址127.0.0.1进行测试。如果有inetd进程在运行的话您会从自己的机器上获得登录提示符。Linux可以利用这个特征在进程与仿真网络之间进行通信。(您有兴趣的话还可以试试本机的实际IP地址,如这里的机器就是210.34.6.89,或者试试"localhost",或者"127.0.0.1",同样可以模拟网络通信。这可是Linux一个非常突出的优点!)
ifconfig lo 127.0.0.1
# No interface configure, then use the default IP address
如果/apps/etc/network目录下没有带网卡名的文件,这时interface变量为空,配置eth0网卡,之后退出。
if [ -z "$interfaces" ] ; then
ifconfig eth0 192.168.1.223 up
exit
fi
# Set up all the interface
设置所有网卡接口
for i in $interfaces; do
#unset删除变量或函数
unset DEVICE TYPE
#如果这时候$i为wlan0,则下面的目的是提取出ifcfg-wlan0文件中的DEVICE、TYPE等号后面的内容。ifcfg-wlan0在该脚本下面。
eval $(fgrep "DEVICE=" ifcfg-$i)
eval $(fgrep "TYPE=" ifcfg-$i)
#如果$DEVICE为空,着将$i的值赋给它。
if [ -z "$DEVICE" ] ; then DEVICE="$i"; fi
#如果ifcfg-wlan0文件中的ONBOOT不为no,时执行下面的语句。
if ! egrep -L "^ONBOOT=['\"]?[Nn][Oo]['\"]?" ifcfg-$i > /dev/null ; then
#下面是根据各自的TYPE值,执行相应的脚本
if [ "$TYPE" = "Ethernet" ] ; then
echo "Bring up $TYPE interface $i"
/usr/sbin/ifup-eth $i
elif [ "$TYPE" = "PPP" ] ; then
echo "Bring up $TYPE interface $i"
elif [ "$TYPE" = "WLAN" ] ; then
# Just bring up the wiFi module here. Configure it in the followed shell scripts
#如果是WLAN,存在目录/sys/class/net/wlan0/就会运行下面的命令,其中/apps/tools/ifup-wlan是一个脚本。在ifcfg-wlan0配置文件下面。
if [ -d /sys/class/net/$DEVICE/ ] ; then
/apps/tools/ifup-wlan $i
fi
else
echo "Bring up $TYPE interface $i"
fi
fi
# for循环结束
done
#结束
~ >: |
|
|
|
|
|