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

使用filp_open创建文件后系统启动后无法查看该文件的问题求助

内核态创建/tmp文件失败的问题分析与修复

核心问题点

1. 错误判断逻辑失效

你的file_open函数在filp为错误指针时返回NULL,但主代码里只用IS_ERR(fp)判断错误——IS_ERR仅能识别指向错误码的指针(如PTR_ERR返回的负数地址),无法检测NULL。这导致即使文件打开失败,printk也不会触发,你看不到任何错误提示。

2. /tmp目录挂载时机不匹配

内核启动阶段,/tmp通常还未挂载tmpfs(多数系统会在用户态初始化阶段完成挂载)。此时你创建的文件实际写入根文件系统的/tmp目录,但后续tmpfs挂载后会覆盖该目录,导致系统启动后看不到文件。

3. 父目录存在性未验证

如果根文件系统中原本没有/tmp目录,O_CREAT仅能创建文件,无法自动创建父目录,会直接导致文件创建失败。

修复方案

修正错误判断逻辑

修改file_open函数,直接返回filp(无论是否为错误指针),让调用者通过IS_ERR统一判断:

struct file *file_open(const char *path, int flags, int rights) 
{
    struct file *filp = NULL;
    mm_segment_t oldfs;

    oldfs = get_fs();
    set_fs(get_ds());
    filp = filp_open(path, flags, rights);
    set_fs(oldfs);
    return filp; // 直接返回,由调用者处理错误
}

同时更新主代码的错误处理,添加错误码打印:

struct file *fp;
fp = file_open("/tmp/sample-logfile", O_CREAT|O_WRONLY|O_TRUNC, 0666);
if (IS_ERR(fp)) {
    printk(KERN_EMERG "Create record file error! Err code: %ld\n", PTR_ERR(fp));
} else {
    file_close(fp);
}

调整文件路径或执行时机

  • 如果必须在内核启动早期执行,改用根文件系统中已存在的目录(如/var/log),避免依赖未挂载的tmpfs。
  • 若要使用/tmp,确保代码在用户态完成tmpfs挂载后再执行(比如通过内核模块加载时机控制)。

确保父目录存在

在创建文件前,先验证/tmp目录是否存在,若不存在可通过kern_path等内核API创建目录(需额外处理),或提前在根文件系统中创建该目录。

内容的提问来源于stack exchange,提问作者Ravi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 14:15:25