【linux系列】实现基于模块的文件系统

编译环境

  • 虚拟机操作系统: ubuntu-20.04.3-desktop-amd64
  • 原系统内核版本:5.11.0-46-generic
  • 内核源码版本:5.11.1

修改任务

基础任务

  • 修改XFS文件系统的源代码,实现新的文件系统。
  • 至少需要修改文件系统的名称。
  • 可以动态加载和卸载新的文件系统。
  • 列出操作系统中包含的文件系统列表,其中要有自己改名后的文件系统。

进阶任务

  • 重新编译Linux内核,以模块编译方式,将文件系统编入内核。 ### 修改准备
  • 下载内核源码
  • 进入到 fs 文件夹下,复制 xfs 源码,以防修改错误导致无法恢复
1
sudo cp -r xfs hwhxfs
  • 如下图所示

修改源码

  • 所需修改的文件,均在 hwhxfs 文件夹下
1
2
3
4
5
Makefile

xfs_super.c

xfs_sysctl.c

修改 Makefile

  • 使用 gedit 打开 Makefile
1
sudo gedit Makefile
  • 修改 ccflags-y
1
2
3
# 修改后
ccflags-y += -I $(src) # needed for trace events
ccflags-y += -I $(src)/libxfs
  • 修改 obj-$(CONFIG_XFS_FS)
1
2
# 修改后
obj-$(CONFIG_XFS_FS) += hwhxfs.o
  • 修改左侧所有 xfs 为自己的名称,这里均修改为 hwhxfs

修改 xfs_super.c

  • 使用 gedit 打开 xfs_super.c
1
sudo gedit xfs_super.c
  • 搜索 "xfs"

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

修改 xfs_sysctl.c

  • 使用 gedit 打开 xfs_sysctl.c
1
sudo gedit xfs_sysctl.c
  • 搜索 "xfs"

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

编译模块

  • 确保在 hwhxfs 目录下
  • 执行编译命令
1
sudo make -C /usr/src/linux-5.11.1/ M=$PWD
  • 编译成功后会在 hwhxfs 目录下生成 hwhxfs.ko 文件

安装模块

  • 添加依赖
1
sudo modprobe libcrc32c

注:一般会缺少此依赖,并在安装模块时报告如下错误

1
insmod: ERROR: could not insert module hwhxfs.ko: Unknown symbol in module

可以使用 modinfo ./hwhxfs.ko | grep depend 命令查看需要加载的依赖


  • 安装模块
1
sudo insmod hwhxfs.ko
  • 查看已安装模块
1
lsmod

效果如下:


挂载文件系统

  • 为什么要进行挂载呢?
    • 每个文件系统都有独立的inode、区块、超级区块等信息,这个文件系统要能够链接到目录树才能被我们使用。而将文件系统与目录树结合的操作称之为挂载。
  • 挂载文件系统的命令
1
mount -t 文件系统 设备文件名 挂载点
  • 文件系统:这里已经准备好了 hwhxfs 文件系统
  • 挂载点:一个目录,是文件系统的入口,我们可以在 /mnt 下新建个目录作为挂载点
1
sudo mkdir /mnt/xfs
  • 设备文件名:设备文件,我们需要对磁盘进行分区以分配给文件系统一个存储设备
  • 查看磁盘信息
1
sudo parted /dev/sda print

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

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

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

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

  • fdisk 对新增磁盘进行分区(建议先输入 m 获取 fdisk 使用帮助)
1
sudo fdisk /dev/sdb

  • 安装 xfsprogs
1
sudo apt install xfsprogs
  • 格式化分区,将分区格式化为 xfs 类型
1
sudo mkfs.xfs /dev/sdb4
  • 挂载文件系统
1
sudo mount -t hwhxfs /dev/sdb4 /mnt/xfs
  • 使用 df -h 命令查看

  • 卸载文件系统
1
sudo umount /mnt/xfs

进阶任务

  • 将文件系统以模块的形式编入内核
  • 所需修改的文件如下
1
2
3
4
5
fs/Kconfig
fs/Makefile

fs/hwhxfs/Kconfig
fs/hwhxfs/Makefile

修改 fs/hwhxfs/Kconfig

  • Kconfig 中所有 XFS 替换为 HWHXFS

修改 fs/hwhxfs/Makefile

  • 将 Makefile 中所有 XFS 替换为 HWHXFS

修改 fs/Kconfig

  • Kconfig 中搜索 xfs,对应添加一行 source

修改 fs/Makefile

  • Makefile 中搜索 xfs,对应添加一行 obj-


编译安装

  • 修改配置
1
sudo make gconfig
  • File systems 下找到 HWHXFS 设置为模块编译,如下图


【linux系列】实现基于模块的文件系统
https://hwh-2019.github.io/2022/12/10/【linux系列】实现基于模块的文件系统/
作者
HWH
发布于
2022年12月10日
许可协议