http://www.linuxforum.net/forum/showflat.php?Cat=&Board=embedded&Number=628054&page=0&view=collapsed&sb=5&o=0&fpart=
第一、什么是udev? 這篇文章UDEV Primer給我們娓娓道來(lái),花點(diǎn)時(shí)間預(yù)習(xí)一下是值得的。當(dāng)然,不知道udev是什么也沒關(guān)系,
把它當(dāng)個(gè)助記符好了,有了下面的上路指南,可以節(jié)省很多時(shí)間。我們只需要樹立一個(gè)信念:udev很簡(jiǎn)單!
嵌入式的udev應(yīng)用尤其簡(jiǎn)單。
第二、為什么udev要取代devfs?
這是生產(chǎn)關(guān)系適應(yīng)生產(chǎn)力的需要,udev好,devfs壞,用好的不用壞的。
udev是硬件平臺(tái)無(wú)關(guān)的,屬于user space的進(jìn)程,它脫離驅(qū)動(dòng)層的關(guān)聯(lián)而建立在操作系統(tǒng)之上,基于這種設(shè)
計(jì)實(shí)現(xiàn),我們可以隨時(shí)修改及刪除/dev下的設(shè)備文件名稱和指向,隨心所欲地按照我們的愿望安排和管理設(shè)
備文件系統(tǒng),而完成如此靈活的功能只需要簡(jiǎn)單地修改udev的配置文件即可,無(wú)需重新啟動(dòng)操作系統(tǒng)。udev
已經(jīng)使得我們對(duì)設(shè)備的管理如探囊取物般輕松自如。
第三、如何得到udev?
udev的主頁(yè)在這里:http://www.kernel.org/pub/linux/utils/kernel/hotplug/udev.html
我們按照下面的步驟來(lái)生成udev的工具程序,以arm-linux為例:
1、wget http://www.us.kernel.org/pub/linux/utils/kernel/hotplug/udev-100.tar.bz2
2、tar xjf udev-100.tar.bz2
3、cd udev-100 編輯Makefile,查找CROSS_COMPILE,修改CROSS_COMPILE ?= arm-linux-
4、make
沒有什么意外的話當(dāng)前目錄下生成udev,udevcontrol,udevd,udevinfo,udevmonitor,udevsettle,udevstart,
udevtest,udevtrigger九個(gè)工具程序,在嵌入式系統(tǒng)里,我們只需要udevd和udevstart就能使udev工作得很好,
其他工具則幫助我們完成udev的信息察看、事件捕捉或者更高級(jí)的操作。
另外一個(gè)方法是直接使用debian提供的已編譯好的二進(jìn)制包,美中不足的是版本老了一些。
1、wget http://ftp.us.debian.org/debian/pool/main/u/udev/udev_0.056-3_arm.deb
2、ar -xf udev_0.056-3_arm.deb
3、tar xzf data.tar.gz
在sbin目錄里就有我們需要的udevd和udevstart工具程序。
建議大家采用第一種方式生成的udevd和udevstart。為什么要用最新udev呢?新的強(qiáng),舊的弱,用強(qiáng)的不用弱的。
第四、如何配置udev?
首先,udev需要內(nèi)核sysfs和tmpfs的支持,sysfs為udev提供設(shè)備入口和uevent通道,tmpfs為udev設(shè)備文件提
供存放空間,也就是說(shuō),在上電之前系統(tǒng)上是沒有足夠的設(shè)備文件可用的,我們需要一些技巧讓kernel先引導(dǎo)
起來(lái)。
由于在kernel啟動(dòng)未完成以前我們的設(shè)備文件不可用,如果使用mtd設(shè)備作為rootfs的掛載點(diǎn),這個(gè)時(shí)候/dev/mtdblock
是不存在的,我們無(wú)法讓kernel找到rootfs,kernel只好停在那里驚慌。
這個(gè)問(wèn)題我們可以通過(guò)給kernel傳遞設(shè)備號(hào)的方式來(lái)解決,在linux系統(tǒng)中,mtdblock的主設(shè)備號(hào)是31,part號(hào)
從0開始,那么以前的/dev/mtdblock/3就等同于31:03,以次類推,所以我們只需要修改bootloader傳給kernel
的cmd line參數(shù),使root=31:03,就可以讓kernel在udevd未起來(lái)之前成功的找到rootfs。
O.K.下一個(gè)問(wèn)題。
其次,需要做的工作就是重新生成rootfs,把udevd和udevstart復(fù)制到/sbin目錄。然后我們需要在/etc/下為udev
建立設(shè)備規(guī)則,這可以說(shuō)是udev最為復(fù)雜的一步。這篇文章提供了最完整的指導(dǎo):Writing udev rules
文中描述的復(fù)雜規(guī)則我們可以暫時(shí)不用去理會(huì),上路指南將帶領(lǐng)我們輕松穿過(guò)這片迷霧。這里提供一個(gè)由簡(jiǎn)入
繁的方法,對(duì)于嵌入式系統(tǒng),這樣做可以一勞永逸。
1、在前面用到的udev-100目錄里,有一個(gè)etc目錄,里面放著的udev目錄包含了udev設(shè)備規(guī)則的詳細(xì)樣例文
本。為了簡(jiǎn)單而又簡(jiǎn)潔,我們只需要用到etc/udev/udev.conf這個(gè)文件,在我們的rootfs/etc下建立一個(gè)udev目
錄,把它復(fù)制過(guò)去,這個(gè)文件很簡(jiǎn)單,除了注釋只有一行,是用來(lái)配置日志信息的,嵌入式系統(tǒng)也許用不上
日志,但是udevd需要檢查這個(gè)文件。
2、在rootfs/etc/udev下建立一個(gè)rules.d目錄,生成一個(gè)空的配置文件touch etc/udev/rules.d/udev.conf。然后
我們來(lái)編輯這個(gè)文件并向它寫入以下配置項(xiàng):
###############################################
# vc devices
KERNEL=="tty[0-9]*", NAME="vc/%n"
# block devices
KERNEL=="loop[0-9]*", NAME="loop/%n"
# mtd devices
KERNEL=="mtd[0-9]*", NAME="mtd/%n"
KERNEL=="mtdblock*", NAME="mtdblock/%n"
# input devices
KERNEL=="mice" NAME="input/%k"
KERNEL=="mouse[0-9]*", NAME="input/%k"
KERNEL=="ts[0-9]*", NAME="input/%k"
KERNEL=="event[0-9]*", NAME="input/%k"
# misc devices
KERNEL=="apm_bios", NAME="misc/%k"
KERNEL=="rtc", NAME="misc/%k"
################################################
保存它,我們的設(shè)備文件系統(tǒng)基本上就可以了,udevd和udevstart會(huì)自動(dòng)分析這個(gè)文件。
3、為了使udevd在kernel起來(lái)后能夠自動(dòng)運(yùn)行,我們?cè)趓ootfs/etc/init.d/rcS中增加以下幾行:
##################################
/bin/mount -t tmpfs tmpfs /dev
echo "Starting udevd..."
/sbin/udevd --daemon
/sbin/udevstart
##################################
4、重新生成rootfs,燒寫到flash指定的rootfs part中。
5、如果需要?jiǎng)討B(tài)改變?cè)O(shè)備規(guī)則,可以把etc/udev放到j(luò)ffs或yaffs part,以備修改,根據(jù)需求而定,可以隨時(shí)擴(kuò)
充udev.conf中的配置項(xiàng)。