需求很简单,就是在热插拔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
使用的内核是版本是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脚本。