linux中的热插拔和mdev机制

 mdev手册(自己翻译的留着看)

 mdev实现U盘或SD卡的自动挂载

 mdev的使用以及mdev.conf的规则配置–busybox

linux中的热插拔和mdev机制

 关于实现udev/mdev自动挂载与卸载

 udev 文件系统制作


mdev手册(自己翻译的留着看) 

————–
 MDEV 入门
—————
对于那些懂得怎么样使用mdev的人来说,这个mdev入门看起来就有点跛足别扭,但是对于其他的那些人,也就是所谓的primers来说,他们觉得mdev是一个奇怪的黑盒子并且非常可怕,费劲脑汁也搞不懂它是怎么样工作的。

————–
 基本用法
————-
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 配置   /etc/mdev.conf)
——————–
mdev有一个可以操作的配置文件,当然这个文件的控制权是掌握在设备节点的拥有者手中的,如果你的系统需要更加多的权限,大不了就是root/root 660的权限值。

配置文件的格式:
    <device regex>       <uid>:<gid> <permissions>
 or @<maj[,min1[-min2]]> <uid>:<gid> <permissions>
举例:
    hd[a-z][0-9]* 0:3 660

这个配置文件在第一个匹配段停止解析。如果没有匹配段,默认是0:0 660. 设置你自己的默认匹配段,一般简单的创建你自己的全匹配像下面这样:
    .* 1:1 777

你可以重命名/移除设备节点,使用下一个字段。
    <device regex> <uid>:<gid> <permissions> [=path]
如果你想放置你的设备节点到一个子目录,一定要确定你的路径有一个”/”尾,如果你要重命名设备节点,直接打上名字就行。
    hda 0:3 660 =drives/
这个代码的意思就是将“hda”这个设备节点移动到 drivers/ 这个子目录。
    hdb 0:3 660 =cdrom
这个代码的意思是重命名“hda”为“cdrom”

类似的,“>path” “重命名/移动”设备,但是它也可以创建一个直接的符号链接 /dev/DEVNAME 到“重命名/移动”设备。

应用第四个字段“!”可以阻止设备节点的创建:
    tty[a-z]. 0:0 660 !
    pty[a-z]. 0:0 660 !

如果你想让mdev支持你自己的命令,字段格式为:
    <device regex> <uid>:<gid> <permissions> [=path] [@|$|*<command>]
    or
    <device regex> <uid>:<gid> <permissions> [>path] [@|$|*<command>]
    or
    <device regex> <uid>:<gid> <permissions> [!] [@|$|*<command>]
举例:
—8<—
# block devices
[hs]d[a-z])        root:disk    660    >disk/%1/0
[hs]d[a-z])[0-9]+)    root:disk    660    >disk/%1/%2
mmcblk[0-9]+)        root:disk    660    >disk/mmc/%1/0
mmcblk[0-9]+)p[0-9]+)    root:disk    660    >disk/mmc/%1/%2
# network devices
tun|tap)        root:network    660    >net/%1
—8<—

特殊字符的含义:
@ 在创建设备后运行
$  在移除设备后运行
*   在创建和移除设备后都运行

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

为了你的使用方便,shell的环境变量$MDEV被用来设置设备名。所以,如果一个名叫“hdc“的设备被匹配上,那么MDEV就被设置成”hdc“。

———-
固件
———-

些内核设备驱动为了很好的初始化设备在运行时需要请求固件,将所有的这些固件文件都放到/lib/firmware/这个目录。在运行的时候,内核将通过
固件的文件名调用mdev,mdev将从/lib/firmware/这个目录通过sysfs接口加载到内核。在内核里很难确切编码文件名,当你需要知道
命名用户空间是怎么回事,看看这里。

————
 定序
————
内核不序列化热插拔事件,而是为每一个成功的热插拔调用增加了 SEQNUM 这个环境变量。通常情况下,mdev不在乎这个。这样也许可以重新对热插拔事件进行重调用,典型的症状就是有时某些设备节点不能像期待的那样被创建出来。


管怎么说,如果 /dev/mdev.seq
文件存在,mdev将比较它和SEQNUM的内容,它将重试直到有两个第二,等待他们匹配。如果他们精确的匹配(甚至连”
“都不被允许),或者两个第
二出现,mdev依旧运行,然后它用SEQNUM+1重写/dev/mdev.seq。

IOW:这个用来序列化并发的mdev调用

如果你想要激活这个特性,在设置mdev成为热插拔管理者之前运行”echo >/dev/mdev.seq”。这样就写一个“
”到文件里。

