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

2023-11-14

实验环境

  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 地址

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐

  • Grafana Kubernetes部署(rancher)

    1 相关资源导航 https blog csdn net zyj81092211 article details 122917786 2 环境介绍 kubernetes版本 v1 23 4 rancher版本 v2 6 3 容器相关环境配置
  • 获取服务器信息失效,获取服务器时间失败

    获取服务器时间失败 内容精选 换一换 安装完Mind Studio后 如果用户进行编译运行相关操作 则需要参见该章节 将硬件环境的lib库同步到Mind Studio安装服务器 已经完成安装 请确保DDK版本号与硬件环境所安装的软件包版本号
  • IO(输入/输出)

    用户态和内核态 用户态 用来运行应用程序 不能直接对操作系统进行调用 而是需要切换到内核态对操作系统进行操作 内核态 直接访问操作系统资源或运行操作系统程序 例如程序要保存一个文件到硬盘 在程序执行的用户态 是直接操作磁盘的 只有切换到内核
  • Socket编程之聊天室

    1 单线程模式 创建服务端 第一步 准备地址和端口 第二步 创建一个ServerSocket对象 第三步 等待客户端连接 最后一步 数据接收和发送 public class SingleThreadServer public static
  • Linux线程同步

    1 同步 同步即协同步调 按预定的先后次序运行 线程同步 指一个线程发出某一功能调用时 在没有得到结果之前 该调用不返回 同时其它线程为保证数据一致性 不能调用该函数 解决同步的问题 加锁 2 数据混乱原因 1 资源共享 独享资源则不会 2
  • ubuntu-16.04 安装虚拟机工具时报错

    2019独角兽企业重金招聘Python工程师标准 gt gt gt root alex virtual machine home alex Desktop vmware tools distrib vmware install pl ope
  • Mathtype公式编辑软件 安装教程

    文章目录 1 MathType公式编辑器 介绍 2 MathType 安装 2 1 下载包 2 2 安装源程序 2 3 安装补丁 4 验证是否安装成功 我们再写论文时 一般都明确要求 公式必须用MathType编辑 所有公式必须在MathT
  • 什么是软件外包公司?要不要去外包公司?

    关注后回复 进群 拉你进程序员交流群 作者丨土豆居士 来源丨一口Linux ID yikoulinux 一 什么是外包 软件外包分为 人力外包和项目外包两个方向 1 劳务派遣 指的是把员工外派到对应的用工企业打 短工 比如很多工程师虽然签约
  • SpringBoot总结

    一 SpringBoot简介 1 入门案例 SpringMVC的HelloWord程序大家还记得吗 SpringBoot是由Pivotal团队提供的全新框架 其设计目的是用来简化Spring应用的初始搭建以及开发过程 原生开发SpringM
  • 153个!PCB板上的字母符号都代表啥?一图带你搞懂!

    PCB板是基于电路设计图而生产的 看过电路设计图的小伙伴都会知道 上面有各种物理电学标准符号 通过分析电路设计图 可以得知将使用哪些电子元器件 各元器件之间的关系 以及该电路具备哪些性能 为此 小编在网络上搜集了一些电工电路图常用的字母符号
  • 石锤!谷歌排名第一的编程语言,死磕这点,程序员都收益

    日本最大的证券公司之一野村证券首席数字官马修 汉普森 在Quant Conference上发表讲话 用Excel的人越来越少 大家都在码Python代码 甚至直接说 Python已经取代了Excel 事实上 为了追求更高的效率和质量 他们开
  • 数据结构与算法——马踏棋盘(c++栈实现)

    马踏棋盘问题是旅行商 TSP 或哈密顿问题 HCP 的一个特例 在国际棋盘棋盘上 用一个马按照马步跳遍整个棋盘 要求每个格子都只跳到一次 最后回到出发点 这是一个 NP问题 通常采用回溯法或启发式搜索类算法求解 在此采用栈进行回溯法求解 i
  • 嵌入式:驱动开发 Day4

    作业 通过字符设备驱动分步注册方式编写LED驱动 完成设备文件和设备的绑定 驱动程序 myled c include
  • OpenCASCADE:在 Android 上使用 OCCT AndroidQt 示例进行 C/C++ 开发

    OpenCASCADE 在 Android 上使用 OCCT AndroidQt 示例进行 C C 开发 在 Android 平台上进行 C C 开发是一项具有挑战性的任务 然而 通过使用 OpenCASCADE OCCT 库和 Andro
  • java linux mac,Java - 获取Linux系统的MAC地址

    I m trying to get the MAC address of a linux system with this code try ip InetAddress getLocalHost NetworkInterface netw
  • Jenkins-CI 远程代码执行漏洞(CVE-2017-1000353)

    Jenkins Jenkins是一个开源软件项目 是基于Java开发的一种持续集成工具 用于监控持续重复的工作 旨在提供一个开放易用的软件平台 使软件项目可以进行持续集成 漏洞描述 该漏洞存在于使用HTTP协议的双向通信通道的具体实现代码中
  • ES自己手动高亮

    背景 es的高亮真的是一言难尽 经常出现各种各样的高亮异常 如 高亮错位 高亮词错误等等 而且 用wildcardQuery 等 也无法高亮 可能是我技术不精吧 总是调不好这玩意 因此决定手写高亮 废话不多说 直接上代码 1 第一步 处理高
  • 方法调用:一看就懂,一问就懵?

    方法调用是不是很熟悉 那你真的了解它吗 今天就让我们来盘一下它 首先大家要明确一个概念 此处的方法调用并不是方法中的代码被执行 而是要确定被调用方法的版本 即最终会调用哪一个方法 上篇文章中我们了解到 class字节码文件中的方法的调用都只
  • CSS元素移动

    元素移动 2D平面移动 水平竖直移动 旋转 3D移动 3D旋转 立体正方体六面为图片 绕由原点指向某一定点的向量轴旋转 2D平面移动 水平竖直移动 水平竖直移动采用属性 transform中的translate x y 一起设置水平和竖直移
  • 使用 mdev 机制实现热插拔USB无线网卡 自动获取IP

    文章目录 实验环境 一 MDEV 机制 1 基本用法 2 MDEV 的配置文件 二 Kernel hotplug 三 wpa supplicant 使用方法 wpa cli 命令 四 DHCP 五 实现 1 开机脚本 2 创建 mdev 配