背景:
在我的博客将文件系统模块化一文中提到了系统盘所在分区的文件系统,不能运用那篇文章介绍的方法。原因很简单:举例说明:
系统盘所在的分区为/dev/sda1。该分区的文件系统内类型为ext4。启动系统,为保证系统能运行,系统就自动将内核中的ext4.ko插入到模块中了。所以已经不给你机会再插入自己编译的该模块了。
那如果我偏偏就像研究ext4文件系统呢,难不成要重装系统,然后把系统盘改成ext2,或者ext3格式~~~~No No!!用不成那么麻烦。其实呢方法很简单,就是把ext4模块重命名,比如说命名成a_ext4,嘿嘿~系统很傻的,这样它就会报重名的错误了。
具体怎么做呢?见下文,还是有一些需要注意的地方。
方法:
这里的具体做法参见文件系统模块化
step1:编译内核
将ext4改成M模式
step2:修改ext4的Makefile文件。
运行重新编译的内核。将内核源码目录下\linux-2.6.34.14\fs\ext4文件拷贝到/home/modulefs文件夹,修改/home/modulefs/ext4中的Makefile文件:
# # Makefile for the linux ext4-filesystem routines. # obj-$(CONFIG_EXT4_FS) += ext4.o ext4-y := balloc.o bitmap.o dir.o file.o fsync.o ialloc.o inode.o \ ioctl.o namei.o super.o symlink.o hash.o resize.o extents.o \ ext4_jbd2.o migrate.o mballoc.o block_validity.o move_extent.o ext4-$(CONFIG_EXT4_FS_XATTR) += xattr.o xattr_user.o xattr_trusted.o ext4-$(CONFIG_EXT4_FS_POSIX_ACL) += acl.o ext4-$(CONFIG_EXT4_FS_SECURITY) += xattr_security.o
修改成如下
# # Makefile for the linux ext4-filesystem routines. # obj-m += a_ext4.o a_ext4-objs := balloc.o bitmap.o dir.o file.o fsync.o ialloc.o inode.o \ ioctl.o namei.o super.o symlink.o hash.o resize.o extents.o \ ext4_jbd2.o migrate.o mballoc.o block_validity.o move_extent.o KERNELDIR:=/usr/src/linux-2.6.34.14/ PWD:=$(shell pwd) a_ext4-$(CONFIG_EXT4_FS_XATTR) += xattr.o xattr_user.o xattr_trusted.o a_ext4-$(CONFIG_EXT4_FS_POSIX_ACL) += acl.o a_ext4-$(CONFIG_EXT4_FS_SECURITY) += xattr_security.o default: make -C $(KERNELDIR) M=$(PWD) modules clean: rm -rf *.o *.mod.c *.ko *.symvers
与上篇博客文件系统模块化中修改Makefile相比,可以发现我们将ext4模块重新命名了,命名为a_ext4
step3.修改内核代码
既然在我们改变了模块中ext4的名字,改成了a_ext4,则在/home/modulefs/ext4的代码中我们也做出相应的改变。
修改/home/modulefs/ext4/super.c中的如下内容
static struct file_system_type ext4_fs_type 以及
static int __init init_ext4_fs(void)
源文件如下:
static struct file_system_type ext4_fs_type = { .owner = THIS_MODULE, .name = "ext4", .get_sb = ext4_get_sb, .kill_sb = kill_block_super, .fs_flags = FS_REQUIRES_DEV, }; static int __init init_ext4_fs(void) { int err; ext4_check_flag_values(); err = init_ext4_system_zone(); if (err) return err; ext4_kset = kset_create_and_add("ext4", NULL, fs_kobj); if (!ext4_kset) goto out4; ext4_proc_root = proc_mkdir("fs/ext4", NULL); err = init_ext4_mballoc(); if (err) goto out3; err = init_ext4_xattr(); if (err) goto out2; err = init_inodecache(); if (err) goto out1; register_as_ext2(); register_as_ext3(); err = register_filesystem(&ext4_fs_type); if (err) goto out; return 0; out: unregister_as_ext2(); unregister_as_ext3(); destroy_inodecache(); out1: exit_ext4_xattr(); out2: exit_ext4_mballoc(); out3: remove_proc_entry("fs/ext4", NULL); kset_unregister(ext4_kset); out4: exit_ext4_system_zone(); return err; }
把如下三处'ext4' 修改成a_ext4
修改前
.name = "ext4",
ext4_kset = kset_create_and_add("ext4", NULL, fs_kobj);
ext4_proc_root = proc_mkdir("fs/ext4", NULL);
修改后
.name = "a_ext4",
ext4_kset = kset_create_and_add("a_ext4", NULL, fs_kobj);
ext4_proc_root = proc_mkdir("fs/a_ext4", NULL);
step4:编译模块,然后插入模块
具体做法,同文件系统模块化
这里注意格式化和挂载磁盘时指令如下:
make clean
make
insmod a_ext4
mkfs -t a_ext4 /dev/ram0
mount /dev/ram0 /mnt/a_ext4
总结:
其实模块化系统盘所在分区文件系统的具体做法(称为A) 与 文件系统模块化(称为B) 有两个不一样:
1.A的Makefile需要改变模块的名字,B不需要
2.A需要修改内核的代码,B不需要