NB:mdev识别/dev/mdev.seq内容时,单一的一个“
”作为一个特例。
IOW:当有两个第二的时候,这个不能让你的第一个热插拔事件停止。


mdev实现U盘或SD卡的自动挂载

 

前面我们说了udev实现U盘或SD卡的自动挂载,在这里我们再说一下怎样用mdev实现这个功能。

 

mdevbusybox中的一个udev管理程序的一个精简版,他也可以实现设备节点的自动创建和设备的自动挂载,只是在实现的过程中有点差异,在发生热插拔时间的时候,mdev是被hotplug直接调用,这时mdev通过环境变量中的 ACTION 和 DEVPATH,来确定此次热插拔事件的动作以及影响了/sys中的那个目录。接着会看看这个目录中是否有dev的属性文件,如果有就利用这些信息为这个设备在/dev 下创建设备节点文件。

 

下面是如何让我们的系统支持mdev

 

1.在使用busybox制作根文件系统的时候,选择支持mdev

 

Linux System Utilities  —>   
           [*] mdev      
           [*]   Support /etc/mdev.conf
           [*]     Support command execution at device addition/removal

 

2.在文件系统添加如下内容

 

Vim /etc/init.d/rcS
        mount -t tmpfs mdev /dev
        mount -t sysfs sysfs /sys
        mkdir /dev/pts
        mount -t devpts devpts /dev/pts

 

echo /sbin/mdev>/proc/sys/kernel/hotplug
        mdev s

 

这些语句的添加在mdev的手册中可以找到。

 

3.添加对热插拔事件的响应,实现U盘和SD卡的自动挂载。

 

Vim /etc/mdev.conf
        mmcblk[0-9]p[0-9] 0:0 666 @ /etc/sd_card_inserting
        mmcblk[0-9] 0:0 666 $ /etc/sd_card_removing
        sd[a-z] [0-9] 0:0 666 @ /etc/usb/usb_inserting
        sd[a-z] 0:0 666 $ /etc/usb/usb_removing

 

红色部分,是一个脚本,脚本内容可以根据我们的需要定制,可以实现挂载,卸载或其他一些功能。

 

如下是自动挂载和卸载的脚本:

 

/etc/sd_card_inserting
        #!/bin/sh
        mount -t vfat /dev/mmcblk0p1 /mnt/sd

 

/etc/sd_card_removing
        #!/bin/sh
        sync
        umount /mnt/sd

 

 


 mdev的使用以及mdev.conf的规则配置–busybox

mdev是busybox下的udev的精简版,适合在嵌入式系统下管理设备

但mdev会把所有的设备文件都动态地创建在/dev/目录下,如果程序使用dev目录子目录下的设备,就必须修改程序,比较麻烦,当然也可以在mdev运行之后,手工创建子目录,然后再用 ln -s 做设备文件的软链接

这里有人作出了更好的脚本处理机制:

http://lists.busybox.net/pipermail/busybox/2007-May/027309.html

再贴上mdev的使用说明

-------------------------------------------

MDEV 入门转)

Busybox-1.7.0/docs/mdev.txt
翻译:tekkamanninja Email: – 1 –

————-
MDEV Primer
MDEV 入门
————-
For those of us who know how to use mdev, a primer might seem lame. For
这份文档对于那些知道如何使用 mdev 的人看来可能有些肤浅。
everyone else, mdev is a weird black box that they hear is awesome, but can’t
但对于其他人,mdev 可能是一个神秘的黑匣子,以至让人敬畏。
seem to get their head around how it works. Thus, a primer.
而这份文档又不足以让他们知道mdev 是如何工作的。 因此,这是一份入门文档。
———–
Basic Use
基本使用方法
———–
Mdev has two primary uses: initial population and dynamic updates. Both
mdev 有两个主要的应用:初始化对象和动态更新。
require sysfs support in the kernel and have it mounted at /sys. For dynamic
两个应用都需要内核 sysfs 的支持,且必须挂载到 /sys 。为了实现动态更新,
updates, you also need to have hotplugging enabled in your kernel.
你还必须在内核配置时增加热插拔支持(hotplugging)。
Here’s a typical code snippet from the init script:
以下是系统初始化脚本中一个典型的使用mdev 的代码片段:
    [1] mount -t sysfs sysfs /sys
    [2] echo /bin/mdev > /proc/sys/kernel/hotplug
    [3] mdev -s

