缘起
- 来自于2023年1月想找一个新的年度的topic来深入一下,正好看了操作系统,就想看下文件系统,之前也看过,无疾而终,一般也就开了个头,然后就没有然后了。
- 看看自己一本内核书上的零星笔记就是这样,于是在某乎上找了下看看是不是有学习曲线啥的,现在吧我已经不太贪一些高大上的书,或经典的书了,因为以我的水平,基本上是看不搞的,我只能先从基本的看起。
- 本文也许更适合基础差或非科班的人看,大佬可能会觉得简单。
内容
一、前置知识
- 翻看下《操作系统》书中的文件系统章节中的“文件目录”章节中的,文件控制块、目录项啥的有个概念,有一点linux的树形文件的概念
- 《Linux内核探秘 深入解析文件系统和设备驱动的架构与设计》中的chap2文件系统,了解一下超级块super_block、目录项dentry、索引节点inode这些结构体
- hellofs代码下载,原作者的,我就不放我的注释后的链接了。
二、动手实践
- 想在设备上跑一下的,我自己在NAS上装了个docker(centos7)和raspberry上跑了一下,能编译出.ko文件,但不能
inmod,目前来看是header版本不一样。- 刚看作者回复的帖子上写的是centos6,我有空在docker上装个再试下
三、源码
2.1、写在前面
- 作者用的还是VFS能力,但还是自己定义了上面这些结构体,operation是个很重要的机制,本质上应用是回调
- 读了3回
- 1、刚下载过来时,粗略看了一下,基本没看出来啥,看看入口,看看脚本
- 2、01-28,粗略看过一遍《Linux内核探秘》chap2后,折腾环境时,又花了40min看了下代码,不太懂里面的调用关系
- 3、02-02,对着代码过了一遍《Linux内核揭秘》chap02后,再看这个架构基本就符合书中的aufs。
- 整体架构
- 1、module里的
hellofs_init去调用register_filesystem(&hellofs_fs_type),作用是把文件系统登记到内核。- 注意一下参数里面的结构体,用
struct file_system_type定义了,指定了hellofs_mount和hellofs_kill_superblock
- 注意一下参数里面的结构体,用
- 2、super.c中
hellofs_mount挂载,为了申请相应的结构体,用mount_bdev(),去调用hellofs_fill_super() - 3、在文件系统内创建目录和文件
- 1、module里的
2.2、源码结构
2.2.1、main方法
- hellofs.h和mkfs-hellofs.c,可以后面看,往对应结构里放数据
2.2.2、创建内核module
hellofs_init去调用register_filesystem(&hellofs_fs_type),作用是把文件系统登记到内核。
2.2.3、挂载mount
-
相当于把super.c、inode.c、file.c、dir.c关联起来了
-
super.c里实现,不仅实现了**
hellofs_fill_super,也有hellofs_get_hellofs_inode,还有hellofs_fill_inode**,实现了结构体的分配和填充 -
inode.c
-
dir.c和file.c怎么关联呢,通过
hellofs_fill_inode()填充了``inode->i_fop`inode->i_fop = &hellofs_file_operations;inode->i_fop = &hellofs_dir_operations;- 它们是啥操作是由
hellofs_inode->mode的值决定的
2.3、逐行读代码
- 这个确实没读
- 大概记了一下,内核中的
sb_bread()new_inodeinode_init_owner
- 总体来说,业务不复杂,就是结构体字段要熟悉一点。
四、下阶段
- 想输出《Linux内核探秘》自己的读书笔记,而不是摘要笔记,毕竟内核代码可以在线看的elixir.bootlin.com/linux/v2.6.…
- 继续啃源码,想厘清一下作者说的device mapper概念
- zfs也开始同步看起来,先往收纳箱里放着,到时需要再自己整理一下,前期看不太懂的时候,多去回顾,多去看几遍,应该会有收获。
最后
- 2023-02-02花了40min写了一下,有空的时候,再逐行把源码给注释了,找个假期吧,打工期间不太有空。
- 刚开始看时,觉得没啥头绪,现在看来好像也没啥东西,整体能串起来,但细节可能还是不清楚。
- 感谢祁老板的赠书,我看下去了,对我帮助挺大的。
- 可能把这个框架整完后,内核中的autofs,sysfs,可能都差不多。