【linux系列】实现基于模块的文件系统
编译环境
- 虚拟机操作系统:
ubuntu-20.04.3-desktop-amd64
- 原系统内核版本:
5.11.0-46-generic
- 内核源码版本:
5.11.1
修改任务
基础任务
- 修改XFS文件系统的源代码,实现新的文件系统。
- 至少需要修改文件系统的名称。
- 可以动态加载和卸载新的文件系统。
- 列出操作系统中包含的文件系统列表,其中要有自己改名后的文件系统。
进阶任务
- 重新编译Linux内核,以模块编译方式,将文件系统编入内核。
修改准备
- 下载内核源码
- 进入到 fs 文件夹下,复制 xfs 源码,以防修改错误导致无法恢复
sudo cp -r xfs hwhxfs
- 如下图所示
修改源码
-
所需修改的文件,均在 hwhxfs 文件夹下
Makefile xfs_super.c xfs_sysctl.c
修改 Makefile
- 使用 gedit 打开 Makefile
sudo gedit Makefile
- 修改
ccflags-y
# 修改后
ccflags-y += -I $(src) # needed for trace events
ccflags-y += -I $(src)/libxfs
- 修改
obj-$(CONFIG_XFS_FS)
# 修改后
obj-$(CONFIG_XFS_FS) += hwhxfs.o
- 修改左侧所有 xfs 为自己的名称,这里均修改为 hwhxfs
修改 xfs_super.c
-
使用 gedit 打开 xfs_super.c
sudo gedit xfs_super.c
-
搜索
"xfs"
-
将这两个对应修改为自己的名字,这里修改为 hwhxfs,如下图
修改 xfs_sysctl.c
-
使用 gedit 打开 xfs_sysctl.c
sudo gedit xfs_sysctl.c
-
搜索
"xfs"
-
将其对应修改为自己的名字,这里修改为 hwhxfs,如下图
编译模块
- 确保在 hwhxfs 目录下
- 执行编译命令
sudo make -C /usr/src/linux-5.11.1/ M=$PWD
- 编译成功后会在 hwhxfs 目录下生成 hwhxfs.ko 文件
安装模块
- 添加依赖
sudo modprobe libcrc32c
注:一般会缺少此依赖,并在安装模块时报告如下错误
insmod: ERROR: could not insert module hwhxfs.ko: Unknown symbol in module
可以使用 modinfo ./hwhxfs.ko | grep depend
命令查看需要加载的依赖
- 安装模块
sudo insmod hwhxfs.ko
- 查看已安装模块
lsmod
效果如下:
挂载文件系统
-
为什么要进行挂载呢?
- 每个文件系统都有独立的inode、区块、超级区块等信息,这个文件系统要能够链接到目录树才能被我们使用。而将文件系统与目录树结合的操作称之为挂载。
-
挂载文件系统的命令
mount -t 文件系统 设备文件名 挂载点
-
文件系统:这里已经准备好了 hwhxfs 文件系统
-
挂载点:一个目录,是文件系统的入口,我们可以在
/mnt
下新建个目录作为挂载点sudo mkdir /mnt/xfs
-
设备文件名:设备文件,我们需要对磁盘进行分区以分配给文件系统一个存储设备
-
查看磁盘信息
sudo parted /dev/sda print
-
分区表格式有两种,即MBR(msdos)和GPT,MBR使用
fdisk
分区,GPT使用gdisk
进行分区。 -
这里使用
fdisk
进行分区sudo fdisk /dev/sda
-
按
n
新建分区 -
若出现 无空闲扇区可用 表明当前磁盘空间不足无法进行分区
-
此时如果是虚拟机,可以通过添加磁盘来解决
-
关机打开虚拟机设置,添加磁盘
-
一律下一步,分配磁盘空间时分配 1G 即可,更多也可以
-
添加新磁盘完成后,重启虚拟机
-
查看新增磁盘的名字
lsblk -l
-
用
fdisk
对新增磁盘进行分区(建议先输入 m 获取 fdisk 使用帮助)sudo fdisk /dev/sdb
-
安装 xfsprogs
sudo apt install xfsprogs
-
格式化分区,将分区格式化为 xfs 类型
sudo mkfs.xfs /dev/sdb4
-
挂载文件系统
sudo mount -t hwhxfs /dev/sdb4 /mnt/xfs
-
使用
df -h
命令查看
-
卸载文件系统
sudo umount /mnt/xfs
进阶任务
- 将文件系统以模块的形式编入内核
- 所需修改的文件如下
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-
编译安装
-
修改配置
sudo make gconfig
-
在
File systems
下找到HWHXFS
设置为模块编译,如下图
-
保存配置
-
编译安装内核,重启
-
使用
modprobe hwhxfs
安装模块 -
内核编译相关问题可以参考我之前的文章,【linux系列】内核编译最新教程+常见问题总结