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
一定要看docs/mdev.txt和examples/mdev.conf
一定要看docs/mdev.txt和examples/mdev.conf
关于初始化脚本的详细内容请参阅busybox的docs/mdev.txt文件,里面有详细的介绍,图片中仅展示部分内容:
如果你想使用完整mdev的功能,比如自动挂载/卸载,那么还应该有一个/etc/mdev.conf文件(此文件是可选的)。该文件在busybox的examples/mdev.conf中有参考例子。我在我的开发板上插入一个usb读卡器,/dev下会创建/dev/sda和/dev/sda1文件;当我拔下这个读卡器,/dev下的这两个文件就会消失,这意味着mdev已经在工作了,但系统并没有自动帮我对这个U盘进行挂载。为了实现这个功能,我直接拷贝了busybox根目录下的examples/mdev.conf文件到根文件系统的/etc目录下,我想实现当插入U盘后系统自动将U盘挂载到/media/$MDEV中。可以看到的是,/etc/mdev.conf中存在sd*的规则:
规则已经存在,但并没有实现相应的动作。这里需要提一下,mdev会遍历/sys/class和/sys/block中所有的类设备目录。在监听到设备变动后会将设备名设置到环境变量$MDEV中,而如果是插入设备的话环境变量$ACTION的值就是add。现在为sd*设备添加自动挂载的脚本/etc/automount:
#!/bin/sh
#echo $MDEV $ACTION
#echo 0 $0
echo 1 $1
echo 2 $2
#if [ $ACTION == "add" ]
if [ $2 == "add" ]
then
echo add $MDEV
mkdir -p /media/$MDEV
mount /dev/$MDEV /media/$MDEV
else
echo remove $MDEV
umount /media/$MDEV
rm -r /media/$MDEV
fi
(别忘了给automount脚本赋予可执行权限!)修改/etc/mdev.conf文件,指定用于处理的脚本:
此时,如果你插入U盘,可以使用df命令看到它已经被自动挂载了:
拔出U盘,再次使用df命令和ls命令:
如果你想为你的设备指定名字,可以在等于号后面附上名称,这样环境变量$MDEV的值就会改变。例如,我为我的sd*设备指定名称为my_sdcard:
保存,退出,插入U盘,可以看到名称由原来的的sd??变成了my_sdcard: