Fedora 40内核驱动中call_usermodehelper调用失败求助
Fedora 40内核模块中call_usermodehelper调用失败的原因及解决方法
你的代码存在核心错误,导致在Fedora 40上调用失败,具体问题和修复方案如下:
1. 根本原因:多余的双引号
你在path、argv、envp的字符串中额外添加了双引号(比如"\"/bin/mkdir\""),这是完全错误的。call_usermodehelper直接将参数传递给可执行程序,不需要用引号包裹——引号是shell解析命令时的语法,内核调用用户程序时不需要这层包裹。
这种错误会导致:
- 内核尝试查找名为
"/bin/mkdir"(带引号)的可执行文件,显然不存在,因此返回-2(ENOENT,文件未找到) - 即使路径侥幸匹配,传递给
mkdir的参数会变成"-p"(带引号),而不是-p,程序无法识别该参数,返回错误码256
2. 修正后的代码
将所有字符串中的双引号去掉,正确代码如下:
static int __init call_usermodehelper_init(void) { int ret = -1; char path[] = "/bin/mkdir"; char *argv[] = {path, "-p", "/tmp/new_dir", NULL}; char *envp[] = {"HOME=/", "SHELL=/bin/bash", "TERM=linux", "PATH=/sbin:/bin:/usr/bin", NULL}; printk(KERN_INFO "call_usermodehelper module is starting..!\n"); ret = call_usermodehelper(path, argv, envp, UMH_WAIT_PROC); printk(KERN_INFO "ret=%d\n", ret); return 0; } module_init(call_usermodehelper_init);
3. 为什么Ubuntu/RHEL上能运行?
这属于偶然情况:旧版本内核或特定环境下,可能存在某种兼容处理(比如错误地解析了带引号的路径),但你的代码本身不符合call_usermodehelper的调用规范,Fedora 40的新版本内核(6.9.7)更严格地遵循调用规则,因此暴露了这个错误。
4. 额外注意事项
如果修正后仍失败,检查Fedora的SELinux设置:
- 临时关闭SELinux测试:
sudo setenforce 0 - 若关闭后正常,需为模块添加SELinux策略,避免后续被拦截
内容的提问来源于stack exchange,提问作者shp song
相关产品推荐
相关产品推荐

