linux中xfs文件系统模块化详解

       最近在做操作系统的课程设计,做的是实现基于模块的文件系统。先后查了很多资料,网上有关的或者是解决我问题的实在是太少了,基本没有,在经过摸索之后终于实现了,记录一下供大家参考。
       首先说一下我做的内容,实现基于模块化的xfs文件系统,复制xfs文件系统的源代码,修改xfs文件系统的名字,实现一个新的文件系统,然后对新的文件系统进行挂载。

一、编译内核

       首先下载linux内核的源码,可以先在自己的linux终端输入uname -r,查看一下自己linux内核的版本。如下所示:
linux中xfs文件系统模块化详解
       我的linux版本是3.10的,所以你可以在官网上(官网链接,点我下载)下载3.10左右版本的Linux内核源码。这个根据自己的版本下载相应的版本。官网上下载可能比较慢,这里给大家提供一个下载比较快的地址:内核源码下载链接点击之后,选择相应的版本下载就好。
linux中xfs文件系统模块化详解
linux中xfs文件系统模块化详解
       下载的时候压缩包选择.gz或者.xz都是可以的,下载之后将使用命令cp linux-3.12.66.tar.gz /usr/src将其复制到/usr/src目录下。
       然后进行解压。解压时,如果你下的是.tar.gz文件,使用命令tar zxvf linux-3.12.66.tar.gz进行解压,如果你下载的是.tar.xz文件,先使用xz -d linux-3.12.66.tar.xz将该文件解压成.tar文件,然后使用命令tar xvf linux-3.12.66.tar进行解压,解压后的文件在linux-3.12.66文件夹下。
       切换到linux-3.12.66文件夹下,输入命令make menuconfig,进入如下界面,初次可能会提示缺少依赖,我的是缺少ncurses-devel,这个你使用命令yum -y install ncurses-devel下载就好,总之就是缺少什么你就下什么。
linux中xfs文件系统模块化详解
       然后选择需要模块化编译的地方,我的是实现xfs文件系统模块化,因此选择进入File systems。进入后选择需要模块化的文件系统。即通过空格键来选择是M还是 *,M表示模块化,而 * 表示编译内核时就将该模块编译进去,后期无法*删除修改。我们这里将xfs文件系统选为M,其实本身就是M,选好之后保存会生成一个.config文件,点击ok并退出到终端。
linux中xfs文件系统模块化详解
       如果不放心的话,你还可以使用命令gedit .config,进入.config文件,输入ctrl+f查找xfs,看是不是模块化编译,即XFS_FS是不是等于m,如下所示:
linux中xfs文件系统模块化详解
       接下来就是编译内核了,使用命令make -j8。编译的命令是make,后面的 -j8 是为了加快速度,具体解释大家可以参考一下《linux内核设计与实现》这本书中的解释,如下所示:
linux中xfs文件系统模块化详解
       编译大概半个小时左右吧,编译完之后你就可以进行安装了,即相继执行以下命令(后面的-j4解释同上):

  1. make modules_install -j4
  2. make install -j4
  3. reboot

二、编译模块

       重启之后,你就会看见如下界面,其中第一个是我们刚刚编译安装的内核,即3.12.66版本;而第2个是我们原来的版本,3.10.0。我们选择进入我们新编译生成的版本,即3.12.66版本。
linux中xfs文件系统模块化详解
       进入之后,我们切换到/usr/src/linux-3.12.66/fs目录下,将该目录下的xfs文件系统复制并修改名字,例如我的修改为ghcxfs,这样做的只是为了备份,防止后面你把这个文件系统玩坏了,又回不去了。
       改完之后,进入ghcxfs文件系统下,在Makefile文件中修改该文件系统的名字,输入命令vi Makefile,进入到Makefile文件,具体的vim的使用可以参考一下我的博客:vim学习笔记(一)。Makefile文件修改前后对比如下所示:

修改前:

linux中xfs文件系统模块化详解

修改后(修改过的部分用红框圈出来了):
linux中xfs文件系统模块化详解
       修改完Makefile文件之后,接下来修改的是super.c文件,使用命令vi xfs_super.c,在xfs_super.c文件中搜索 xfs_fs_type,修改其name属性,即将xfs修改为你的文件系统的名字,我这里修改成ghcxfs。如下所示:
linux中xfs文件系统模块化详解
       改完这些之后,我们就可以编译模块了,执行make -j4就会产生ghcxfs.ko文件,接下来就是插入模块,即执行命令:insmod ghcxfs.ko

三、文件系统的挂载与卸载

       文件系统的挂载与卸载,我基本都是参考《鸟哥的linux私房菜—基础学习篇》来的,具体如下:
       为什么要进行挂载呢?每个文件系统都有独立的inode、区块、超级区块等信息,这个文件系统要能够链接到目录树才能被我们使用。而将文件系统与目录树结合的操作称之为挂载
       我们看一下挂载文件系统的命令:mount -t 文件系统 设备文件名 挂载点
       从挂载命令我们可以看出,我们挂载一个文件系统还需要一个设备文件名,和一个挂载点。首先说一下什么是挂载点,其实挂载点就是一个目录,该目录为进入该文件系统的入口。那么我们在/mnt下新建一个目录作为挂载点,即执行命令:mkdir /mnt/ghcxfs,目录名可以随便起。
       接下来我们还需要一个设备文件,这里我们需要进行磁盘分区,我们可以先使用命令parted /dev/sda print,来查看一下/dev/sda磁盘的相关信息,需要注意的是:看一下分区表的格式以及你的磁盘是否够用。如果磁盘不够用可以参考博客Linux通过虚拟机增加新磁盘
linux中xfs文件系统模块化详解
       分区表格式有两种,即MBR(msdos)和GPT,MBR使用fdisk分区,GPT使用gdisk进行分区。
       使用命令fdisk /dev/sda进行分区,具体的一系列操作如下图所示:
linux中xfs文件系统模块化详解
注意:基本都可以选默认,但是你的新增分区的结束扇区号,即last 扇区最好不要选默认,默认会把你的剩下的所有内存全部分给新增分区,你可以通过+1G或者+500M这样的操作指定新增分区的大小。
       新增分区之后重启就可以了。磁盘分区之后接下来就是要对新增的磁盘进行格式化,我们是实现xfs文件系统,因此我们使用命令mkfs.xfs /dev/sda4命令将新增的/dev/sda4分区格式化为xfs文件系统。在下图中我加入-f是因为我之前已经挂载了,现在给他强制格式化。如下所示:
linux中xfs文件系统模块化详解
       格式化完之后,就可以挂载了。执行mount -t ghcxfs /dev/sda4 /mnt/ghc,挂载之后使用命令df -T查看你挂载的文件系统。如下所示
linux中xfs文件系统模块化详解
卸载该文件系统有多种方式:

  • 方法一:通过设备文件名卸载,即执行命令umount /dev/sda4
  • 方法二:通过挂载点卸载,即执行命令umount /mnt/ghc

这里我们使用设备文件名卸载,卸载完之后可以查看一下发现没有了:
linux中xfs文件系统模块化详解
       本次的课程设计内容分享结束了,中间有些原理还没搞懂,先把实现记录一下,后面搞懂了再补充。