【linux系列】实现基于模块的文件系统
编译环境
- 虚拟机操作系统:
ubuntu-20.04.3-desktop-amd64 - 原系统内核版本:
5.11.0-46-generic - 内核源码版本:
5.11.1
修改任务
基础任务
- 修改XFS文件系统的源代码,实现新的文件系统。
- 至少需要修改文件系统的名称。
- 可以动态加载和卸载新的文件系统。
- 列出操作系统中包含的文件系统列表,其中要有自己改名后的文件系统。
进阶任务
- 重新编译Linux内核,以模块编译方式,将文件系统编入内核。 ### 修改准备
- 下载内核源码
- 进入到 fs 文件夹下,复制 xfs 源码,以防修改错误导致无法恢复
1 | |
- 如下图所示

修改源码
- 所需修改的文件,均在 hwhxfs 文件夹下
1 | |
修改 Makefile
- 使用 gedit 打开 Makefile
1 | |
- 修改
ccflags-y
1 | |
- 修改
obj-$(CONFIG_XFS_FS)
1 | |
- 修改左侧所有 xfs 为自己的名称,这里均修改为 hwhxfs

修改 xfs_super.c
- 使用 gedit 打开 xfs_super.c
1 | |
- 搜索
"xfs"

- 将这两个对应修改为自己的名字,这里修改为 hwhxfs,如下图

修改 xfs_sysctl.c
- 使用 gedit 打开 xfs_sysctl.c
1 | |
- 搜索
"xfs"

- 将其对应修改为自己的名字,这里修改为 hwhxfs,如下图

编译模块
- 确保在 hwhxfs 目录下
- 执行编译命令
1 | |
- 编译成功后会在 hwhxfs 目录下生成 hwhxfs.ko 文件

安装模块
- 添加依赖
1 | |
注:一般会缺少此依赖,并在安装模块时报告如下错误
1 | |
可以使用 modinfo ./hwhxfs.ko | grep depend
命令查看需要加载的依赖
- 安装模块
1 | |
- 查看已安装模块
1 | |
效果如下: 
挂载文件系统
- 为什么要进行挂载呢?
- 每个文件系统都有独立的inode、区块、超级区块等信息,这个文件系统要能够链接到目录树才能被我们使用。而将文件系统与目录树结合的操作称之为挂载。
- 挂载文件系统的命令
1 | |
- 文件系统:这里已经准备好了 hwhxfs 文件系统
- 挂载点:一个目录,是文件系统的入口,我们可以在
/mnt下新建个目录作为挂载点
1 | |
- 设备文件名:设备文件,我们需要对磁盘进行分区以分配给文件系统一个存储设备
- 查看磁盘信息
1 | |

- 分区表格式有两种,即MBR(msdos)和GPT,MBR使用
fdisk分区,GPT使用gdisk进行分区。 - 这里使用
fdisk进行分区
1 | |
- 按
n新建分区 - 若出现 无空闲扇区可用 表明当前磁盘空间不足无法进行分区

- 此时如果是虚拟机,可以通过添加磁盘来解决
- 关机打开虚拟机设置,添加磁盘

- 一律下一步,分配磁盘空间时分配 1G 即可,更多也可以

- 添加新磁盘完成后,重启虚拟机
- 查看新增磁盘的名字
1 | |

- 用
fdisk对新增磁盘进行分区(建议先输入 m 获取 fdisk 使用帮助)
1 | |

- 安装 xfsprogs
1 | |
- 格式化分区,将分区格式化为 xfs 类型
1 | |
- 挂载文件系统
1 | |
- 使用
df -h命令查看

- 卸载文件系统
1 | |
进阶任务
- 将文件系统以模块的形式编入内核
- 所需修改的文件如下
1 | |
修改 fs/hwhxfs/Kconfig
- 将 Kconfig 中所有
XFS替换为HWHXFS

修改 fs/hwhxfs/Makefile
- 将 Makefile 中所有
XFS替换为HWHXFS

修改 fs/Kconfig
- 在 Kconfig 中搜索
xfs,对应添加一行source

修改 fs/Makefile
- 在 Makefile 中搜索
xfs,对应添加一行obj-

编译安装
- 修改配置
1 | |
- 在
File systems下找到HWHXFS设置为模块编译,如下图

- 保存配置
- 编译安装内核,重启
- 使用
modprobe hwhxfs安装模块 - 内核编译相关问题可以参考我之前的文章,【linux系列】内核编译最新教程+常见问题总结
【linux系列】实现基于模块的文件系统
https://hwh-2019.github.io/2022/12/10/【linux系列】实现基于模块的文件系统/