使用mdev自动mount和umount tf卡

来源:互联网 发布:java接收json数据 编辑:程序博客网 时间:2024/06/06 04:44

需求很简单,就是在热插拔tf卡时,不需要手动mount和Umount。


先列出网上很多转载的方法,虽然在我这是失效的。

编辑/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
编辑/etc/sd_card_inserting
#!/bin/sh
mount -t vfat /dev/mmcblk0p1 /mnt/sd
编辑/etc/sd_card_removing
#!/bin/sh
sync
umount /mnt/sd

在实际操作中,由于我的系统插入tf卡后产生的是mmcblk0而不是mmcblk0p0,所以对mdev.conf加以修改:

mmcblk[0-9] 0:0 666 @ /etc/sd_card_inserting
        mmcblk 0:0 666 $ /etc/sd_card_removing

结果是插入tf卡时能够mount,拔出时却不能Umount。

查看busybox目录中的mdev.txt,确定第二行的写法是错误的。

mdev.conf每一行的完整格式是:

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

第一列为设备的正则匹配表达式,mmcblk[0-9]代表mmcblk0-mmcblk9,所以设备插入时能mount,而第二行的mmcblk只能代表mmcblk,所以拔出tf卡时无法Umount。

继续修改mdev.conf:

mmcblk[0-9] 0:0 666 @ /etc/sd_card_inserting
        mmcblk[0-9] 0:0 666 $ /etc/sd_card_removing

结果仍然是能mount但不能Umount,没有时间去阅读busybox的源码,查阅mdev.txt看到一句话“the config file parsing stops at the first matching line”,意思是解析配置文件时在第一个匹配行就停止了,所以第二行根本就不起作用,于是再次对mdev.conf修改:

mmcblk[0-9] 0:0 666 * /etc/sd_card_automount

编辑sd_card_automount:

if [ "$ACTION" = remove ] ; then
        echo "Umount /mnt/tfcard"
        umount /mnt/tfcard
else if [ "$ACTION" = add] ; then
        echo "Mount /dev/mmcblk0"
        mount -n /dev/$MDEV /mnt/tfcard
fi

结果再次悲催,但也不是没有进步,问题出在系统启动过程中,使用mdev -s命令创建/dev/mmcblk0时,并没有跟着mount tf卡,但是在后来的系统正常运行中热插拔tf卡时是可以自动mount和Umount的。于是在sd_card_automount加入打印信息,发现使用mdev -s后被调用的sd_card_automount中,$ACTION为空,难怪不能自动mount,于是修改sd_card_automount:

if [ "$ACTION" = remove ] ; then
        echo "Umount /mnt/tfcard"
        umount /mnt/tfcard
else
        echo "Mount /dev/mmcblk0"
        mount -n /dev/$MDEV /mnt/tfcard
fi

于是能够自动mount和Umount了!

使用的内核是版本是3.0.34,也许在之前的2.6版本中,上一种else if[ "$ACTION" = add] ; then的写法是正确的。

<device regex> <uid>:<gid> <octal permissions> [=path|>path|!] [<@|$|*> <command>]的详细解释:

<device regex>:必须有,用来匹配设备。

<uid>:<gid>:必须有,创建的设备节点的所属用户id和组id。

<octal permissions>:必须有, 创建的设备结点的用户权限。

[=path|>path|!]:可选项,其中

[=path]:重命名/移动 设备,如果希望将设备放入子目录,则path应以 / 结尾,例如:hda 0:3 660 =drives/

[>path]:也是重命名/移动 设备,但是会在原位置创建一个指向新设备的符号链接。

[!]:不创建设备。

[<@|$|*> <command>]:可选项

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

$:表示command在删除设备前运行

*:表示command在创建后和删除设备前都运行

其中command可以是简单的命令,如mount、umount,也可以是shell脚本。

原创粉丝点击