最近在制作文件系统时发现总是不能自动执行mdev,提示:
“cannot create /proc/sys/kernel/hotplug: nonexistent directory”错误。
在网上查阅了很多资料也没有什么具体的解决办法,最后发现是一个很傻的错误,竟然是内核里面没有勾上hotplug选项,为了这个我可郁闷了好长时间的。
可惜busybox还是不能使用“上”键显示上一条指令,奇怪哦。
以下是启动过程,凑字数的嘿嘿
==================================
VFS: Mounted root (cramfs filesystem) readonly.
Freeing init memory: 68K
init started: BusyBox v1.9.2 (2008-08-15 10:15:54 CST)
starting pid 145, tty '': '/etc/init.d/rcS'
********************************
SEU 4020 ARM Linux-2.6.16
********************************
# mount all...........
# Starting mdev.........
starting pid 154, tty '': '/bin/sh'
Set search library path...........
/ # cd /dev
/dev # ls
console mtdblock3 ram7 tty18 tty32 tty47 tty61
full null ram8 tty19 tty33 tty48 tty62
kmem port ram9 tty2 tty34 tty49 tty63
kmsg ram0 random tty20 tty35 tty5 tty7
mem ram1 root tty21 tty36 tty50 tty8
mtd0 ram10 tty tty22 tty37 tty51 tty9
mtd0ro ram11 tty0 tty23 tty38 tty52 ttyS0
mtd1 ram12 tty1 tty24 tty39 tty53 ttyS1
mtd1ro ram13 tty10 tty25 tty4 tty54 ttyS2
mtd2 ram14 tty11 tty26 tty40 tty55 ttyS3
mtd2ro ram15 tty12 tty27 tty41 tty56 urandom
mtd3 ram2 tty13 tty28 tty42 tty57 vcs
mtd3ro ram3 tty14 tty29 tty43 tty58 vcsa
mtdblock0 ram4 tty15 tty3 tty44 tty59 zero
mtdblock1 ram5 tty16 tty30 tty45 tty6
mtdblock2 ram6 tty17 tty31 tty46 tty60
/dev #
2.mdev的hotplug模式
1, busybox 添加mdev支持
2, 在/etc/rc.d/rcS中添加
#mount filesystem /bin/mount -a #start mdev echo /sbin/mdev > /proc/sys/kernel/hotplug #设置系统的hotplug程序为mdev mdev –s |
/etc/fstab的内容如下:
proc /proc proc defaults 0 0 none /tmp ramfs defaults 0 0 mdev /dev ramfs defaults 0 0 sysfs /sys sysfs defaults 0 0 |
执行mdev -s :以‘-s’为参数调用位于 /sbin目录写的mdev(其实是个链接,作用是传递参数给/bin目录下的busybox程序并调用它),mdev扫描 /sys/class 和 /sys/block 中所有的类设备目录,如果在目录中含有名为“dev”的文件,且文件中包含的是设备号,则mdev就利用这些信息为这个设备在/dev 下创建设备节点文件。一般只在启动时才执行一次 “mdev -s”。
热插拔事件:由于启动时运行了命令:echo /sbin/mdev > /proc/sys/kernel/hotplug ,那么当有热插拔事件产生时,内核就会调用位于 /sbin目录的mdev。这时mdev通过环境变量中的 ACTION 和 DEVPATH,来确定此次热插拔事件的动作以及影响了/sys中的那个目录。接着会看看这个目录中是否有“dev”的属性文件,如果有就利用这些信息为这个设备在/dev 下创建设备节点文件。
解决使用mdev时“cannot create /proc/sys/kernel/hotplug:nonexistent directory”错误
确保编译内核时编译如下选项:
CONFIG_PROC_FS=y
CONFIG_PROC_SYSCTL=y
CONFIG_HOTPLUG=y
CONFIG_NET=y
如果CONFIG_HOTPLUG和CONFIG_NET不选或没全选上的话,/proc/sys/kernel下将不会创建hotplug文件.(参见kernel/sysctl.c)