Of course, a more “full” setup would entail executing this before the previous
当然,一个对mdev 更完整的安装还必须在以上代码片段前执行下面的命令:
code snippet:
    [4] mount -t tmpfs mdev /dev
    [5] mkdir /dev/pts
    [6] mount -t devpts devpts /dev/pts

The simple explanation here is that [1] you need to have /sys mounted before
简单说明一下上面的代码:[1]你必须在执行mdev 前挂载 /sys 。
executing mdev. Then you [2] instruct the kernel to execute /bin/mdev whenever
随后你 [2] 命令内核在增删设备时执行 /bin/mdev ,
a device is added or removed so that the device node can be created or
使设备节点文件会被创建和删除。
destroyed. Then you [3] seed /dev with all the device nodes that were created
最后你 [3] 设置mdev,让它在系统启动时创建所有的设备节点。
while the system was booting.
For the “full” setup, you want to [4] make sure /dev is a tmpfs filesystem
而对mdev 更完整的安装,你必须[4]确保 /dev 是 tmpfs 文件系统
assuming you’re running out of flash). Then you want to [5] create the
假设文件系统在 flash 外运行)。 而且你必须 [5] 创建

————-
MDEV Config /etc/mdev.conf)
MDEV 配置 /etc/mdev.conf)
————-
Mdev has an optional config file for controlling ownership/permissions of
device nodes if your system needs something more than the default root/root
660 permissions.
如果你的系统需要一些比默认的 root/root 660 更多的权限,
你可以使用 mdev 的可选配置文件,以控制设备节点的 所有者 和 权限。
The file has the format:
这个文件的格式如下:
    <device regex> <uid>:<gid> <octal permissions>
For example:
例如:
    hd[a-z][0-9]* 0:3 660
The config file parsing stops at the first matching line. If no line is
这个配置文件在第一个匹配行处停止解析。 如果没有匹配行,
matched, then the default of 0:0 660 is used. To set your own default, simply
那么就使用默认的 0:0 660 。 你也可以通过在最后创建如下的全匹配
create your own total match like so:
行,来设置你自己的默认设置:
    .* 1:1 777
If you also enable support for executing your own commands, then the file has
如果你想 mdev 在找到匹配行时可以执行自定义的命令,那么文件格式如下:
the format:
    <device regex> <uid>:<gid> <octal permissions> [<@|$|*> <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.
    * 在创建设备节点后和删除设备节点前都运行命令。
The command is executed via the system) function which means you’re giving a
这些命令是通过系统函数(system))执行的(也就是说你在对shell 下命令)
command to the shell), so make sure you have a shell installed at /bin/sh.
,所以请确保你已在 /bin/sh 安装了shell。
For your convenience, the shell env var $MDEV is set to the device name. So if
为了方便,shell 的环境变量 $MDEV 会被设置成设备名。 例如
the device ‘hdc’ was matched, MDEV would be set to “hdc”.
mdev 解析到设备 ‘hdc’ 匹配,MDEV 将会被设置为 “hdc”。

———-
FIRMWARE
固件
———-
Some kernel device drivers need to request firmware at runtime in order to
有些设备驱动程序在运行时,为了正确的初始化设备,需要上传固件。
properly initialize a device. Place all such firmware files into the
请将所有的固件文件放入
/lib/firmware/ directory. At runtime, the kernel will invoke mdev with the
/lib/firmware/ 目录。 在运行时,内核将会按固件文件名调用 mdev ,
filename of the firmware which mdev will load out of /lib/firmware/ and into
之后 mdev 会通过 sysfs 接口将固件从 /lib/firmware/
the kernel via the sysfs interface. The exact filename is hardcoded in the
装载到内核。 确定的文件名被固化在内核中,
kernel, so look there if you need to want to know what to name the file in
如有必要,你必须知道如何在用户空间命名这个文件。
userspace.

# cat /etc/mdev.conf

# system all-writable devices
full            0:0     0666
null            0:0     0666
ptmx            0:0     0666
random          0:0     0666
tty             0:0     0666
zero            0:0     0666

# console devices
tty[0-9]*       0:5     0660
vc/[0-9]*       0:5     0660

# serial port devices
s3c2410_serial0 0:5     0666    =ttySAC0
s3c2410_serial1 0:5     0666    =ttySAC1
s3c2410_serial2 0:5     0666    =ttySAC2
s3c2410_serial3 0:5     0666    =ttySAC3

# loop devices
loop[0-9]*      0:0     0660    =loop/

# i2c devices
i2c-0           0:0     0666    =i2c/0
i2c-1           0:0     0666    =i2c/1

# frame buffer devices
fb[0-9]         0:0     0666

