使用mdev自動mount和umount tf卡
需求很簡單,就是在熱插拔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指令碼。