关于热插拔usb hotplug /proc/sys/kernel mdev udev busybox
如何使用busybox精簡(jiǎn)版本udev程序--mdev動(dòng)態(tài)創(chuàng)建插入的u盤(pán)和鼠標(biāo)等設(shè)備
busybox的mdev是一個(gè)精簡(jiǎn)了的udev管理程序,它可以間接的以hotplug方式被內(nèi)核調(diào)用,進(jìn)而在arm平臺(tái)上/dev目錄下動(dòng)態(tài)創(chuàng)建設(shè)備 節(jié)點(diǎn),因?yàn)閔otplug會(huì)被內(nèi)核發(fā)送uevent之前調(diào)用,所以如果動(dòng)態(tài)可插拔設(shè)備很多,很頻繁,那么每次內(nèi)核都會(huì)調(diào)用elf格式的用戶(hù)空間的 hotplug,生成一個(gè)獨(dú)立的hotplug程序來(lái)處理,所以hotplug是一個(gè)非常笨重的實(shí)現(xiàn)方法,但是在我們的arm開(kāi)發(fā)板上,可插拔設(shè)備并沒(méi)有 想象中的頻繁
目前還沒(méi)有必要移植完全版的udev,所以完全可以在不復(fù)雜的嵌入式設(shè)備上使用mdev來(lái)管理動(dòng)態(tài)節(jié)點(diǎn),
方法也很簡(jiǎn)單,就是在rcS腳本中加入下面一句,將用戶(hù)空間的應(yīng)用程序路徑傳遞給內(nèi)核,
echo /sbin/mdev > /proc/sys/kernel/hotplug
之后kernel會(huì)在每次設(shè)備出現(xiàn)變動(dòng)時(shí)調(diào)用上面一句傳遞進(jìn)去的用戶(hù)空間應(yīng)用程序/sbin/mdev來(lái)處理對(duì)應(yīng)的信息,進(jìn)而mdev應(yīng)用程序操作/dev目錄下的設(shè)備,進(jìn)行添加或刪除,可以參考添加hotplug函數(shù)到內(nèi)核,監(jiān)控uevent信息?
? mdev的另外一個(gè)很有用的地方是,他可以通過(guò)proc和sys文件系統(tǒng)來(lái)動(dòng)態(tài)整理出注冊(cè)的設(shè)備,進(jìn)而到/dev/下生成他們對(duì)應(yīng)的節(jié)點(diǎn),
使用該功能之前必須mount上proc和sys文件系統(tǒng),然后簡(jiǎn)單的執(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
#設(shè)置系統(tǒng)的hotplug 程序?yàn)閙dev
echo /sbin/mdev > /proc/sys/kernel/hotplug ??
#掃描并創(chuàng)建節(jié)點(diǎn),這一步可不能少?
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目錄寫(xiě)的mdev(其實(shí)是個(gè)鏈接,作用是傳遞參數(shù)給/bin目錄下的busybox?程序并調(diào)用它),mdev掃描 /sys/class 和 /sys/block 中所有的類(lèi)設(shè)備目錄,如果在目錄中含有名為“dev”的文件,且文件中包含的是設(shè)備號(hào),則mdev就利用這些信息為這個(gè)設(shè)備在/dev 下創(chuàng)建設(shè)備節(jié)點(diǎn)文件。一般只在啟動(dòng)時(shí)才執(zhí)行一次 “mdev -s”。
熱插拔事件:由于啟動(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通過(guò)環(huán)境變量中的 ACTION 和 DEVPATH,來(lái)確定此次熱插拔事件的動(dòng)作以及影響了/sys中的那個(gè)目錄。接著會(huì)看看這個(gè)目錄中是否有“dev”的屬性文件,如果有就利用這些信息為 這個(gè)設(shè)備在/dev 下創(chuàng)建設(shè)備節(jié)點(diǎn)文件。
1.解決使用mdev時(shí)“cannot create /proc/sys/kernel/hotplug :nonexistent directory”錯(cuò)誤
確保編譯內(nèi)核時(shí)編譯如下選項(xiàng):
CONFIG_PROC_FS=y
CONFIG_PROC_SYSCTL=y
CONFIG_HOTPLUG=y
CONFIG_NET=y
如果CONFIG_HOTPLUG和CONFIG_NET不選或沒(méi)全選上的話(huà),/proc/sys/kernel下將不會(huì)創(chuàng)建?hotplug文件.(參見(jiàn)kernel/sysctl.c)
2.實(shí)現(xiàn)內(nèi)核U盤(pán)自動(dòng)識(shí)別:
當(dāng)U盤(pán)熱插拔的過(guò)程中,會(huì)觸發(fā)/dev/mdev.conf運(yùn)行(內(nèi)核配置支持),然后調(diào)用etc/hotplug/下的腳本進(jìn)行相關(guān)操作;
/dev/mdev.conf 中編寫(xiě):? sd[a-z]([0-9]?) ?0:0 0660 ?*/etc/mdev/udisk_sh
udisk_sh腳本實(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ù)字化實(shí)踐50位技術(shù)專(zhuān)家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的关于热插拔usb hotplug /proc/sys/kernel mdev udev busybox的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: linux下文件系统的启动过程
- 下一篇: zynq 文件系统中加载PL fpga.