ARM-Linux支持并自动挂载U盘

受不了xxxx恶心人的行为,遂搬迁至博客园。
始发:2015-04-07 19:10:42

  

其实,我是想在ARM开发板上实现我的FW150US-USB无线网卡功能,所以测试下USB接口。

1、配置内核

Device Drivers --->
        SCSI device support --->
                <*> SCSI device support
                [*] legacy /proc/scsi/ support
                <*> SCSI disk support
                <*> SCSI tap support
                <*> SCSI CDROM support
        [*] USB support --->
                <*> Support for Host-side USB
                [*] USB device filesystem
                <*> OHCI HCD support
                <*> USB Mass Storage support
 
File Systems --->
        DOS/FAT/NT  Filesystems --->
                <*>VFAT (Windows-95) fs support
                (936) Default codepage for FAT
                (iso8859-1)Default iocharater for FAT

2、烧写内核并加载

[root@lnx /]# ls /dev/

插入U盘后会发现该目录下多了sda1(对于有的U盘,并不是这个名字,所以在自动加载脚本里要注意区别对待)节点,这个就是我们系统识别到U盘后分配的。

3、手动挂载U盘到指定目录/udisk

[root@lnx /]# mount /dev/sda1 /udisk/
[root@lnx /]# 
[root@lnx /]# ls /udisk/
images      images____
 
完了之后,卸载之:
[root@lnx /]# umount /udisk/

4、自动挂在U盘实现及脚本分析

/etc/mdev.conf 文件中添加如下语句:

sda1            0:0     0600    =udisk */bin/hotplug_usb.sh

如果无法确认是否是[sda1(默认是这个)],使用正则表达式自动匹配:

sd[a-z]*[0-9]   0:0     0600    =udisk */bin/hotplug_usb.sh

  

至于为何这么写,参见结尾处关于配置文件mdev.comn

hotplug_usb.sh脚本内容及解释:

 1 #!/bin/sh
 2  
 3 # 为了方便,shell 的环境变量 $MDEV 会被设置成设备名。 例如 the device 'hdc' was matched, MDEV would be set to "hdc"
 4 case $MDEV in
 5     udisk | sda1)
 6             DEVNAME=udisk
 7             MOUNTPOINT=/udisk
 8             ;;
 9     sdcard | mmcblk0p1)
10             DEVNAME=sdcard
11             MOUNTPOINT=/sdcard
12             ;;
13     *)
14             exit 0
15             ;;
16 esac
17 
18 # 若不存在/dev/null节点,创建之
19 test ! -c /dev/null && mknod -m 0666 /dev/null c 1 3
20 
21 # 热插拔实现原理及过程:
22 #  在/etc/init.d/rcS文件中有句:echo /sbin/mdev > /proc/sys/kernel/hotplug
23 #  那么当有热插拔事件产生时,内核就会调用位于/sbin目录的mdev
24 #  这时mdev通过环境变量中的 ACTION 和 DEVPATH(这两个变量是系统自带的)来确定此次热插拔事件的动作以及影响了/sys 中的哪个目录
25 #  接着会看看这个目录中是否有“dev”的属性文件,如果有就利用这些信息为这个设备在/dev 下创建设备节点文件。
26 case $ACTION in
27     remove)
28             /bin/umount $MOUNTPOINT || true
29             rmdir $MOUNTPOINT >/dev/null 2>&1 || true
30             ;;
31     *)
32             /bin/mkdir $MOUNTPOINT > /dev/null 2>&1 || true
33             /bin/mount -t vfat -o codepage=936 -o iocharset=utf8 -o sync -o noatime -o nodiratime /dev/$DEVNAME $MOUNTPOINT > /dev/null 2>&1 || true
34             ;;
35 esac
36  
37 exit 0

PS:关于 mdev.conf 文件

/etc/mdev.conf 是mdev 的配置文件,用来控制设备节点的 ownership/permissions。如果不使用该文件,系统默认 root/root 660 权限。

该文件的格式为:

[-]<device regex> <uid>:<gid> <permissions>

或者

@<maj[,min1[-min2]]> <uid>:<gid> <permissions>

或者

$envvar=<regex> <uid>:<gid> <permissions>

比如:

hd[a-z][0-9]* 0:3 660

如果我们想把节点移动到另一个目录或者重命名该节点,则配置格式:

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

比如:

hda 0:3 660 =drives/

这样“ hda ”就被移动到drives/子目录里面

而:

hdb 0:3 660 =cdrom

就把“ hdb ”重命名成“ cdrom”

如果你想 mdev 在找到匹配行时可以执行自定义的命令,那么文件格式如下:

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

特殊字符的意义如下:

@ 在创建设备节点后运行命令。

$ 在删除设备节点前运行命令。

* 在创建设备节点后和删除设备节点前都运行命令。

比如:

1 sd[a-z]*[0-9] 0:0 0660 @(mount /dev/$MDEV /udisk)
2 sd[a-z]*[0-9] 0:0 0660 *(umount /udisk)

PPS:

Device or resource busy 表示设备忙,可能设备已经被用了,比如已经完成了挂载。