# input devices
mice            0:0     0660    =input/
mouse.*         0:0     0660    =input/
event.*         0:0     0660    =input/
ts.*            0:0     0660    =input/

# rtc devices
rtc0            0:0     0644    >rtc
rtc[1-9]        0:0     0644

# misc devices
mmcblk0p1       0:0     0600    =sdcard  */bin/hotplug.sh
sda1            0:0     0600    =udisk   * /bin/hotplug.sh
vntwpa          1:1     777              * /bin/ltls.sh  //$MDEV 参数 为”usb-wifi” vntwpa  执行脚本ltls.sh
# .*            1:1     777              * /bin/ltls.sh

1-1.*           1:1     777              * /bin/llll

[root@FriendlyARM /mnt]# cat ltls.sh
#!/bin/sh

echo $MDEV    >  /dev/ttySAC0  // 有变化的设备 会在/dev产生 相应设备 如:1-1.1 /sys 下class或block下也会变化

echo $ACTION    >  /dev/ttySAC0 // 设备状态”remove”   “add”

#echo  – n  “enter your name:”
#read name


#echo “ltls  ”  > /dev/ttySACO
if [ “$MDEV” = “vntwpa” ];then
        /bin/wifi-ltls
        echo “going to vntwpa ” > /dev/ttySAC0
fi

 


 

linux中的热插拔和mdev机制

mdev是busybox自带的一个简化版的udev
    作用是在系统启动和热插拔 或动态加载驱动程序时,自动产生驱动程序所需的节点文件,在文件系统中的/dev目录下的设备节点都是由mdev创建的
    mdev扫描/sys/class和/sys/block中所有的类设备目录,如果在目录中含有名为”dev”的文件,且文件中包含的是设备号,则mdev就利用这些信息为这个设备在/dev下创建设备节点

用法:
1. 执行mdev前要挂载 /sys
mount -t tmpfs mdev /dev
mount -t sysfs sysfs /sys

 
2.命令内核在增删设备时执行/sbin/mdev,使设备节点会被创建和删除
echo /sbin/mdev > /proc/sys/kernel/hotplug

 
3.设置mdev,让它在系统启动时创建所有的设备节点
mdev -s

关于热插拔:
需要内核中支持hotplug

编写mdev配置文件:/etc/mdev.conf
该文件的作用是:mdev在找到匹配设备时自动执行自定义命令
格式为:
<device regex> <uid>:<gid> <octal permissions> [<@$*><cmd>]
@ 创建节点后执行的
$ 删除节点前执行的
* 创建后和删除前都运行的

 
如自动挂载U盘和SD卡脚本:

sd[a-z][0-9]  0:0 0660  @/etc/hotplug/usb/udisk_insert

sd[a-z]       0:0 0660  $/etc/hotplug/usb/udisk_remove

mmcblk[0-9]p[0-9]  0:0 0660  @/etc/hotplug/sd/sd_insert

mmcblk[0-9]        0:0 0660  $/etc/hotplug/sd/sd_remove

当检测到类似sda1这样的设备时,执行/etc/hotplug/usb里的脚本,脚本的内容就是挂载和卸载U盘
当检测到类似mmcblk0p1这样的设备时,执行/etc/hotplug/sd里的脚本,脚本的内容就是挂载和卸载SD卡

 


 mdev是busybox中的一个udev管理程序的一
个精简版,他也可以实现设备节点的自动创建和设备的自动挂载,只是在实现的过程中有点差异,在发生热插拔时间的时候,mdev是被hotplug直接调
用,这时mdev通过环境变量中的 ACTION 和
DEVPATH,来确定此次热插拔事件的动作以及影响了/sys中的那个目录。接着会看看这个目录中是否有“dev”的属性文件,如果有就利用这些信息为
这个设备在/dev 下创建设备节点文件。

下面是如何让我们的系统支持mdev。
1.在使用busybox制作根文件系统的时候,选择支持mdev
Linux System Utilities  —>   
           [*] mdev      
           [*]   Support /etc/mdev.conf
           [*]     Support command execution at device addition/removal

2.在文件系统添加如下内容
Vim /etc/init.d/rcS
        mount -t tmpfs mdev /dev 
        mount -t sysfs sysfs /sys
        mkdir /dev/pts
        mount -t devpts devpts /dev/pts

echo /sbin/mdev>/proc/sys/kernel/hotplug
        mdev –s

这些语句的添加在mdev的手册中可以找到。
3.添加对热插拔事件的响应,实现U盘和SD卡的自动挂载。
Vim /etc/mdev.conf
        mmcblk[0-9]p[0-9] 0:0 666 @ 
