Chinaunix
標題: 自動掛載U盤及識別物理接口 [打印本頁]
作者: kinger1172 時間: 2011-12-22 08:51
標題: 自動掛載U盤及識別物理接口
前一段時間在做一個嵌入式linux系統(tǒng)的U盤自動掛載,以及有兩個USB接口,需要識別從那個接口插入U盤的功能.所以想整理所做的過程,以下的絕大數內容都來自internet,發(fā)揮下人人為我,我為人人的精神.
熱插拔:從用戶角度來看,熱插拔是內核和用戶空間之間,通過調用用戶空間程序(如:hotplug,mdev)的交互,當需要通知用戶,內核發(fā)生了某種熱插拔事件時,內核才調用這個用戶空間程序.
mdev:一個簡化版的udev,是busybox所帶的程序,十分適合嵌入式系統(tǒng),執(zhí)行mdev -s ;以 -s 為參數調用位于/sbin目錄下的mdev去掃描/sys/class和/sys/block中所有的類設備目錄,如果在目錄中含有名為“dev“的文件,且文件中包含是設備號,則mdev就利用這些信息為這個設備在/dev下創(chuàng)建設備節(jié)點文件,一般只在啟動時執(zhí)行一次“mdev -s"
執(zhí)插拔事件:由于啟動時運行了命令:echo /sbin/mdev > /proc/sys/kernel/hotplug,那么當有熱插拔事件產生時,內核就會調用位于/sbin目錄的mdev,這時mdev通過環(huán)境變量中的ACTION和DEVPAHT,來確定此次熱插拔事件的動作以及影響了/sys中的那個目錄。接著會看看這個目錄中是否有“dev“的屬性文件,如果有就利用這些信息在/dev下創(chuàng)建設備節(jié)點文件。
下面介紹下mdev的使用:
1、配置內核: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、在啟動時加上使用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、添加對熱插拔事件的相應動作,支持U盤自動掛載
修改根文件系統(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)建設備結點)后執(zhí)行后面的腳本
$ :表示在拔出(刪除設備節(jié)點)前執(zhí)行后面的腳本
整個格式:<device regex><uid>:<gid><octal permissions>[<@ $ *><commands>]
5、添加對應的腳本文件:
根文件系統(tǒng)中的/etc/mdev/usb_insert文件內容
- #! /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文件內容
- #! /bin/sh
- umount -l /mnt/$MDEV
- rm -rf /mnt/$MDEV
關于變量$MDEV是怎么傳遞到這里,我至今也沒有弄懂,還有當插入U盤時,$MDEV的值可能是sda1,但當拔掉時值變成sda,這樣的話就造成/mnt/$MDEV沒有umount且目錄沒刪除,目前我只是用一個很笨的方法直接在后面加‘1’,我猜應該是熱插拔事件先發(fā)生,腳本之后才執(zhí)行,$MDEV的值當然很可能發(fā)生了變化。
區(qū)別物理接口的兩個USB端口(即知道由那個端口插入U盤):
原理應該是:在usb總線在掃描usb端口相連的hub時,分配一個地址,這個地址至少在系統(tǒng)重啟之前是恒值,(不知道是不是每個重啟之后是不是相同,但這不影響后面判斷兩個USB端口),這樣兩個端口的hub就有不同的地址。
首先操作系統(tǒng)要支持USBFS文件系統(tǒng),并把它掛載到/proc/bus/usb目錄下面,這樣當插入U盤時就會把相關設備和端口對應的hub信息寫devices這個文件中(/proc/bus/usb/devices).兩個U盤插入時,文件里面的port的值是不一樣的,這樣我們就可以對信息cat 出來進行分析,判斷那個端口插入U盤。當拔掉時devices又會自動把相關的信息刪除。
另一個方法查看插入USB端口后相關的信息,可以用dmesg
歡迎光臨 Chinaunix (http://www.72891.cn/) |
Powered by Discuz! X3.2 |