使用 mdev 机制实现热插拔USB无线网卡 自动获取IP

实验环境

  1. 主板:JZ2440
  2. 编译器:arm-linux-gcc version 4.3.2 (Sourcery G++ Lite 2008q3-72)
  3. Linux Kernel:3.4.2
  4. busybox-1.20.0.tar.bz2
  5. openssl-1.0.1d.tar.gz wpa_supplicant-2.0.tar.gz
  6. dhcp-4.2.5-P1.tar.gz
  7. 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 地址

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值