-----------------------------------------------------------------------
内核版本:linux-2.6.32.2
添加一个ext2文件系统,newext2.
-----------------------------------------------------------------------
STEP 1:首先,copy ext2文件系统的所有代码。与ext2密切相关的代码分为2部分,一部分是/fs/ext2/目
录下的文件,另一部分是include/linux/ext2_fs.h和include/linux/ext2_fs_sb.h 。
cd fs
cp –R ext2 newext2
cd ../include/linux
cp ext2_fs.h newext2_fs.h
cp ext2_fs_sb.h newext2_fs_sb.h
|
然后,进入/fs/newext2/目录下,把文件名为ext2的改成newext2.源代码复制完毕。
cd /fs/newext2 mv ext2.h newext2.h
|
STEP 2:修改复制的源代码,因为我们添加的文件系统名叫newext2,那我们就得把添加的所有文件里面的所有 ext2 改成 newext2, EXT2 改成NEWEXT2.聪明的话,写个脚本文件,不过我不会,只好用笨方法,用gedit 打开文件,用里面的替换功能,替换时注意大小写,并且是我们添加的所有文件都替换。
至此,newext2的代码全部准备好了。剩下的就是 newext2这个整体与周围环境的关系。
STEP 3:外界感知newext2的存在是通过文件/fs/Kconfig和/fs/Makefile.Kconfig文件是make menuconfig时要读取的文件,读取的顺序是按照递归的方式进行的。所有,我们添加的文件系统newext2能够在配置时显示出来,就要在/fs/Kconfig里面把newext2/Kconfig包含进来。所以,在/fs/Kconfig里面添加:
source "fs/newext2/Kconfig"
|
当然,要想newext2能够被编译器找到,那就得修改newext2目录下文件的上一个目录,即/fs.修改/fs/Makefile ,最好在靠近ext2处添加 :
obj-$(CONFIG_NEWEXT2_FS) += newext2/
|
至此,newext2能够被外界感知存在,但是还与外界存在兼容问题,就要先make,哪里有错误就到哪里改,使用source insight最方便。
STEP 4:回到内核代码根目录,执行make menuconfig.在进入图形配置界面后,你会找不到newext2的名字,那么马上就相当这是/fs/newext2/Kconfig出了问题,没有显示newext2这个名字。所有把/fs/newext2/Kconfig里面的每个宏下面有个boot " --- ",这个用于显示在配置界面上面。把Ext2改成NewExt2就可以了。
bool "NewExt2 Security Labels"
|
配置时,把NewExt2文件系统选上。
STEP 5: make all
STEP 6: 改错
第1个错误:
fs/newext2/balloc.c: 在函数‘newext2_valid_block_bitmap’中: fs/newext2/balloc.c:87: 错误:隐式声明函数‘newext2_test_bit’ fs/newext2/balloc.c:101: 错误:隐式声明函数‘newext2_find_next_zero_bit’ fs/newext2/balloc.c: 在函数‘newext2_free_blocks’中: fs/newext2/balloc.c:549: 错误:隐式声明函数‘newext2_clear_bit_atomic’ fs/newext2/balloc.c: 在函数‘newext2_try_to_allocate’中: fs/newext2/balloc.c:724: 错误:隐式声明函数‘newext2_set_bit_atomic’ make[2]: *** [fs/newext2/balloc.o] 错误 1 make[1]: *** [fs/newext2] 错误 2 make: *** [fs] 错误 2
|
修改:在include/asm-generic/bitops/Ext2-non-atomic.h,加入:
//*******************************add**************************** #define newext2_set_bit(nr,addr) \ generic___test_and_set_le_bit((nr),(unsigned long *)(addr)) #define newext2_clear_bit(nr,addr) \ generic___test_and_clear_le_bit((nr),(unsigned long *)(addr))
#define newext2_test_bit(nr,addr) \ generic_test_le_bit((nr),(unsigned long *)(addr)) #define newext2_find_first_zero_bit(addr, size) \ generic_find_first_zero_le_bit((unsigned long *)(addr), (size)) #define newext2_find_next_zero_bit(addr, size, off) \ generic_find_next_zero_le_bit((unsigned long *)(addr), (size), (off)) #define newext2_find_next_bit(addr, size, off) \ generic_find_next_le_bit((unsigned long *)(addr), (size), (off)) //*******************************add****************************
|
第2错误:
fs/newext2/balloc.c: 在函数‘newext2_free_blocks’中: fs/newext2/balloc.c:549: 错误:隐式声明函数‘newext2_clear_bit_atomic’ fs/newext2/balloc.c: 在函数‘newext2_try_to_allocate’中: fs/newext2/balloc.c:724: 错误:隐式声明函数‘newext2_set_bit_atomic’ make[2]: *** [fs/newext2/balloc.o] 错误 1 make[1]: *** [fs/newext2] 错误 2 make: *** [fs] 错误 2
|
在/arch/x86/include/asm/bitops.h,末加入:
//************************add********************************* #define newext2_set_bit_atomic(lock, nr, addr) \ test_and_set_bit((nr), (unsigned long *)(addr)) #define newext2_clear_bit_atomic(lock, nr, addr) \ test_and_clear_bit((nr), (unsigned long *)(addr)) //************************add*********************************
|
第3个错误:是NEWEXT2_SUPER_MAGIC没有声明。
在include/linux/magic.h,加入:
#define NEWEXT2_SUPER_MAGIC 0xEF53
|
STEP 7:继续make all,make modules_install,make install;选择我们编译的内核重新启动;
STEP 8:查看我们的文件系统是否被加载。
cat /proc/filesystems | grep newext2
|
STEP 9:如果step 8没有看到newext2,多半是你在配置内核时,把newext2以模块的形式编译了。不过可以,手动添加:
至此,自己的文件系统添加成功.可惜cublog不能发图片.
阅读(1777) | 评论(0) | 转发(0) |