原文:http://blog.163.com/shaohj_1999@126/blog/static/6340685120113142227667/
Linux傳統上使用靜態裝置建立的方法,在dev下建立了大量的節點,而不管這些節點相應的硬體裝置是否存在。採用udev的方法,系統檢測到裝置才會往建立這些裝置對應的節點。
這裡我們簡單的說一下udev的工作原理:
Udev是依靠於sysfs的,當系統中添加一個新的裝置後,核心檢測到後就會產生一個hotplug event並尋找/proc/sys/kernel/hotplug往找出治理裝置串連的使用者空間程式,若udev已經啟動,核心會通知udev往檢測sysfs中關於這個新裝置的資訊並建立裝置節點。如/dev/vcs,在/sys/class/tty/vcs/dev存放的是”7:0”,既/dev/vcs的主次裝置號。
並且udev還會根據/etc/udev/rules.d中的規則檔案實現一些相應的功能。
下面我們先容一下如何?裝置節點的自動建立及隨身碟或SD卡的自動掛載。
一、.udev的移植(現在的檔案系統中一般默然對udev進行了支援)
由於檔案系統中預設是沒有對udev進行支援的,所以我們移植一個udev。
1.下載UDEV源碼udev-080.tar.bz2,並解壓
網址:http://www.us.kernel.org/pub/linux/uTIls/kernel/hotplug
2.交叉編譯。
修改Makefile,具體修改如下:
CROSS = arm-softfloat-linux-gnu-
儲存退出。
執行命令:make 進行編譯,然後執行arm-softfloat-linux-gnu-STrip udev udevd udevstart udevinfo udevtest。並拷貝這些檔案到rootfs/bin目錄下面
3.添加udev的支援
下面三種方法功能相同
(1)並修改etc/init.d/rcS指令碼,然後添加如下命令: /bin/mount -t sysfs sysfs /sys
(首先建立這個目錄)
/bin/mount -t tmpfs tmpfs /dev
/bin/udevd --daemON
/bin/udevstart
(2)假如linuxrc是二進位檔案的話
rm /linuxrc
vi /linuxrc
添加如下內容
/bin/mount -t sysfs sysfs /sys
(首先建立這個目錄)
/bin/mount -t tmpfs tmpfs /dev
/bin/udevd --daemon
/bin/udevstart
exec /sbin/init
(3)修改/etc/fstab為 (這一步就行了,標準做法)
#device mount-point type options dump fsck order
proc /proc proc defaults 0 0
tmpfs /tmp tmpfs defaults 0 0
sysfs /sys sysfs defaults 0 0
tmpfs /dev tmpfs defaults 0 0
修改/etc/init.d/rcS,添加如下內容
/bin/udevd --daemon
/bin/udevstart
有這上面寫些,重新啟動系統後,我們的檔案系統就有了自動建立節點的功能了。
二、自動掛載隨身碟或SD卡
1.在/etc下建立udev目錄
2.在/etc/udev下穿件目錄rules.d和檔案udev.conf
3.在udev.conf中添加如下內容
# udev.conf
# The initial syslog(3) priority: "err", "info", "debug" or its
# numerical equivalent. For runtime debugging, the daemons internal
# state can be changed with: "udevcontrol log_priority=".
udev_log="err"
4.在rules.d下建立規則檔案
如實現隨身碟自動掛載
Vim 11-add-usb.rules
添加如下內容
ACTION!="add",GOTO="farsight"
KERNEL=="sd[a-z][0-9]",RUN+="/sbin/mount-usb.sh %k"
LABEL="farsight"
這個檔案中ACTION後是說明是什麼事件,KERNEL後是說明是什麼裝置比如sda1,mmcblk0p1等,RUN這個裝置插進後往執行哪個程式%k是傳進這個程式的參數,這裡%k=KERNEL的值也就是sda1等。
在/sbin/下建立mount-usb.sh檔案添加如下內容
#!/bin/sh
/bin/mount -t vfat /dev/$1 /tmp
sync
修改檔案許可權為其添加可執行檔許可權。
這樣就實現了隨身碟的自動掛載,下面附上隨身碟的卸載規則檔案和sd卡的檔案
Usb卸載
11-add-remove.rules
ACTION !="remove",GOTO="farsight"
SUBSYSTEM!="block",GOTO="farsight"
KERNEL=="sd[a-z][0-9]",RUN+="/sbin/umount-usb.sh"
LABEL="farsight"
umount-usb.sh
#!/bin/sh
sync
umount /tmp/
SD卡掛載
ACTION!="add",GOTO="farsight"
KERNEL=="mmcblk[0-9]p[0-9]",RUN+="/sbin/mount-sd.sh %k"
LABEL="farsight"
mount
==========================經測試,上面的方法成功==========================
其他相關文章:
通過udev自動掛載隨身碟
目前一些主流案頭系統(如Gnome,KDE,Xfce)的較新版本都支援自動掛載(mount)隨身碟了. 一個流傳很廣的說法是
HAL(硬體抽象層) 起了自動掛載的作用, 其實這是誤解. 對於2.6核心而言, udev 才是直接從核心接收裝置串連或斷開資訊的主體.
udev
從核心得到資訊後,根據一些簡單規則(注意,是簡單規則), 在 /dev 目錄下建立相應的裝置節點, 並進行某些相關操作. HAL
所做的事情是在 udev 的規則中加上一條(或幾條), 讓 udev 把收到的資訊也傳遞給 HAL. 接下來, HAL
用更為複雜的規則來匹配和描述當前串連著的硬體. 舉一個簡單的例子, udev 知道的是隨身碟已經串連了並且有一個分區; 而 HAL
能更進一步知道這個分區的卷標名及其它一些資訊.
上面這些都還不能自動掛載隨身碟. Gnome 等案頭系統會啟動一個守護進程(daemon), 通過 D-Bus 從 HAL 那裡得到硬體資訊, 如果發現有隨身碟串連了就由它們來掛載它(實際是調用 pmount).
問題是, 如果你不想用Gnome,KDE,Xfce這些案頭系統, 那麼由它們提供的隨身碟自動掛載功能也就失效了,有解決辦法麼?
解決的辦法之一, 便是讓 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"
其它參考資料:
udev:http://zh.wikipedia.org/wiki/Udev
hal:http://en.wikipedia.org/wiki/Hardware_abstraction_layer
d-bus:http://en.wikipedia.org/wiki/D-BUS