當(dāng)前位置:首頁 > 嵌入式培訓(xùn) > 嵌入式學(xué)習(xí) > 講師博文 > linux中的熱插拔和mdev機制
mdev是busybox自帶的一個簡化版的udev,作用是在系統(tǒng)啟動和熱插拔或動態(tài)加載驅(qū)動程序時,自動產(chǎn)生驅(qū)動程序所需的節(jié)點文件,在文件系統(tǒng)中的/dev目錄下的設(shè)備節(jié)點都是由mdev創(chuàng)建的mdev掃描/sys/class和/sys/block中所有的類設(shè)備目錄,如果在目錄中含有名為"dev"的文件,且文件中包含的是設(shè)備號,則mdev就利用這些信息為這個設(shè)備在/dev下創(chuàng)建設(shè)備節(jié)點用法:
1. 執(zhí)行mdev前要掛載 /sys
mount -t tmpfs mdev /dev
mount -t sysfs sysfs /sys
2.命令內(nèi)核在增刪設(shè)備時執(zhí)行/sbin/mdev,使設(shè)備節(jié)點會被創(chuàng)建和刪除
echo /sbin/mdev > /proc/sys/kernel/hotplug
3.設(shè)置mdev,讓它在系統(tǒng)啟動時創(chuàng)建所有的設(shè)備節(jié)點
mdev -s
關(guān)于熱插拔:
需要內(nèi)核中支持hotplug
編寫mdev配置文件:/etc/mdev.conf
該文件的作用是:mdev在找到匹配設(shè)備時自動執(zhí)行自定義命令
格式為: : [<@$*>]
@ 創(chuàng)建節(jié)點后執(zhí)行的
$ 刪除節(jié)點前執(zhí)行的
* 創(chuàng)建后和刪除前都運行的
如自動掛載U盤和SD卡腳本:
sd[a-z][0-9] 0:0 0660 @/etc/hotplug/usb/udisk_insert
sd[a-z] 0:0 0660 $/etc/hotplug/usb/udisk_remove
mmcblk[0-9]p[0-9] 0:0 0660 @/etc/hotplug/sd/sd_insert
mmcblk[0-9] 0:0 0660 $/etc/hotplug/sd/sd_remove
當(dāng)檢測到類似sda1這樣的設(shè)備時,執(zhí)行/etc/hotplug/usb里的腳本,腳本的內(nèi)容就是掛載和卸載U盤;當(dāng)檢測到類似mmcblk0p1這樣的設(shè)備時,執(zhí)行/etc/hotplug/sd里的腳本,腳本的內(nèi)容就是掛載和卸載SD卡。
mdev是busybox中的一個udev管理程序的一個精簡版,他也可以實現(xiàn)設(shè)備節(jié)點的自動創(chuàng)建和設(shè)備的自動掛載,只是在實現(xiàn)的過程中有點差異,在發(fā)生熱插拔時間的時候,mdev是被hotplug直接調(diào)用,這時mdev通過環(huán)境變量中的 ACTION 和 DEVPATH,來確定此次熱插拔事件的動作以及影響了/sys中的那個目錄。接著會看看這個目錄中是否有“dev”的屬性文件,如果有就利用這些信息為這個設(shè)備在/dev 下創(chuàng)建設(shè)備節(jié)點文件。
下面是如何讓我們的系統(tǒng)支持mdev。
1.在使用busybox制作根文件系統(tǒng)的時候,選擇支持mdev
Linux System Utilities --->
[*] mdev
[*] Support /etc/mdev.conf
[*] Support command execution at device addition/removal
2.在文件系統(tǒng)添加如下內(nèi)容
Vim /etc/init.d/rcS
mount -t tmpfs mdev /dev
mount -t sysfs sysfs /sys
mkdir /dev/pts
mount -t devpts devpts /dev/pts
echo /sbin/mdev>/proc/sys/kernel/hotplug
mdev –s
這些語句的添加在mdev的手冊中可以找到。
3.添加對熱插拔事件的響應(yīng),實現(xiàn)U盤和SD卡的自動掛載。
Vim /etc/mdev.conf
mmcblk[0-9]p[0-9] 0:0 666 @ /etc/sd_card_inserting
mmcblk[0-9] 0:0 666 $ /etc/sd_card_removing
sd[a-z] [0-9] 0:0 666 @ /etc/usb/usb_inserting
sd[a-z] 0:0 666 $ /etc/usb/usb_removing
紅色部分,是一個腳本,腳本內(nèi)容可以根據(jù)我們的需要定制,可以實現(xiàn)掛載,卸載或其他一些功能。
如下是自動掛載和卸載的腳本:
/etc/sd_card_inserting
#!/bin/sh
mount -t vfat /dev/mmcblk0p1 /mnt/sd
/etc/sd_card_removing
#!/bin/sh
sync
umount /mnt/sd