实验环境
- 主板:JZ2440
- 编译器:arm-linux-gcc version 4.3.2 (Sourcery G++ Lite 2008q3-72)
- Linux Kernel:3.4.2
- busybox-1.20.0.tar.bz2
- openssl-1.0.1d.tar.gz wpa_supplicant-2.0.tar.gz
- dhcp-4.2.5-P1.tar.gz
- USB无线网卡:Ralink Technology, Corp. RT2870/RT3070 Wireless Adapter
一、MDEV 机制
官方文档:busybox-1.20.0/docs/mdev.txt
1. 基本用法
Mdev 有两个用途:1. 初始化设备节点 (initial population) 2. 动态更新设备节点 (dynamic updates)。这两个都要求内核支持 sysfs 虚拟文件系统并且将它挂载到 /sys。对于动态更新,还需要在内核中使能热拔插 (hotplugging) 。
以下是初始化脚本的典型代码:
[0] mount -t proc proc /proc
[1] mount -t sysfs sysfs /sys
[2] echo /sbin/mdev > /proc/sys/kernel/hotplug
[3] mdev -s
如果没有 proc 文件系统,就应该变为:
[1] mount -t sysfs sysfs /sys
[2] sysctl -w kernel.hotplug=/sbin/mdev
[3] mdev -s
更完整的设置应该在前面的设置之前执行下面的代码:
[4] mount -t tmpfs -o size=64k,mode=0755 tmpfs /dev
[5] mkdir /dev/pts
[6] mount -t devpts devpts /dev/pts
2. MDEV 的配置文件
配置文件:/etc/mdev.conf
如果你不想使用默认的 660 权限,可以通过可选的配置文件来控制 Mdev,并且可以支持执行你自己的命令。
配置文件格式如下:
<device regex> <uid>:<gid> <permissions> [=path] [@|$|*<command>]
The special characters have the meaning:
@ Run after creating the device.
$ Run before removing the device.
* Run both after creating and before removing the device.
二、Kernel hotplug
mdev 需要内核支持热插拔,在内核 .config 文件中确保已设置
CONFIG_HOTPLUG=y
在内核目录下 make menuconfig , 搜索 hotplug
│ Symbol: HOTPLUG [=y] │
│ Type : boolean │
│ Prompt: Support for hot-pluggable devices │
│ Defined at init/Kconfig:1015 │
│ Depends on: EXPERT [=n] │
│ Location: │
│ -> General setup │
│ -> Configure standard kernel features (expert users) (EXPERT [=n] │
│ Selected by: IXP4XX_NPE [=n] && ARCH_IXP4XX [=n] || XEN_PCIDEV_FRONTE
这就会将内核目录下 lib/kobject_uevent.c 编译到中。
阅读该文件,会发现:
在 kobject_uevent_env 函数中,发生 uevent 事件时会添加环境变量 ACTION=add ,或者在数组 kobject_actions 中的其他取值。
三、wpa_supplicant 使用方法
官方文档:wpa_supplicant-2.0/wpa_supplicant/README
常用命令,其余详见官方文档:
wpa_supplicant -B -d -Dnl80211 -iwlan0 -c/etc/wpa-wpa2.conf
wpa_supplicant -B -d -iwlan0 -c/etc/wpa2.conf
wpa_cli -iwlan0 status # 获得 wlan0 的状态
wpa_cli 命令
wpa_cli command line options
wpa_cli [-p<path to ctrl sockets>] [-i<ifname>] [-hvB] [-a<action file>] \
[-P<pid file>] [-g<global ctrl>] [command..]
-h = help (show this usage text)
-v = shown version information
-a = run in daemon mode executing the action file based on events from
wpa_supplicant # 执行脚本
-B = run a daemon in the background # 后台运行
default path: /var/run/wpa_supplicant
default interface: first interface found in socket path
在 connect/disconnect 时执行额外程序的方法:(脚本在后面实现中举例)
wpa_cli -a/sbin/wpa_action.sh -B
四、DHCP
交叉编译使用DHCP(dhcp-4.2.5-P1.tar.gz) 连接热点自动获取 IP 地址
五、实现
1. 开机脚本
a. /etc/fstab
linux 之 fstab 文件详解
执行 mount -a 时,将挂载 /etc/fstab 的所有内容。
#device mount-point type optioons dump fsck order
proc /proc proc defaults 0 0
sysfs /sys sysfs defaults 0 0
tmpfs /dev tmpfs defaults 0 0
a. /etc/init.d/rcS
开机脚本中应该将(一)中提到的内容实现。
mount -a # 挂载 /etc/fstab 中的内容
mkdir /dev/pts
mount -t devpts devpts /dev/pts
echo /sbin/mdev > /proc/sys/kernel/hotplug
mdev -s
2. 创建 mdev 配置文件
echo "wlan0 0:0 660 * /sbin/auto_wifi.sh" > /etc/mdev.conf
3. 创建 mdev 命令脚本
创建上一步中的脚本文件: /sbin/auto_wifi.sh
#!/bin/sh
if [ $ACTION = "add" ];
then
wpa_supplicant -B -c/etc/wpa-wpa2.conf -iwlan0
wpa_cli -a/sbin/wpa_action.sh -B # wifi 连接成功后自动执行 /sbin/wpa_action.sh
else
killall wpa_supplicant
killall wpa_cli
killall dhclient
fi
3. 创建 wpa_cli 命令脚本
脚本路径:/sbin/wpa_action.sh
在连接完成后,使用 dhclient 命令来自动获取 IP 地址。
#!/bin/sh
IFNAME=$1
CMD=$2
if [ "$CMD" = "CONNECTED" ]; then
echo connect $IFNAME, dhclient for it > /dev/console
dhclient $IFNAME
fi
if [ "$CMD" = "DISCONNECTED" ]; then
echo disconnect $IFNAME, kill dhclient for it > /dev/console
killall dhclient
fi
参考链接
linux 中的热插拔和 mdev 机制
linux 之 fstab 文件详解
交叉编译使用DHCP(dhcp-4.2.5-P1.tar.gz) 连接热点自动获取 IP 地址