/etc/sd_card_inserting
        mmcblk[0-9] 0:0 666 $ 
/etc/sd_card_removing
        sd[a-z] [0-9] 0:0 666 @ /etc/usb/usb_inserting
        sd[a-z] 0:0 666 $ /etc/usb/usb_removing

红色部分,是一个脚本,脚本内容可以根据我们的需要定制,可以实现挂载,卸载或其他一些功能。
如下是自动挂载和卸载的脚本:
/etc/sd_card_inserting
        #!/bin/sh
        mount -t vfat /dev/mmcblk0p1 /mnt/sd

/etc/sd_card_removing
        #!/bin/sh
        sync
        umount /mnt/sd


 

在网上有很多关于讲mdev的自动挂载基本上都是一个版 本,经过测试自动挂载确实可行,但是关于自动卸载mdev似乎不能很好的支持,经过修改已经可以做到与udev的效果相似。不能在挂载的目录中进行热插 拔,否则会出现问题,不过此问题在下次插入U盘时不会造成影响,可能对U盘有损坏。

本文介绍了mdev与udev两种方法来实现自动挂载,读者可根据需要任选其一即可。

        首先介绍一下mdev与udev之间的关系:

        mdev是busybox中的一个udev管理程序的一个精简版,他也可以实现设备节点的自动创建和设备的自动挂载,只是在实现的过程中有点差异,在发生 热插拔时间的时候,mdev是被hotplug直接调用,这时mdev通过环境变量中的 ACTION 和 DEVPATH,来确定此次热插拔事件的动作以及影响了/sys中的那个目录。接着会看看这个目录中是否有“dev”的属性文件,如果有就利用这些信息为 这个设备在/dev 下创建设备节点文件。

 

 

/***********************************************************************************************************************************************************************************/

1.mdev支持

①用busybox制作根文件系统的时候,要选择支持mdev机制

Linux System Utilities  —>   
           [*] mdev      
           [*]   Support /etc/mdev.conf
           [*]     Support command execution at device addition/removal

②在文件系统/etc/init.d/rsC文件中添加如下内容

Vi  /etc/init.d/rcS
        mount -t tmpfs mdev /dev
        mount -t sysfs sysfs /sys
        mkdir /dev/pts
        mount -t devpts devpts /dev/pts

        echo /sbin/mdev>/proc/sys/kernel/hotplug
        mdev –s

这些语句的添加在busybox的/doc/mdev.txt中可以找到。

 

③添加对热插拔事件的响应,实现U盘和SD卡的自动挂载。

Vi /etc/mdev.conf
       sd[a-z][0-9]      0:0 666        @/etc/mdev/udisk_insert                        

         sd[a-z]                   0:0 666          $/etc/mdev/udisk_remove

红色部分,是一个脚本,脚本内容可以根据我们的需要定制,可以实现挂载,卸载或其他一些功能。

注:@表示是在插入(创建设备结点)后执行后面的脚本,$表示在拔出(删除设备结点)前执行后面的脚本。

如下是自动挂载和卸载的脚本名称及其内容:

#!/bin/sh

