网站开发公司计划书,互联网之光博览会预约,电商建站工具,做网站的去哪找客户1.了解mdev mdev是busybox自带的一个简化版的udev。udev是从Linux 2.6 内核系列开始的设备文件系统#xff08;DevFS#xff09;的替代品#xff0c;是 Linux 内核的设备管理器。总的来说#xff0c;它取代了 devfs 和 hotplug#xff0c;负责管理 /dev 中的设备节点。同时…1.了解mdev mdev是busybox自带的一个简化版的udev。udev是从Linux 2.6 内核系列开始的设备文件系统DevFS的替代品是 Linux 内核的设备管理器。总的来说它取代了 devfs 和 hotplug负责管理 /dev 中的设备节点。同时udev 也处理所有用户空间发生的硬件添加、删除事件以及某些特定设备所需的固件加载。比如当我们插入U盘后udev会自动在/dev下创建设备节点同时将U盘挂载到系统中当拔掉U盘后udev又会自动删除/dev下U盘的设备节点以及挂载的目录。mdev是udev的简化版因此它的工作和udev是相同的。
mdev需要内核sysfs的支持。为了使用动态更新的功能同要需要配置内核支持热拔插。
要使用mdev功能应在编译busybox时在menconfig的Linux System Utilities中勾选上支持mdev的选项以及在编译kernel时勾选上支持hotplug。如果你对mdev的配置方法不熟悉请
一定要看docs/mdev.txt和examples/mdev.conf
关于初始化脚本的详细内容请参阅busybox的docs/mdev.txt文件里面有详细的介绍
下面这张图片展示几个关键的内容 linux的内核的第一个程序是/etc/init.d/rcS
2.配置1
我的配置如下 /etc/init.d # cat rcS #!/bin/sh/bin/mount -t proc none /proc /bin/mount -t sysfs sysfs /sys /bin/mount -t ramfs /tmp /bin/mount -t ramfs /mnt #/bin/mkdir /mnt/pts #/bin/mount -t devpts devpts /dev/pts /bin/echo /dev/mdev.seq/bin/echo /bin/mdev /proc/sys/kernel/hotplug/bin/mdev -s insmod /usr/drivers_demo/mpu6050d.ko source /etc/profile 3.配置2
/bin/echo /bin/mdev /proc/sys/kernel/hotplug的运行之前需要配置脚本的路径 这样系统启动时执行了命令echo /sbin/mdev /proc/sys/kernel/hotplug当那么当有热插拔事件产生时内核就会调用位于/sbin目录的mdev。这时mdev通过环境变量中的 ACTION和DEVPATH(这两个变量是系统自带的)来确定此次热插拔事件的动作以及影响了/sys 中的那个目录。接着会看看这个目录中是否有 dev 的属性文件如果有就利用这些信息为这个设备在/dev下创建设备节点文件。 # cat /etc/mdev.conf mmcblk([0-9])p([0-9]) 0:0 660 */sbin/automount.sh $MDEV X${ACTION} mmcblk([0-9]) 0:0 660 */sbin/automount.sh $MDEV X${ACTION}sd([a-z])([0-9]) 0:0 660 */sbin/automount.sh $MDEV X${ACTION} sd([a-z]) 0:0 660 */sbin/automount.sh $MDEV X${ACTION} #mtdblock([0-9]) 0:0 660 */sbin/automount.sh $MDEV X${ACTION} for usb sd[a-z][0-9]
for sd/mmc cardmmcblk[0-9]p[0-9] 0:6
指令device regex uid:gid octal permissions [|$|* command] 特殊字符的意义如下: :在创建设备节点后运行命令。 $:在删除设备节点前运行命令。 *:在创建设备节点和删除设备节点前都运行命令。 Command :对应的shell—般位于letc/mdev目录 为了利用脚本(如Shell脚本automout.sh实现u盘在嵌入式系统上的自动挂载在mdev规则文件/sbin/automount.sh中加入以下一行匹配规则使mdev在找到匹配行时可以执行用户自定义的命令( shell脚本中的内容): sd[a-z][0-9]* 0:0 0600 */sbin/automount.sh $MDEV 4.脚本automount.sh
上一个配置已经指定脚本和路径现在实现如下 # cat /sbin/automount.sh
#! /bin/sh# debugging message
#echo MDEV$1 : ACTION$2 : SUBSYSTEM$SUBSYSTEM : DEVPATH$DEVPATH : DEVNAME$DEVNAME /dev/consoleif [ $1 ]; thenecho parameter is none /tmp/error.txtexit 1
fiMNT$1
#if [ $(echo $1 | grep mmcblk) ]; then
# if [ $(echo $1 | grep p[25]) ]; then
# MNTsdcard2
# else
# MNTsdcard
# fi
#elif [ $(echo $1 | grep sd) ]; then
# if [ $(echo $1 | grep p[25]) ]; then
# MNTnandcard2
# else
# MNTnandcard
# fi
#fi# there is no ACTION, it is for initial population
if [ $2 X ]; thenmountedmount | grep $1 | wc -lif [ $mounted -ge 1 ]; then# mounted, assume the ACTION is remove#ACTXremove# only set add for initial populationACTXaddelse# not mounted, assume the ACTION is addACTXaddfi
elseACT$2
fiif [ $ACT Xremove ]; then# umount the deviceecho $ACT /mnt/$1 /tmp/mdev.logif ! umount -l /mnt/$1; thenexit 1elserm -f /mnt/$MNTecho [Umount FS]: /dev/$1 -X- /mnt/$MNT /dev/consolefiif ! rmdir /mnt/$1; thenexit 1fi
else# mount the devicemountedmount | grep $1 | wc -l#echo par$1,mounted$mounted,MNT$MNT /dev/consoleif [ $mounted -ge 1 ]; then#echo device $1 is already mounted /dev/consoleexit 0fiif ! mkdir -p /mnt/$1; thenexit 1fiif [ $(echo $1 | grep mtd) ]; thenif mount -t jffs2 /dev/$1 /mnt/$1; thenecho [Mount JFFS2]: /dev/$1 -- /mnt/$MNT /dev/consoleecho $ACT /mnt/$1 /tmp/mdev.logelif mount -t yaffs2 -oinband-tags /dev/$1 /mnt/$1; thenecho [Mount YAFFS2]: /dev/$1 -- /mnt/$MNT /dev/consoleecho $ACT /mnt/$1 /tmp/mdev.logelif mount -t ubifs /dev/$1 /mnt/$1; thenecho [Mount UBIFS]: /dev/$1 -- /mnt/$MNT /dev/consoleecho $ACT /mnt/$1 /tmp/mdev.logelse# failed to mount, clean up mountpointif ! rmdir /mnt/$1; thenexit 1fifielse# try vfat onlyif mount -t vfat -o noatime,shortnamemixed,utf8 /dev/$1 /mnt/$1; thenln -s /mnt/$1 /mnt/$MNTecho [Mount VFAT]: /dev/$1 -- /mnt/$MNT /dev/consoleecho $ACT /mnt/$1 /tmp/mdev.logelse# failed to mount, clean up mountpointif ! rmdir /mnt/$1; thenexit 1fiexit 1fifi
fi5.测试 6.如果我想把automount.sh放到其他地方如何修改启动文件
自启动脚本添加如下内容
添加下面两条指令到mdev.conf
sd([a-z])([0-9]) 0:0 660 */home/fhsj_app/automount.sh $MDEV X${ACTION}
sd([a-z]) 0:0 660 */home/fhsj_app/automount.sh $MDEV X${ACTION}
确保/home/fhsj_app/下面有automount.sh(或者是你自己的目录)的脚本且权限660以上加入热插拔和自动挂载的指令
/sbin/echo /sbin/mdev /proc/sys/kernel/hotplug
/sbin/mdev -s
我的自启动脚本如下 awk 1; END {print sd([a-z])([0-9]) 0:0 660 */home/fhsj_app/automount.sh $MDEV X${ACTION}} /etc/mdev.conf /tmp/mdev.conf mv /tmp/mdev.conf /etc/mdev.conf awk 1; END {print sd([a-z]) 0:0 660 */home/fhsj_app/automount.sh $MDEV X${ACTION}} /etc/mdev.conf /tmp/mdev.conf mv /tmp/mdev.conf /etc/mdev.conf /sbin/echo /sbin/mdev /proc/sys/kernel/hotplug /sbin/mdev -s