流程分析
inittab:
调用rcS
{
rcS:
mount -a 挂载fstab中的文件系统(dev、sys等)
{
fstab:
挂载
/dev
/proc
/sys
/tmp
}
启动hotplog,使用mdev -s监控热插拔硬件,自动创建硬件模块
设备节点,如果/etc/mdev.conf中有硬件描述,则按照里面的属性进行操作:
{
U盘
创建/dev设备节点等
}
insmod加载其他模块.ko
}
启动控制台shell
启动mdev,必须:
①busybox编译时,选择支持;
②在rcS中添加:
echo /sbin/mdev > /proc/sys/kernel/hotplug
mdev -s
③在/etc/下创建mdev.conf文件。
实例分析:
下面以一个usb摄像头的例子做演示,达到的效果:
当插入USB摄像头的时候,系统自动执行mjpg-streamer
在mdev.conf中添加:
video0 0:0 777 * /etc/auto_mjpg_streamer.sh
在etc下创建auto_mjpg_streamer.sh脚本:
#!/bin/sh
if [ $ACTION = "add" ]; #这里的语法好恶心,括号两边要加空格
then
/opt/mjpeg/mjpg_streamer -i "/opt/mjpeg/input_uvc.so -y" -o "/opt/mjpeg/output_http.so -w ./www" &
echo -e "Find /dev/video0,Starting Mjpg-streamer.\n"
else
killall mjpg_streameri
echo -e "Disconnect /dev/video0,Closing Mjpg-streamer.\n"
fi
最后为脚本添加执行权限:
chmod +x auto_mjpg_streamer.sh
试验中发现一个奇怪的现象:
上电如果USB连接着摄像头,则挂载文件系统之后,“断开连接”中的脚本命令会被执行,此时只有重新插拔摄像头,mjpg-streamer才会被正确启动,未查明原因。
Udev
添加的规则在/etc/udev/rules.d/中:
ACTION!=”add”,GOTO=”farsight”
KERNEL==”sd[a-z][0-9]”,RUN+=”/sbin/mount-usb.sh %k”
LABEL=”farsight”
在/sbin/下创建mount-usb.sh文件添加如下内容:
#!/bin/sh
/bin/mount -t vfat /dev/$1 /tmp
sync
P.S.:对于KERNEL参数完全匹配的时候,/dev中的设备节点将会消失,此时可以指定NAME=”%k”创建名为内核设备名的节点。