关于热插拔usb hotplug /proc/sys/kernel mdev udev busybox
如何使用busybox精簡版本udev程序--mdev動態(tài)創(chuàng)建插入的u盤和鼠標等設備
busybox的mdev是一個精簡了的udev管理程序,它可以間接的以hotplug方式被內(nèi)核調(diào)用,進而在arm平臺上/dev目錄下動態(tài)創(chuàng)建設備 節(jié)點,因為hotplug會被內(nèi)核發(fā)送uevent之前調(diào)用,所以如果動態(tài)可插拔設備很多,很頻繁,那么每次內(nèi)核都會調(diào)用elf格式的用戶空間的 hotplug,生成一個獨立的hotplug程序來處理,所以hotplug是一個非常笨重的實現(xiàn)方法,但是在我們的arm開發(fā)板上,可插拔設備并沒有 想象中的頻繁
目前還沒有必要移植完全版的udev,所以完全可以在不復雜的嵌入式設備上使用mdev來管理動態(tài)節(jié)點,
方法也很簡單,就是在rcS腳本中加入下面一句,將用戶空間的應用程序路徑傳遞給內(nèi)核,
echo /sbin/mdev > /proc/sys/kernel/hotplug
之后kernel會在每次設備出現(xiàn)變動時調(diào)用上面一句傳遞進去的用戶空間應用程序/sbin/mdev來處理對應的信息,進而mdev應用程序操作/dev目錄下的設備,進行添加或刪除,可以參考添加hotplug函數(shù)到內(nèi)核,監(jiān)控uevent信息?
? mdev的另外一個很有用的地方是,他可以通過proc和sys文件系統(tǒng)來動態(tài)整理出注冊的設備,進而到/dev/下生成他們對應的節(jié)點,
使用該功能之前必須mount上proc和sys文件系統(tǒng),然后簡單的執(zhí)行下面的一句就彎成了:
? mdev -s
如果需要編譯udev,下面是udev的下載地址:http://www.us.kernel.org/pub/linux/utils/kernel/hotplug/udev-145.tar.bz2
1,?busybox?添加mdev支持
2, 在/etc/rc.d/rcS中添加
#mount filesystem
/bin/mount -a
#start mdev
#設置系統(tǒng)的hotplug 程序為mdev
echo /sbin/mdev > /proc/sys/kernel/hotplug ??
#掃描并創(chuàng)建節(jié)點,這一步可不能少?
mdev –s
/etc/fstab的內(nèi)容如下:
none? ? /proc?? proc??? defaults??? 0?????? 0
none??? /tmp??? tmpfs defaults 0?????? 0
mdev??? /dev??? ramfs?? defaults 0?????? 0
none? ? /sys??? sysfs?? defaults??? 0?????? 0
none? ? /dev/pts? ? devpts? ? gid=5,mode=620 0 0
執(zhí)行mdev -s?:以‘-s’為參數(shù)調(diào)用位于 /sbin目錄寫的mdev(其實是個鏈接,作用是傳遞參數(shù)給/bin目錄下的busybox?程序并調(diào)用它),mdev掃描 /sys/class 和 /sys/block 中所有的類設備目錄,如果在目錄中含有名為“dev”的文件,且文件中包含的是設備號,則mdev就利用這些信息為這個設備在/dev 下創(chuàng)建設備節(jié)點文件。一般只在啟動時才執(zhí)行一次 “mdev -s”。
熱插拔事件:由于啟動時運行了命令:echo /sbin/mdev > /proc/sys/kernel/?hotplug ,那么當有熱插拔事件產(chǎn)生時,內(nèi)核就會調(diào)用位于 /sbin目錄的mdev。這時mdev通過環(huán)境變量中的 ACTION 和 DEVPATH,來確定此次熱插拔事件的動作以及影響了/sys中的那個目錄。接著會看看這個目錄中是否有“dev”的屬性文件,如果有就利用這些信息為 這個設備在/dev 下創(chuàng)建設備節(jié)點文件。
1.解決使用mdev時“cannot create /proc/sys/kernel/hotplug :nonexistent directory”錯誤
確保編譯內(nèi)核時編譯如下選項:
CONFIG_PROC_FS=y
CONFIG_PROC_SYSCTL=y
CONFIG_HOTPLUG=y
CONFIG_NET=y
如果CONFIG_HOTPLUG和CONFIG_NET不選或沒全選上的話,/proc/sys/kernel下將不會創(chuàng)建?hotplug文件.(參見kernel/sysctl.c)
2.實現(xiàn)內(nèi)核U盤自動識別:
當U盤熱插拔的過程中,會觸發(fā)/dev/mdev.conf運行(內(nèi)核配置支持),然后調(diào)用etc/hotplug/下的腳本進行相關操作;
/dev/mdev.conf 中編寫:? sd[a-z]([0-9]?) ?0:0 0660 ?*/etc/mdev/udisk_sh
udisk_sh腳本實現(xiàn)如下:
#!/bin/sh
if [ $ACTION = "add" ]; then
?? ?inset_name=/dev/$MDEV$"1"
?? ?echo $inset_name > /dev/console
?? ?if [ -b $inset_name ]; then
?? ??? ?exit 0
?? ?fi
?? ?echo "usbdisk insert!" > /dev/console ?
?? ?mounted=`mount |grep "/dev/$MDEV"`
?? ?# check no duplicate mounting
?? ?echo $mounted
?? ?if [ "$mounted" != "" ];then
?? ??? ?exit 0
?? ?fi
?? ?disk_name="Udisk0"
?? ?for i in `seq 0 4`
?? ?do
?? ??? ?dirname=/mnt/usb/Udisk$i
?? ??? ?if [ ! -d $dirname ];then
?? ??? ??? ?#export $MDEV=$dirname
?? ??? ??? ?mkdir -p $dirname
?? ??? ??? ?mount /dev/$MDEV $dirname
?? ??? ??? ?break
?? ??? ?fi
?? ?done
else
?? ?echo "usbdisk remove!" > /dev/console ?
?? ?dirname=`mount |grep "/dev/$MDEV" |awk -F ' ' '{print $3}'`
?? ?echo "Dirname: "$dirname > /dev/console
?? ?umount -f $dirname
?? ?rm -rf $dirname
fi
?
《新程序員》:云原生和全面數(shù)字化實踐50位技術專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的关于热插拔usb hotplug /proc/sys/kernel mdev udev busybox的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux下文件系统的启动过程
- 下一篇: zynq 文件系统中加载PL fpga.