if [ -d /sys/block/*/$MDEV ]  ; then

  mkdir -p /media/$MDEV

  mount /dev/$MDEV /media/$MDEV 

fi

根文件系统中的etc/mdev/udisk_remove文件内容:

        #!/bin/sh
        umount -l /media/$MDEV
        rm -rf /media/$MDEV
 
        #!/bin/sh
        umount -l /media/sd*
        rm -rf /media/sd*

修改为红色部分后能够自动挂载

以上两个脚本需要可执行权限:chmod +x  /etc/mdev/udisk_insert

               chmod +x etc/mdev/udisk_remove

/***********************************************************************************************************************************************************************************/

2.udev支持 

        linux传统上使用静态设备创建的方法,在dev下创建了大量的节点,而不管这些节点相应的硬件设备是否存在。采用udev的方法,系统检测到设备才会去创建这些设备对应的节点。

        这里我们简单的说一下udev的工作原理:

        udev是依赖于
sysfs的,当系统中添加一个新的设备后,内核检测到后就会产生一个hotplug
event并查找/proc/sys/kernel/hotplug去找出管理设备连接的用户空间程序,若udev已经启动,内核会通知udev去检测
sysfs中关于这个新设备的信息并创建设备节点。如/dev/vcs,在/sys/class/tty/vcs/dev存放的是”7:0”,既/dev
/vcs的主次设备号。并且udev还会根据/etc/udev/rules.d中的规则文件实现一些相应的功能。

下面我们介绍一下如何实现设备节点的自动创建及u盘或sd卡的自动挂载。

因为文件系统中默认是没有对udev进行支持的,所以我们移植一个udev。

1.下载udev源码udev-100.tar.bz2,并解压

网址:http://www.us.kernel.org/pub/linux/utils/kernel/hotplug

2.交叉编译。

修改makefile,具体修改如下:

        cross = arm-linux-

保存退出。

然后执行命令:make 进行编译,然后执行arm-linux-strip udev udevd udevstart udevinfo udevtest,并拷贝这些文件到目标板根文件/bin目录下面。

3.添加udev的支持

下面三种方法功能相同

        1)并修改etc/init.d/rcs脚本,然后添加如下命令:

        /bin/mount -t sysfs sysfs /sys 

        /bin/mount -t tmpfs tmpfs /dev

        /bin/udevd –daemon

        /bin/udevstart

        2)如果linuxrc是二进制文件的话 

        rm /linuxrc

        vi /linuxrc

        添加如下内容

        /bin/mount -t sysfs sysfs /sys

        /bin/mount -t tmpfs tmpfs /dev

        /bin/udevd –daemon

        /bin/udevstart

        exec /sbin/init

        3)修改/etc/fstab为

        #device mount-point type options dump fsck order

        proc /proc proc defaults 0 0

        tmpfs /tmp tmpfs defaults 0 0

        sysfs /sys sysfs defaults 0 0

        tmpfs /dev tmpfs defaults 0 0

        修改/etc/init.d/rcs,添加如下内容

/bin/udevd –daemon

/bin/udevstart

        重新启动系统,文件系统就能够自动创建节点。

 

4.在/etc下创建udev目录

5.在/etc/udev下穿件目录rules.d和文件udev.conf

6.在udev.conf中添加如下内容

# udev.conf

        # the initial syslog3) priority: “err”, “info”, “debug” or its

        # numerical equivalent. for runtime debugging, the daemons internal

        # state can be changed with: “udevcontrol log_priority=<value>”.

        udev_log=”err”

7.在rules.d下创建规则文件

如实现u盘自动挂载

        vim 11-add-usb.rules

添加如下内容

        action!=”add”,goto=”farsight”

        kernel==”sd[a-z][0-9]”,run+=”/sbin/mount-usb.sh %k”

        label=”farsight”

这个文件中action后是说明是什么事件,kernel
后是说明是什么设备比如sda1,mmcblk0p1等,run这个设备插入后去执行哪个程序%k是传入这个程序的参数,这里%k=kernel的值也就
是sda1等http://www.woaidiannao.com。

在/sbin/下创建mount-usb.sh文件添加如下内容 计算机

        #!/bin/sh

        /bin/mount -t vfat /dev/$1 /tmp

        sync

修改文件权限为其添加可执行的权限。

这样就实现了u盘的自动挂载,下面附上u盘的卸载规则文件和sd卡的文件

usb卸载

11-add-remove.rules

        action !=”remove”,goto=”farsight”

        subsystem!=”block”,goto=”farsight”

        kernel==”sd[a-z][0-9]”,run+=”/sbin/umount-usb.sh”

        label=”farsight”

umount-usb.sh

        #!/bin/sh

        sync

        umount /tmp/

sd卡挂载

12-add-sd.rules

action!=”add”,goto=”farsight”

        kernel==”mmcblk[0-9]p[0-9]”,run+=”/sbin/mount-sd.sh %k”

        label=”farsight”

mount-sd.sh

        #!/bin/sh

        /bin/mount -t vfat /dev/$1 /tmp

        sync

 

sd卸载

12-remove-sd.rules

        action !=”remove”,goto=”farsight”

        subsystem!=”block”,goto=”farsight”

        kernel==”mmcblk*”,run+=”/sbin/umount-sd.sh”

        label=”farsight”

umount-sd.sh

        #!/bin/sh

        sync

        /bin/umount /tmp/

 


 udev 文件系统制作

udev 文件系统制作
第一、什么是udev?

这篇文章UDEV Primer给我们娓娓道来,花点时间预习一下是值得的。当然,不知道udev是什么也没关系,
把它当个助记符好了,有了下面的上路指南,可以节省很多时间。我们只需要树立一个信念:udev很简单!
嵌入式的udev应用尤其简单。

第二、为什么udev要取代devfs?

这是生产关系适应生产力的需要,udev好,devfs坏,用好的不用坏的。

