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

笔记性质的文章。

其实,我是想在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脚本内容及解释:
#!/bin/sh

# 为了方便,shell 的环境变量 $MDEV 会被设置成设备名。 例如 the device 'hdc' was matched, MDEV would be set to "hdc"
case $MDEV in
    udisk | sda1)
            DEVNAME=udisk
            MOUNTPOINT=/udisk
            ;;
    sdcard | mmcblk0p1)
            DEVNAME=sdcard
            MOUNTPOINT=/sdcard
            ;;
    *)
            exit 0
            ;;
esac

# 若不存在/dev/null节点,创建之
test ! -c /dev/null && mknod -m 0666 /dev/null c 1 3

# 热插拔实现原理及过程:
#  在/etc/init.d/rcS文件中有句:echo /sbin/mdev > /proc/sys/kernel/hotplug
#  那么当有热插拔事件产生时,内核就会调用位于/sbin目录的mdev
#  这时mdev通过环境变量中的 ACTION 和DEVPATH(这两个变量是系统自带的)来确定此次热插拔事件的动作以及影响了/sys中的那个目录
#  接着会看看这个目录中是否有“dev”的属性文件,如果有就利用这些信息为这个设备在/dev 下创建设备节点文件。
case $ACTION in
    remove)
            /bin/umount $MOUNTPOINT || true
            rmdir $MOUNTPOINT >/dev/null 2>&1 || true
            ;;
    *)
            /bin/mkdir $MOUNTPOINT > /dev/null 2>&1 || true
            /bin/mount -t vfat -o codepage=936 -o iocharset=utf8 -o sync -o noatime -o nodiratime /dev/$DEVNAME $MOUNTPOINT > /dev/null 2>&1 || true
            ;;
esac

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>]

特殊字符的意义如下:
    @ 在创建设备节点后运行命令。
    $ 在删除设备节点前运行命令。
    * 在创建设备节点后和删除设备节点前都运行命令。
比如:
sd[a-z]*[0-9] 0:0 0660 @(mount /dev/$MDEV /udisk)
sd[a-z]*[0-9] 0:0 0660 *(umount /udisk)

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

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。