[Linux]解决使用mdev时“cannot create /proc/sys/kernel/hotplug: nonexistent directory”错误

时间:2022-09-13 00:05:34

最近在制作文件系统时发现总是不能自动执行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支持

[Linux]解决使用mdev时“cannot create /proc/sys/kernel/hotplug: nonexistent directory”错误

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)