udev是硬件平台无关的,属于user space的进程,它脱离驱动层的关联而建立在操作系统之上,基于这种设
计实现,我们可以随时修改及删除/dev下的设备文件名称和指向,随心所欲地按照我们的愿望安排和管理设
备文件系统,而完成如此灵活的功能只需要简单地修改udev的配置文件即可,无需重新启动操作系统。udev
已经使得我们对设备的管理如探囊取物般轻松自如。

第三、如何得到udev?

udev的主页在这里:http://www.kernel.org/pub/linux/utils/kernel/hotplug/udev.html
我们按照下面的步骤来生成udev的工具程序,以arm-linux为例:

1、 下载最新的udev
     wget http://www.us.kernel.org/pub/linux/utils/kernel/hotplug/udev-113.tar.bz2
     或其他的方法下载udev-113.tar.bz2 。

2、解压udev-113.tar.bz2
    tar jxvf udev-113.tar.bz2

3、修改Makefile
    cd   udev-113
    编辑Makefile,查找CROSS_COMPILE,修改CROSS_COMPILE ?= arm-linux-

4、编译(交叉编译器要用2.95.3以上的,不然可能编译过不去。我用的是3.4.1)
    export PATH=/usr/local/arm/3.4.1/bin:$PATH
    make

    没有什么意外的话当前目录下生成udev,udevcontrol,udevd,udevinfo,udevmonitor,udevsettle,udevstart,
    udevtest,udevtrigger九个工具程序,在嵌入式系统里,我们只需要udevd和udevstart就能使udev工作得很好,
    其他工具则帮助我们完成udev的信息察看、事件捕捉或者更高级的操作。

5、看看用到了哪共享些库
    arm-linux-readelf -a udevstart | grep “Shared library”
    ———————————————————————————-
    eg:
    [root@localhost udev-113]# arm-linux-readelf -a udevstart | grep “Shared library”
     0x00000001 NEEDED)                      Shared library: [libc.so.6]
    ———————————————————————————-
    说明用到了libc.so的库,所以要把 libc.so 和 libc.so.6 库拷贝到文件系统的/lib目录.
   其它共享库,用同样方法只是把arm-linux-readelf -a udevstart | grep “Shared library”中的
    udevstart 改成 别的文件名。

6、拷贝相应的共享库到/lib目录(共享库指交叉编译器的库在本文用到的库在 /usr/local/arm/3.4.1).
    /lib是你建的文件系统的目录,不是你的电脑的/lib。提醒下就怕新手盲目乱做。)

ld-2.3.2.so   ld-linux.so.2   libc.so.6   libc.so   libc-2.3.2.so
  

第四、如何配置udev?

首先,udev需要内核sysfs和tmpfs的支持,sysfs为udev提供设备入口和uevent通道,tmpfs为udev设备文件提
供存放空间,也就是说,在上电之前系统上是没有足够的设备文件可用的,我们需要一些技巧让kernel先引导
起来。

于在kernel启动未完成以前我们的设备文件不可用,如果使用mtd设备作为rootfs的挂载点,这个时候/dev/mtdblock
这个设备目录是不存在的,我们无法让kernel通过/dev/mtdblock/X这样的设备找到rootfs,kernel只好停在那里惊慌。
这个问题我们可以通过给kernel传递设备号的方式来解决,在linux系统中,mtdblock的主设备号是31,part号
从0开始,那么以前的/dev/mtdblock/3就等同于31:03,以次类推,所以我们只需要修改bootloader传给kernel
的cmd line参数,使root=31:03,就可以让kernel在udevd未起来之前成功的找到rootfs。

另外一种方法就是给kernel传递未经归类的设备文件名,在udev未创建之前,所有的设备实际上已经通过sysfs
建立,mtdblockX的位置相对于/sys/block/mtdblockX/dev,这个文件里存放着mtdblockX的设备号,形式与上
一种方式相同。这时由于没有相应的udev规则,所有的设备都被隐含地映射到/dev目录下,mtdblockX对应于
/dev/mtdbockX,这样我们给kernel传递root=/dev/mtdblock3,kernel发现/dev没有被建立,就自动从映射表里
查找对应关系,最后取出/sys/block/mtdblockX/dev里的设备号,完成rootfs的挂载。

O.K.下一个问题。

其次,需要做的工作就是重新生成rootfs。
      1.把udevd和udevstart,test-udev,udevcontrol,udevtrigger,
         udevinfo,udevmonitor,udevsettle,udevtest复制到/sbin目录。
      2. 然后我们需要在/etc/下为udev 建立设备规则

        建立设备规则是udev最为复杂的一步。这篇文章提供了最完整的指导:Writing udev rules
        文中描述的复杂规则我们可以暂时不用去理会,上路指南将带领我们轻松穿过这片迷雾。
        这里提供一个由简入繁的方法,对于嵌入式系统,这样做可以一劳永逸。

