202301阅读hellofs源码

124 阅读3分钟

缘起

  • 来自于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_mounthellofs_kill_superblock
    • 2、super.c中hellofs_mount挂载,为了申请相应的结构体,用mount_bdev(),去调用hellofs_fill_super()
    • 3、在文件系统内创建目录和文件

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_inode
    • inode_init_owner
  • 总体来说,业务不复杂,就是结构体字段要熟悉一点

四、下阶段

  • 想输出《Linux内核探秘》自己的读书笔记,而不是摘要笔记,毕竟内核代码可以在线看的elixir.bootlin.com/linux/v2.6.…
  • 继续啃源码,想厘清一下作者说的device mapper概念
  • zfs也开始同步看起来,先往收纳箱里放着,到时需要再自己整理一下,前期看不太懂的时候,多去回顾,多去看几遍,应该会有收获。

最后

  • 2023-02-02花了40min写了一下,有空的时候,再逐行把源码给注释了,找个假期吧,打工期间不太有空。
  • 刚开始看时,觉得没啥头绪,现在看来好像也没啥东西,整体能串起来,但细节可能还是不清楚。
  • 感谢祁老板的赠书,我看下去了,对我帮助挺大的。
  • 可能把这个框架整完后,内核中的autofs,sysfs,可能都差不多。