Chinaunix首页 | 论坛 | 博客
  • 博客访问: 420579
  • 博文数量: 117
  • 博客积分: 3003
  • 博客等级: 中校
  • 技术积分: 1221
  • 用 户 组: 普通用户
  • 注册时间: 2010-08-16 14:11
文章分类

全部博文(117)

文章存档

2011年(7)

2010年(110)

我的朋友

分类: LINUX

2010-08-25 14:23:01

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规则实现可移动设备(U盘,SD卡)自动挂载的例子,它的功能和mini2440文件系统中/sbin/hotplug类似,只是用 shell脚本实现。这个脚本来自互联网,借此希望给各位一些设备挂载和hotplug的概念,欢迎各位加入讨论这个话题。

要使用automount.sh脚本,你需要
1. 在/etc/mdev.conf的最后加入下面两行。注意,因为mdev在匹配规则时总是用第一个匹配到的规则,因此新加入的规则不会影响原来对于SD卡和U盘的处理,只是增加了对于原来不支持的情况,比如没有分区表或超过一个分区时候的处理。

  1. #automount
  2. mmcblk[0-9]*    0:0    0600    */sbin/automount.sh $MDEV
  3. sd[a-z][0-9]*    0:0    0600    */sbin/automount.sh $MDEV


可 以看到,当SD卡或U盘插入/拔出时,mdev都会自动调用/sbin/automount.sh脚本。传入脚本的参数是环境变量MDEV的值,根据 busybox源代码目录下docs/mdev.txt中的描述,这个环境变量的值是当前发生变化的设备名称,也就是像"mmcblk0"或 者"sda2"这样的设备名称。

2. 在/sbin目录下添加automount.sh脚本,内容如下:
  1. #from http://clc168.blogspot.com/2008/04/arm-embedded-linuxautomount.html
  2. #! /bin/sh
  3. if [ "$1" == "" ]; then
  4.     echo "parameter is none" > /tmp/error.txt
  5.     exit 1
  6. fi
  7. mounted=`mount | grep $1 | wc -l`

  8. # mounted, assume we umount
  9. if [ $mounted -ge 1 ]; then
  10.     echo "R/media/$1" >> /tmp/usbmnt.log
  11.     echo "R/media/$1" > /tmp/fifo.1

  12.     if ! umount "/media/$1"; then
  13.         exit 1
  14.     fi

  15.     if ! rmdir "/media/$1"; then
  16.         exit 1
  17.     fi
  18. # not mounted, lets mount under /media
  19. else
  20.     if ! mkdir -p "/media/$1"; then
  21.         exit 1
  22.     fi

  23.     if ! mount "/dev/$1" "/media/$1" 2>> /tmp/error.txt ; then
  24.     # failed to mount, clean up mountpoint
  25.         if ! rmdir "/media/$1"; then
  26.             exit 1
  27.         fi
  28.         exit 1
  29.     fi

  30.     echo "A/media/$1" >> /tmp/usbmnt.log
  31.     echo "A/media/$1" > /tmp/fifo.1

  32. fi

  33. exit 0

阅读(1754) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~