1、在前面用到的udev-113目录里,有一个etc目录,里面放着的udev目录包含了udev设备规则的详细样例文
本。为了简单而又简洁,我们只需要用到etc/udev/udev.conf这个文件,在我们的rootfs/etc下建立一个udev目
录,把它复制过去,这个文件很简单,除了注释只有一行,是用来配置日志信息的,嵌入式系统也许用不上
日志,但是udevd需要检查这个文件。

2、在rootfs/etc/udev下建立一个rules.d目录.
         mkdir   -p   rootfs/etc/udev/rules.d      
  
    生成一个空的配置文件
        touch etc/udev/rules.d/udev.rules。

3. 然后在rootfs/etc/udev/目录下新建udev.conf文件。
     
      touch etc/udev/udev.conf

     然后 我们来编辑这个文件并向它写入以下配置项:

###############################################
udev_root=”/dev/”
udev_rules=”/etc/udev/rules.d/”
udev_log=”err”

# vc devices
KERNEL==”tty[0-9]*”, NAME=”vc/%n”

# block devices
KERNEL==”loop[0-9]*”, NAME=”loop/%n”

# mtd devices
KERNEL==”mtd[0-9]*”, NAME=”mtd/%n”
KERNEL==”mtdblock*”, NAME=”mtdblock/%n”

# input devices
KERNEL==”mice” NAME=”input/%k”
KERNEL==”mouse[0-9]*”, NAME=”input/%k”
KERNEL==”ts[0-9]*”, NAME=”input/%k”
KERNEL==”event[0-9]*”, NAME=”input/%k”

# misc devices
KERNEL==”apm_bios”, NAME=”misc/%k”
KERNEL==”rtc”, NAME=”misc/%k”
################################################

        保存它为 udev.conf,注意: udev.conf的位置是rootfs/etc/udev/udev.conf
        我们的设备文件系统基本上就可以了,udevd和udevstart会自动分析这个文件。

4、   为了使udevd在kernel起来后能够自动运行,我们在rootfs/etc/init.d/rcS中增加以下几行:

##################################
/bin/mount -t tmpfs tmpfs /dev
         /bin/mount -t sysfs sysfs /sys
      
         #挂载/proc为proc文件系统
echo “mount /proc as proc”
/bin/mount -n -t   proc none /proc

echo “Starting udevd…”
/sbin/udevd –daemon
/sbin/udevstart
##################################

5、   还有一点就是别忘要在/dev下手工建console和null等设备。
      cd /dev
      mknod -m 660 console c 5 1
      mknod -m 660 null     c 1 3

6、   重新生成rootfs,烧写到flash指定的rootfs part中。

7、   如果需要动态改变设备规则,可以把etc/udev 放到jffs或yaffs part,以备修改,根据需求而定,可以随时扩
      充udev.conf中的配置项。

8、生成文件系统。(不同的板子,和文件系统,或目录不同,下面的方法不是通用的根据个人情况改下。)
    ./mkfs.jffs2 -p -l -e 0x20000 -n -v -r /data/rootfs2.6/ -o filesys.jffs2

支持热拔插。
echo /sbin/mdev > /proc/sys/kernel/hotplug

==================================================================================
    我的rcS文件
==================================================================================
#! /bin/sh

PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin:
runlevel=S
prevlevel=N
umask 022
export PATH runlevel prevlevel

#
# Trap CTRL-C &c only in this shell so we can interrupt subprocesses.
#
trap “:” INT QUIT TSTP

HOSTNAME=OMAP5912OSK
hostname $HOSTNAME
echo “”
echo “******************************************”
echo “Starting System Init for $HOSTNAME”
echo “******************************************”

# goto the init.d directory
cd /etc/init.d

# Mount the default file systems
mount -a # Mount the default file systems

/bin/mount -t tmpfs tmpfs /dev
/bin/mount -t sysfs sysfs /sys

echo “Starting udevd…”
/sbin/udevd –daemon
/sbin/udevstart

/etc/rc.d/init.d/netd start
/etc/rc.d/init.d/httpd start

/sbin/ifconfig lo 127.0.0.1
/sbin/ifconfig eth0 192.168.0.2 up

Published by

风君子

独自遨游何稽首 揭天掀地慰生平

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注