1. 程式人生 > >使用mdev自動mount和umount tf卡

使用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

於是能夠自動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指令碼。