linux设备模型十四(hotplug和mdev使用)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_16777851/article/details/89407658

mdev有两个主要的用途:初始化常用设备和动态更新。这两个用途都要需要内核的sysfs的支持并且需要把sysfs挂载到/sys。对于动态更新来说,你也需要开启内核的热插拔功能。

以下是几个典型的代码段,从初始化脚本摘录:

[0] mount -t proc proc /proc
[1] mount -t sysfs sysfs /sys
[2] echo /sbin/mdev > /proc/sys/kernel/hotplug
[3] mdev -s

另外一种写法,上面的代码段在没有procfs的情况下就变成了:

[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

对上面的代码进行一个简要的解释:[1] 在执行mdev之前需要将/sys挂载,然后[2]当有设备被添加或者移除的时候,通知内核执行/sbin/mdev,以便设备节点可以被创建或者消除。然后[3]在系统启动的时候, 所有的设备节点在/dev下被创建。
第[4]步要确定/dev是一个tmpfs文件系统(假定你的flash空间用光了)。第[5]步创建/dev/pts挂载点,最后第[6]步将devpts文件系统挂载到这个节点上。

mdev有一个可以操作的配置文件,当然这个文件的控制权是掌握在设备节点的拥有者手中的,如果你的系统需要更加多的权限,不然就是root/root 660的权限值,当然这个需要busybox编译是配置上mdev这个选项。
 

在使能mdev的配置功能后,如果在/etc目录下有mdev.conf文件存在,则会在每次创建一个设备文件的时候,执行一次mdev.conf文件。

当然这个脚本文件的编写是要遵守一定规则的,是一个正则表达式,这个规则在busybox的docs/mdev.txt里面说的很详细。

-------------
 MDEV Config   (/etc/mdev.conf)
-------------

mdev有一个可选的配置文件,用于控制的所有权/权限设备节点,如果您的系统需要的内容超过默认的root 660权限。

该文件的格式为:

<device regex> <uid>:<gid> <permissions> [=path] [@|$|*<command>]

<device regex> <uid>:<gid> <permissions> [>path] [@|$|*<command>]

<device regex> <uid>:<gid> <permissions> [!] [@|$|*<command>]

device regex :正则表达式,表示那一个设备

uid :所拥有者的id

gid :所在组的id

permissions : 以把进制表示的权限

path:表示要创建设备节点的路径

默认权限是660,表示拥有者和所在组都是有读写的权利。

上面的选项不一定是所有要选的,根据自举需要。一般简单的创建你自己的全匹配像下面这样:

    .* 1:1 777

你可以重命名/移除设备节点,使用下一个字段。

    <device regex> <uid>:<gid> <permissions> [=path]

如果你想放置你的设备节点到一个子目录,一定要确定你的路径有一个"/"尾,如果你要重命名设备节点,直接打上名字就行。

    hda 0:3 660 =drives/

这个代码的意思就是将“hda”这个设备节点移动到 drivers/ 这个子目录。

    hdb 0:3 660 =cdrom

这个代码的意思是重命名“hda”为“cdrom”

    hdb 0:3 660 >/driver/newname

>/driver/newname: 可以在/driver目录下创建一个设备节点的链接,并命名为newname

应用第四个字段“!”可以阻止设备节点的创建:

    tty[a-z]. 0:0 660 !
    pty[a-z]. 0:0 660 !

比如上面这两句脚本就是,阻止前三个字符是tyy,后面字符是[a-z]的设备的创建。

刚在我们对下面这个参数忽略了,这里说一下

[@|$|*<command>]

@ command :表示在设备创建之后执行

$ command :表示在设备移除之后执行

* :表示在设备创建和移除之后都执行。

当然这些命令是通过system()函数(这意味着你正在通过shell执行你的命令)执行的,所以在/bin/sh这里安装一个shell是必须的。你应该有这么一个意识,内核通过标准输入输出执行热插拔助手,stderr被连接到/dev/null。

举例:

mmcblk1	 0:0	660	=mmc/

上面这句脚本的意思为,把mmcblk1在/dev/mmc/下面也放置一份

mmcblk([0-9]+)p([0-9]+) 0:0     660     >disk/mmc/%1/%2

移动设备到某个目录下,并重命名

比如我一个u盘插到usb口后,如果使用需要先挂载,拔掉U盘前需要移除挂载。

一般接上U盘就是为了使用的,所以每次手动的挂载卸载是很麻烦的。

所以这两个步骤就可以通过mdev.conf来完成。

ad([a-z]+)([0-9]+)    0:0    777    * if [ $ACTION = "add" ]; then mount /dev/$MDEV /tmp; else umount /tmp; fi

因为我手边暂时没usb2.0的u盘,暂时只能拿一个sd卡来做实验了。

sd卡不具有热插拔功能,所以我就默认让系统启动后直接挂载,然后直接在tmp目录查看就可以。

mmcblk([0-9]+)p([0-9]+)    0:0    777    * if [ $ACTION = "add" ];then  mount /dev/$MDEV /tmp; else umount /tmp; fi


首先在我pc的linux主机上看一下这个sd卡分区1的内容

我的sd卡的分区1里面有一个1.txt文件

我把这个sd卡插在我的开发板上,启动内核,启动时会自动挂载这个sd卡

我这里对名字做了一个小的改动,因为我这个sd卡有三个分区,而tmp目录同一时刻只能挂载一个分区。

当然我这个脚本命令段功能比较少,如果有一个复杂的功能,建议写成脚本文件。

比如:

可以看一下实际验证的内容。

权限 777 后面那个 * 属于和命令挂钩,表示设备插入后和移除前都执行这个脚本。

上面那个警告是属于文件系统本身的内容,不影响挂载和使用。

上面就是自动热插拔的所以内容。

猜你喜欢

转载自blog.csdn.net/qq_16777851/article/details/89407658