[TOC] mdev說明 mdev是busybox自帶的一個簡化版的udev,適合嵌入式應用場合。其具有使用簡單的特點。它的作用就是在 系統啟動 和 熱插拔 或 動態載入驅動程式 時,自動產生驅動程式所需要的節點文件。在以busybox為基礎構建嵌入式linux根文件系統時,使用它時最優的選擇。 m ...
[TOC]
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