什么是Uevent机制?

uevent是kobject的一部分,用于在kobject状态发生改变时,例如增加、移除等,通知用户空间程序。用户空间程序收到这样的事件后,会做相应的处理。

uevent( user space event)是 内核与用户空间的一种基于netlink机制通信机制,主要用于设备驱动模型,常用于设备的热插拔。

uevent的机制是比较简单的,设备模型中任何设备有事件需要上报时,会触发uevent提供的接口。uevent模块准备好上报事件的格式后,可以通过两个途径把事件上报到用户空间:一种是通过kmod模块,直接调用用户空间的可执行文件;另一种是通过netlink通信机制,将事件从内核空间传递给用户空间。

其中:

  • netlink是一种socket,专门用来进行内核空间和用户空间的通信;
  • kmod是管理内核模块的工具集,类似busybox,我们熟悉的lsmod,insmod等是指向kmod的链接。

uevent helper是什么?

上文提到,在通过kmod向用户空间上报uevent的时候,会通过call_usermodehelper_exec直接执行用户空间的可执行文件。这个要执行的文件就是uevent helper。

uevent_helper的值在内核编译的时候,通过CONFIG_UEVENT_HELPER_PATH这个配置来指定。同时也可以在后期,通过修改/sys/kernel/uevent_helper文件,指定新的uevent helper.

它有什么问题?

如果启用了CONFIG_UEVENT_HELPER,那么,产生uevent的时候,内核会在[这里]运行新的uevent helper进程。也就是说,每次上报uevent,都会创建新的进程。

每次如果我们是在编译时静态指定uevent helper的话,在开机的时候,因为内核设备比较多,产生很多uevent,就会一下子创建很多进程,占用大量内存。如果内存不够,就有导致OOM的风险。

如何解决开机时uevent helper大量执行,导致oom的问题?

解法1

如果在你的场景下,不需要通过uevent helper来检测设备热插拔事件,那么就直接取消CONFIG_UEVENT_HELPER这个编译配置即可。

解法2

如果实在要用到uevent helper,那么建议在编译的时候,只启用CONFIG_UEVENT_HELPER而不设置CONFIG_UEVENT_HELPER_PATH的值,在系统启动后,再通过sysfs,把helper的路径写到/sys/kernel/uevent_helper,这样就能监测系统启动后的设备热插拔事件。

转载请注明来源:https://longjin666.cn/?p=1890

你也可能喜欢

发表评论