前一段時(shí)間在做一個(gè)嵌入式linux系統(tǒng)的U盤自動(dòng)掛載,以及有兩個(gè)USB接口,需要識(shí)別從那個(gè)接口插入U(xiǎn)盤的功能.所以想整理所做的過程,以下的絕大數(shù)內(nèi)容都來自internet,發(fā)揮下人人為我,我為人人的精神.
熱插拔:從用戶角度來看,熱插拔是內(nèi)核和用戶空間之間,通過調(diào)用用戶空間程序(如:hotplug,mdev)的交互,當(dāng)需要通知用戶,內(nèi)核發(fā)生了某種熱插拔事件時(shí),內(nèi)核才調(diào)用這個(gè)用戶空間程序.
mdev:一個(gè)簡化版的udev,是busybox所帶的程序,十分適合嵌入式系統(tǒng),執(zhí)行mdev -s ;以 -s 為參數(shù)調(diào)用位于/sbin目錄下的mdev去掃描/sys/class和/sys/block中所有的類設(shè)備目錄,如果在目錄中含有名為“dev“的文件,且文件中包含是設(shè)備號(hào),則mdev就利用這些信息為這個(gè)設(shè)備在/dev下創(chuàng)建設(shè)備節(jié)點(diǎn)文件,一般只在啟動(dòng)時(shí)執(zhí)行一次“mdev -s"
執(zhí)插拔事件:由于啟動(dòng)時(shí)運(yùn)行了命令:echo /sbin/mdev > /proc/sys/kernel/hotplug,那么當(dāng)有熱插拔事件產(chǎn)生時(shí),內(nèi)核就會(huì)調(diào)用位于/sbin目錄的mdev,這時(shí)mdev通過環(huán)境變量中的ACTION和DEVPAHT,來確定此次熱插拔事件的動(dòng)作以及影響了/sys中的那個(gè)目錄。接著會(huì)看看這個(gè)目錄中是否有“dev“的屬性文件,如果有就利用這些信息在/dev下創(chuàng)建設(shè)備節(jié)點(diǎn)文件。
下面介紹下mdev的使用:
1、配置內(nèi)核:make menuconfig
General setup ----->
configure standard kernel features(for small systems)---->
[*]support for hot-pluggable devices
2、配置busybox: make menuconfig
Linux system utilities ---->
[*]mdev
[*]support /etc/mdev.conf
[*]support command execution at device addition/removal
3、在啟動(dòng)時(shí)加上使用mdev的命令
在創(chuàng)建的根文件系統(tǒng)/etc/init.d/rcs中,
#掛載/sys為sysfs文件系統(tǒng)
echo " mount /sys as sysfs"
/bin/mount -t tmpfs mdev /dev
/bin/mount -t sysfs sysfs /sys
echo "----starting mdev -----"
/bin/echo /sbin/mdev > /proc/sys/kernel/hotplug
mdev -s
4、添加對(duì)熱插拔事件的相應(yīng)動(dòng)作,支持U盤自動(dòng)掛載
修改根文件系統(tǒng)中的/etc/mdev.conf文件
sd[a-z][0-9] 0:0 666 @(sh /etc/mdev/usb_inert)
sd[a-z] 0:0 666 $(sh /etc/mdev/usb_remove)
@ :表示是在插入(創(chuàng)建設(shè)備結(jié)點(diǎn))后執(zhí)行后面的腳本
$ :表示在拔出(刪除設(shè)備節(jié)點(diǎn))前執(zhí)行后面的腳本
整個(gè)格式:<device regex><uid>:<gid><octal permissions>[<@ $ *><commands>]
5、添加對(duì)應(yīng)的腳本文件:
根文件系統(tǒng)中的/etc/mdev/usb_insert文件內(nèi)容
- #! /bin/sh
- if [ -d /sys/block/*/$MDEV ];then
- mkdir -p /mnt/$MDEV
- mount /dev/$MDEV /mnt/$MDEV -t vfat
- fi
拔出后執(zhí)行的腳本/etc/mdev/usb_remove文件內(nèi)容
- #! /bin/sh
- umount -l /mnt/$MDEV
- rm -rf /mnt/$MDEV
關(guān)于變量$MDEV是怎么傳遞到這里,我至今也沒有弄懂,還有當(dāng)插入U(xiǎn)盤時(shí),$MDEV的值可能是sda1,但當(dāng)拔掉時(shí)值變成sda,這樣的話就造成/mnt/$MDEV沒有umount且目錄沒刪除,目前我只是用一個(gè)很笨的方法直接在后面加‘1’,我猜應(yīng)該是熱插拔事件先發(fā)生,腳本之后才執(zhí)行,$MDEV的值當(dāng)然很可能發(fā)生了變化。
區(qū)別物理接口的兩個(gè)USB端口(即知道由那個(gè)端口插入U(xiǎn)盤):
原理應(yīng)該是:在usb總線在掃描usb端口相連的hub時(shí),分配一個(gè)地址,這個(gè)地址至少在系統(tǒng)重啟之前是恒值,(不知道是不是每個(gè)重啟之后是不是相同,但這不影響后面判斷兩個(gè)USB端口),這樣兩個(gè)端口的hub就有不同的地址。
首先操作系統(tǒng)要支持USBFS文件系統(tǒng),并把它掛載到/proc/bus/usb目錄下面,這樣當(dāng)插入U(xiǎn)盤時(shí)就會(huì)把相關(guān)設(shè)備和端口對(duì)應(yīng)的hub信息寫devices這個(gè)文件中(/proc/bus/usb/devices).兩個(gè)U盤插入時(shí),文件里面的port的值是不一樣的,這樣我們就可以對(duì)信息cat 出來進(jìn)行分析,判斷那個(gè)端口插入U(xiǎn)盤。當(dāng)拔掉時(shí)devices又會(huì)自動(dòng)把相關(guān)的信息刪除。
另一個(gè)方法查看插入U(xiǎn)SB端口后相關(guān)的信息,可以用dmesg
|