1. 程式人生 > >Ubuntu下自動載入U盤

Ubuntu下自動載入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 %k" 
然後, 在 /root 目錄中建立檔案 usbmount.sh, 其內容為
#!/bin/bash
LOG=/var/log/usb-hotplug.log
lap=lap: ACTION" >> ACTION == "add" ]
then
    mkdir $1
    mount -t vfat -o umask=000,noatime,async,codepage=936,iocharset=gb2312 \    /dev/$1           /media/$1
    mount -t ntfs -o umask=000,noatime,async,codepage=936,iocharset=gb2312 \    /dev/$1           /media/$1
    mount -t ext4 -o umask=000,noatime,async,codepage=936,iocharset=gb2312 \    /dev/$1          /media/$1
elif [ $ACTION == "remove" ]
then
    umount -l /media/$1
    rm -rf $1
fi 
       並把該檔案屬性設定為可執行, chmod a+x usbmount.sh
       注意, 如果你的 linux 上 locale 是 zh_CN.utf-8, 需要把上面的 iocharset=gb2312 改成 iocharset=utf8
這是一個非常簡單但可用的例子. U盤插上後自動 mount 到 /media/usbkey , 拔出後自動 umount. 你可以檢視 /var/log/usb-hotplug.log , 裡面會有些簡單的呼叫記錄.
如果要掛載exfat格式的u盤,就緒要下載它的支援
掛載exfat格式u盤的步驟:
sudo apt-get install subversion
sudo apt-get install scons
sudo apt-get install libfuse-dev
sudo apt-get install gcc
svn co http://exfat.googlecode.com/svn/trunk/ exfat-read-only
cd exfat-read-only
scons
sudo scons install
rm –rf exfat-read-only
在前面指令碼中加入:  
mount -t exfat-fuse -o umask=000,noatime,async,codepage=936,iocharset=gb2312 \    /dev/$1           /media/$1
這之後就可以掛載exfat格式的u盤了。