模块化编译ext2, ext3,ext4 文件系统

时间:2022-09-06 19:36:23

    本文的目的就是将ext2, ext3,ext4文件系统编译成模块化,当我们需要对ext2, ext3,ext4进行修改的时候,就不需要重新编译内核。在这里,我会尽可能详细讲解每一个步骤,包括重新编译内核,力求详尽易懂~

    1.通过uname -a的指令,查看当前内核版本的详细信息,下载对应的内核版本,此处,我的内核版本是2.6.34.14,所以我要下载的对应内核版本是linux-2.6.34.14.tar,如下图所示:

     模块化编译ext2, ext3,ext4 文件系统

模块化编译ext2, ext3,ext4 文件系统

     2.使用tar指令解压linux-2.6.34.14.tar。在/usr/src/目录下,创建目录linux-module,将linux-2.6.34.14源码目录拷贝进去。

模块化编译ext2, ext3,ext4 文件系统

模块化编译ext2, ext3,ext4 文件系统

模块化编译ext2, ext3,ext4 文件系统

   4.此处开始进入内核编译步骤~

     a. make mrproper(删除以前的.o文件)

     b. make menuconfig(设置模块化参数,生成.config文件,这步很重要)

      在menuconfig主界面,进入filesystem选项,通过空格键将ext2,ext3,ext4行首的[*]改为[M],界面如下:


模块化编译ext2, ext3,ext4 文件系统   

  !!!重点:在配置完menuconfig之后,记得要在配置文件中查看一下ext2,ext3,ext4是不是已经配置成模块化的方式。下面以ext4为例进行查询,其余文件系统同理可查。

    使用命令gedit .config,ctrl+F查找ext4,这样就可以查看到ext4是否已经修改为模块化。ext2_FS=m表明已经修改成功。y代表内核。

模块化编译ext2, ext3,ext4 文件系统

  c.make dep(建立依赖关系)

  d.make clean(删除无用文件)

  e.make bzImage(编译内核)

  f.make modules(编译模块)

 g.make modules_install(安装模块)

 h. make install(建立initrd)

 i.update-initramfs -c -k 2.6.34.1

j.update-grub

k.reboot


编译内核成功,重启系统,进入新内核。在/home/ql/目录下,新建目录modulefs,并且把源码/usr/src/linux-2.6.34.14/fs/ext2目录复制到home/ql/modulefs,同时按下图所示修改Makefile文件。

模块化编译ext2, ext3,ext4 文件系统

修改ext2文件夹下的源码,加入需要打印的printk信息。然后对ext2文件系统的模块编译:

a.make clean

b.make

c.insmod ext2.ko

d.mkfs.ext2 /dev/ram0

f.mkdir /mnt/ram0

h.mount /dev/ram0 /mnt/ram0

 加载模块成功之后,在设备上进行文件操作,使用dmesg -c 就可以看到你需要打印的printk信息了。我在这里主要修改了inode.c文件,在函数下加入了

printk("!!!正在被执行的函数名");。进入到/mnt/ram0目录下,输入有inode操作的指令,我这里输的是mkdir,使用dmesg -c,显示了mkdir在inode.c里调用的函数名。

模块化编译ext2, ext3,ext4 文件系统


ext3的模块化步骤是一样的,这里值得一提的是ext4模块化。

因为我的系统盘上装载的文件系统是ext4,所以我再想把ext4以模块化的形式加载,就会出现问题。我们可以ext2的方式修改ext4的Makefile,进行make和insmod操作,问题如下:

模块化编译ext2, ext3,ext4 文件系统

解决方案是,将ext4的模块名称重命名。这在ext4的Makefile文件中进行修改:

模块化编译ext2, ext3,ext4 文件系统


同时对ext4的源码进行修改:

模块化编译ext2, ext3,ext4 文件系统

模块化编译ext2, ext3,ext4 文件系统

然后进行模块编译~就ok啦




Debug:

 1.在模块装载这一步,insmod ext2.ko可能会出现一下错误,

模块化编译ext2, ext3,ext4 文件系统

解决方法:
你需要在系统未给你插入模块之前,手动插入你加入的模块。


2.若开机的时候,没有出现启动项,无法选择自己新编译的内核,则按照下述方法进行grub文件的修改。
在root权限下vim /etc/default/grub

把里面的GRUB_TIMEOUT设置为GRUB_TIMEOUT=20

然后输入 update-grub

再reboot。

若reboot还没有选项,而是直接进入之前的内核,则

2.修改 vim /etc/grub.d/30_os_prober

把里面三个else   set timeout=0的地方 改为=20

然后在 update-grub

在reboot !

3.

编译驱动的时候碰到了  insmod: error inserting './igb.ko': -1 Unknown symbol in module 的问题,在网上看了下,说是查看 dmesg | tail 看输出信息中的Unknown symbol,加载上这些模块就好。

但是我在系统中查看

dca_remove_requester

dca_add_requester

dca_unregister_notify

dca_register_notify

dca3_get_tag

5个模块是没有找到,细细一想,估计是由于模块依赖的其他模块没有加载导致的。

直接用: modinfo  ext2.ko | grep depend   找模块的依赖,结果如下,

depends:        dca

然后再执行: 

localhost:/opt/igb/igb-4.0.17/src #  modprobe dca

localhost:/opt/igb/igb-4.0.17/src #  insmod ext2.ko