Linux+樹莓派3開發總結——通過udev自動掛載U盤的方法

Linux+樹莓派3開發總結——通過udev自動掛載U盤的方法

目前一些主流桌面系統(如Gnome,KDE,Xfce)的較新版本都支持自動掛載(mount)U盤了. 一個流傳非常廣的說法是 HAL(硬件抽象層) 起了自動掛載的作用, 其實這是誤解. 對於2.6內核而言, udev 纔是直接從內核接收設備連接或斷開信息的主體.
udev 從內核得到信息後,根據一些簡單規則(注意,是簡單規則), 在 /dev 目錄下創建相應的設備節點, 並進行某些相關操作. HAL 所做的事情是在 udev 的規則中加上一條(或幾條), 讓 udev 把收到的信息也傳遞給 HAL. 接下來, HAL 用更爲複雜的規則來匹配和描述當前連接着的硬件. 舉一個簡單的例子, udev 知道的是U盤已連接了並且有一個分區; 而 HAL 能更進一步知道這個分區的卷標名及其他一些信息.
上面這些都還不能自動掛載U盤. Gnome 等桌面系統會啓動一個守護進程(daemon), 通過 D-Bus 從 HAL 那裏得到硬件信息, 如果發現有U盤連接了就由他們來掛載他(實際是調用 pmount).
問題是, 如果你不想用Gnome,KDE,Xfce這些桌面系統, 那麼由他們提供的U盤自動掛載功能也就失效了,有解決辦法麼?
解決的辦法之一, 便是讓 udev 來幹這件事情!
udev 的主要功能是實時地在 /dev 目錄下創建和刪除設備節點, 但他也能在創建節點的同時, 執行一個額外地程式. 具體的原理這裏就不詳說了, 有時間請仔細閱讀
Writing udev rules
這篇文章. 寫規則時特別注意 KERNEL, SUBSYSTEM 等這些關鍵字單數和複數(最後有沒有’S’)的差別. 複數(比如 KERNELS)表示你想用父設備的屬性來匹配, 單數(比如 KERNEL)是要匹配設備本身的屬性.
在 /etc/udev/rules.d 目錄下創建文件 10_usbkey.rules, 其內容如下

KERNEL=="sda1", SUBSYSTEM=="block", RUN+="/root/usbmount.sh"

然後, 在 /root 目錄中創建文件 usbmount.sh, 其內容爲
#!/bin/bash
LOG=/var/log/usb-hotplug.log
lap=$(date --rfc-3339=ns)
echo "$lap: $DEVPATH requesting $ACTION" >> $LOG
if [ $ACTION == "add" ]
then
    mount -t vfat -o umask=000,noatime,async,codepage=936,iocharset=gb2312 \
        /dev/sda1 /media/usbkey
elif [ $ACTION == "remove" ]
then
    umount -l /media/usbkey
fi


並把該文件屬性設置爲可執行,

chmod a+x usbmount.sh 

注意, 如果你的 linux 上 locale 是 zh_CN.utf-8, 需要把上面的 iocharset=gb2312 改成 iocharset=utf8
最後創建目錄,

mkdir /media/usbkey 

這是個非常簡單但可用的例子. U盤插上後自動 mount 到 /media/usbkey , 拔出後自動 umount. 你能查看 /var/log/usb-hotplug.log , 裏面會有些簡單的調用記錄.


在/usr/share/hal/fdi及其子文件夾下看一下是不是有一個名稱裏含有gparted的文件,如果有把它刪掉應該自動掛載就好


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章