You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 20:12:42