mdev說明
mdev是busybox自帶的一個簡化版的udev,適合嵌入式應用場合。其具有使用簡單的特點。它的作用就是在系統啟動和熱插拔或動態加載驅動程序時,自動產生驅動程序所需要的節點文件。在以busybox為基礎構建嵌入式linux根文件系統時,使用它時最優的選擇。
mdev原理
- mdev不加參數時就是利用hotplug機制來決定創建什么樣的設備文件。
- mdev -s程序通過掃描
/sys/class
和/sys/block
中所有的類設備目錄,利用這些信息在/dev
下創建設備節點。
mdev使用
mdev在使用過程中分為兩部分,由於系統啟動時mdev需要根據/sys
目錄下的信息來生成設備節點,因此在使用前需要對系統進行一些配置。mdev同過hotplug機制來創建設備節點是根據/etc/mdev.conf
文件來生成設備節點的。
系統設置
在系統執行mdev -s
前需要執行如下操作:
- 配置內核
make menuconfig
General setup ---->
Configure standard kernel features (for small systems) ---->
[*] load all symbols for debugging/ksymoops
[*] Include all symbols in kallsyms
[*] Support for hot-pluggable devices
[*] Enable support for printk
- 配置busybox
make menuconfig
Linux System Utilities ---->
[*] mdev
[*] Support /etc/mdev.conf
[*] Support subdirs/symlinks
[*] Support regular expressions substitutions when renaming device
[*] Support command execution at device addition/removal
[*] Support loading of firmwares
- 系統啟動時
Vi /etc/init.d/rcS
mount -t tmpfs tmpfs /dev
mkdir /dev/pts
mount -t devpts devpts /dev/pts
mount -t proc proc /proc
mount -t sysfs sysfs /sys
echo /sbin/mdev>/proc/sys/kernel/hotplug//啟動熱插拔事件;
mdev –s
首先掛載/dev
、/dev/pts
、/proc
和/sys
文件系統,mdev需要用到這些文件系統。然后告訴系統當有設備熱插拔時,使用mdev來處理。最后執行mdev -s
來掃描系統中的設備和驅動等。
配置文件/etc/mdev.conf
系統中的hotplug是通過mdev.conf文件來生成設備節點的,該配置文件格式如下:
- 基本格式
<device regex> <uid>:<gid> <octal permissions>
<device regex> :設備名稱,支持正則表達式如hd[a-z][0-9]*等
<uid>:<gid> :用戶ID和組ID
<octal permissions> :八進制表示的設備屬性
- 執行腳本格式
<device regex> <uid>:<gid> <octal permissions> [=|>path] [@|$|*]
[=|>path]:這個選項可以更改設備節點的命名和路徑,如:
<1> =/driver: 可以將設備節點移動到driver目錄下
<2> =newname: 可以講設備節點改為newname命名
<3> >/driver/newname: 可以在/driver目錄下創建一個設備節點的鏈接,並命名為newname
[@|$|*]:這個選項當設備匹配成功時,執行指令,這個指令可以是自己編寫的腳本。前面的符號含義如下:
<1>@:在設備節點創建完執行
<2>$:在設備節點刪除前執行
<3>*:在設備節點創建完和刪除前執行
此外在mdev成功匹配設備后會設置兩個系統變量$MDEV和$ACTION。其中$MDEV用來存放匹配到的設備名,$ACTION用來存放設備插拔狀態其值為add和remove。這兩個變量可以在腳本中使用。
腳本實例
mdev.conf
# system all-writable devices
full 0:0 0666
null 0:0 0666
ptmx 0:0 0666
random 0:0 0666
tty 0:0 0666
zero 0:0 0666
# console devices
tty[0-9]* 0:5 0660
vc/[0-9]* 0:5 0660
# serial port devices
s3c2410_serial0 0:5 0666 =ttySAC0
s3c2410_serial1 0:5 0666 =ttySAC1
s3c2410_serial2 0:5 0666 =ttySAC2
s3c2410_serial3 0:5 0666 =ttySAC3
# loop devices
loop[0-9]* 0:0 0660 =loop/
# i2c devices
i2c-0 0:0 0666 =i2c/0
i2c-1 0:0 0666 =i2c/1
# frame buffer devices
fb[0-9] 0:0 0666
# input devices
mice 0:0 0660 =input/
mouse.* 0:0 0660 =input/
event.* 0:0 0660 =input/
ts.* 0:0 0660 =input/
# rtc devices
rtc0 0:0 0644 >rtc
rtc[1-9] 0:0 0644
# misc devices
mmcblk0p1 0:0 0600 =sdcard */bin/hotplug.sh
mmcblk0 0:0 0600 =mmcblk0 */bin/hotplug.sh
sda1 0:0 0600 =udisk * /bin/hotplug.sh
/bin/hotplug.sh
#!/bin/sh
case $MDEV in
sda1)
DEVNAME=udisk
MOUNTPOINT=/udisk
;;
mmcblk0p1)
DEVNAME=sdcard
MOUNTPOINT=/sdcard
;;
mmcblk0)
DEVNAME=mmcblk0
MOUNTPOINT=/sdcard
;;
*)
exit 0
;;
esac
case $ACTION in
remove)
/bin/umount $MOUNTPOINT || true
rmdir $MOUNTPOINT >/dev/null 2>&1 || true
;;
*)
/bin/mkdir $MOUNTPOINT > /dev/null 2>&1 || true
/bin/mount -o sync -o noatime -o nodiratime -t vfat /dev/$DEVNAME $MOUNTPOINT > /dev/null 2>&1 || true
;;
esac
exit 0