文件系统子系统 · 核心问题问答精要
📖 推荐阅读:《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