文件系统子系统 · 核心问题问答精要
📖 推荐阅读:《Yocto项目实战教程:高效定制嵌入式Linux系统》
🎥 更多学习视频请关注 B 站:嵌入式Jerry
📚 文件系统子系统 · 核心问题问答精要
📌 本文聚焦于 Linux 文件系统子系统中最常见、最具代表性的问题,涵盖从总体架构到关键结构体、再到实际实现与接口调用等方面。配合你构建的学习目录结构,形成有重点的掌握路径。
🔶 一、总体架构理解类

❓1. Linux 文件系统的整体结构如何划分?
答:
通常可分为三层结构:
- 应用层接口:如
open/read/write/ioctl等系统调用。 - VFS 抽象层:内核统一接口层,结构体如
file/inode/dentry/vfsmount。 - 具体实现层:ext4、tmpfs、procfs、sysfs 等文件系统,通过
register_filesystem()接入 VFS。
❓2. /proc 与 /sys 属于真实的文件系统吗?
答:
它们属于 虚拟文件系统:
/proc是procfs,用于展示进程/内存等信息;/sys是sysfs,展示设备树状结构;
它们没有落盘数据,不存在真实的块设备,只是在内存中由内核生成。
🔷 二、关键结构体与接口理解
❓3. file、inode、dentry 的职责分别是什么?
| 结构体 | 角色说明 |
|---|---|
file | 表示一次打开的文件,绑定 fd,进程相关 |
inode | 表示实际的文件或目录对象 |
dentry | 表示路径项,是 name → inode 的映射缓存 |
它们组合构成了文件系统操作的核心三元组。
❓4. 一个文件被打开两次,file 和 inode 有哪些区别?
答:
- 每次
open()都会新建一个file结构体; - 但多个
file可以共享同一个inode; file是**“一次打开的视角”,inode是“文件本体”**。
🟦 三、系统调用与路径解析类
❓5. open() 调用流程中都经过了哪些关键结构?
答:
系统调用 sys_open() 最终会:
- 通过
filename_lookup()查找路径; - 得到
dentry; - 拿到
inode; - 创建
file并返回fd。
关键函数如 do_filp_open() 位于 fs/namei.c。
❓6. read() 系统调用是如何到达实际驱动的?
答:
read() → vfs_read() → 调用 file->f_op->read();
而 file_operations 是由具体文件系统(如 ext4)或驱动注册提供的。
🟩 四、文件系统实现类
❓7. ext4 与 tmpfs 最大区别是什么?
| 项目 | ext4 | tmpfs |
|---|---|---|
| 类型 | 持久化文件系统 | 内存文件系统 |
| 存储介质 | 块设备 | RAM |
| 使用场景 | 根文件系统 | /tmp、/run |
❓8. rootfs 和 initramfs 的区别与联系?
答:
initramfs是启动时挂载的初始根文件系统(内核内嵌的 CPIO 格式);rootfs是一个逻辑挂载点,通常一开始挂载的是initramfs;- 后续会切换成实际的根文件系统(如 ext4)。
🟥 五、调试与通知机制类
❓9. 如何监控一个文件是否被修改?
答:
可使用 inotify 或 fanotify 接口:
inotify_add_watch()添加监听;- 内核通过 VFS 中的
fsnotify()分发事件; - 用户态使用
read()等待事件发生。
❓10. procfs 和 sysfs 是如何创建节点的?
答:
- 使用内核 API 如
proc_create()/proc_mkdir()创建procfs节点; - 使用
kobject_create_and_add()/device_create_file()添加sysfs节点; - 它们背后本质是操作 VFS 中的
dentry/inode结构体。
✅ 总结建议
| 建议 | 说明 |
|---|---|
| 🔹 优先掌握 VFS 三大结构体 | file、inode、dentry 是全局核心 |
| 🔹 结合实现与挂载机制 | 每种文件系统都有对应的注册、挂载路径 |
| 🔹 多读 namei.c / fs/*.c 源码 | 核心逻辑都集中在这里 |
| 🔹 关注 sysfs/procfs 实战用途 | debugfs/sysfs 在驱动调试中经常使用 |
📖 推荐阅读:《Yocto项目实战教程:高效定制嵌入式Linux系统》
🎥 更多学习视频请关注 B 站:嵌入式Jerry
