《Linux添加文件系统.pdf》由会员分享,可在线阅读,更多相关《Linux添加文件系统.pdf(19页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、实验辅助四:添加一个文件系统Saturday,OS_TADecember 15,20091Contents1文档定位32运行环境33准备工作34实验说明35操作步骤45.1 创建基于ext2的新文件系统satext2.45.1.1 明确我们要修改哪些内容.45.1.2 复制源文件.45.1.3 修改源文件的内容.55.1.4 修改编译选项.95.1.5 Something More.115.1.6 重新编译内核.155.2 修改satext2文件系统的magic number.155.2.1 修改magic number.155.2.2 一个小程序.165.2.3 简单的测试.165.3 剪裁
2、satext2文件系统的mknod函数.165.3.1 修改mknod函数.175.3.2 简单的测试.175.4 完成mkfs.satext2功能.176结束语181文档定位实验辅助主要的作用是以TA自己的经验来辅助同学们做实验,让大家少走弯路,少在Linux繁杂的内核版本和发行版本的中浪费时间,而把主要的精力集中在理解和实践操作系统本身。有关原理性的东西,在实验说明文档中已有详细的介绍。如果大家有关原理性的问题,请参考实验说明文档。在实验辅助文档中,我们主要讲实验步骤,帮助大家理解实验步骤,而不触及原理性的东西。TA所选的发行版是当前最流行的Ubuntu9.04。编译所有的内核代码是2.6
3、.26(注意,这个要与2.6.26.1,2.6.26.2,等版本相区别。)另外,这个文档也不是一份很严肃的文档。Take It Easy同时,也难免会有这样或者那样的问题,欢迎大家指正。请联系:Saturday2运行环境 操作系统:Ubuntu 9.04 内核版本:2.6.26 虚拟机:Sun VirtualBox 3.0.4(注意不是开源版本的VirtualBox-OSE)主系统:Fedora 11以上运行环境中最重要的是操作系统和内核版本,这两个一定要与实验辅助中保持一致。3准备工作完全阅读了 实验辅助三:添加系统调用,并已经完成了实验三。4实验说明大家已经完成了实验三,那么大家对于修改l
4、inux内核代码,并重新编译内核这样一个过程并不陌生。那么,现在我们就要着手解决本学期最为复杂的实验四了。要完成整个实验的过程,我们要编译三次内核。恩,先不要被这个吓到。其实如果把整个过程一步一步的拆开,每一步其实都不难。且听我慢慢道来我们以编译一次内核为一个小节,可以把整个实验拆为四节。如下:1.创建基于ext2的新文件系统satext2(这个名字大家可以自己取)。要编译一次内核,并以新内核启动。5.12.修改satext2的magic number,要编译第二次内核,以新内核启动。5.23.剪裁satext2的mknod函数操作,要编译第三次内核,以新内核启动。5.34.最后完成一个she
5、ll程序,完成mkfs.satext2功能。这一次不用编译内核。5.4除了,第一节对于内核代码有比较多的修改,难度比较大之外,后面的三节其实只需要各修改一个地方,所以总的来说,这是一个“虎头蛇尾”的实验,大家不用被它的硕大的头给吓到,完成了第一节内容,后面几节就基本上可以用naive来形容了那么,废话少说,我们按照这四节的顺序来介绍整个的实验过程。5操作步骤5.1创建基于ext2的新文件系统satext25.1.1明确我们要修改哪些内容首先,要明确的问题是,我们需要修改哪些方面的内容。大体来说,分为这么几个方面。1.我们所创建的satext2文件系统,实际上是完全基于ext2文件系统的。而ex
6、t2相关的源文件,大部分在文件夹fs/ext2下。satext2文件系统的实现,实际上是通过复制和修改ext2源文件来完成的。所以,我们的第一步就是要复制ext2相关的源文件。5.1.22.即使satext2有了和ext2同样的源文件之后,还必须修改源文件的内容,具体的说就是让代码里面的所有的ext2和EXT2换成satext2和SATEXT2。5.1.33.修改编译选项,使得我们新添加的文件系统在make menuconfig中显示出来。5.1.44.Something More5.1.55.1.2复制源文件在目录linux/fs/ext2下,基本上都是ext2文件系统所需要的源文件,另外,
7、在include/linux下也有两个ext2相关的.h,分别是ext2_fs.h和ext2_fs_sb.h。那么总结下,跟ext2相关的文件列举如下:fs/ext2/balloc.cfs/ext2/bitmap.cfs/ext2/dir.c./*该文件夹(fs/ext2)下所有内容*/include/linux/ext2_fs.hinclude/linux/ext2_fs_sb.hFigure 1:fs/ext2下面的内容截图如Figure 1:通过如下命令来,完成整个的源代码复制工作。cd fscp-R ext2 satext2cd./include/linuxcp ext2_fs.h s
8、atext2_fs.hcp ext2_fs_sb.h satext2_fs_sb.h截图如Figure 2:Figure 2:fs/satext2下面的内容这样我们就完成了第一步工作,源代码的复制。5.1.3修改源文件的内容第二步的主要任务是,我们要把刚刚复制了的源文件里面的所有的ext2替换成satext2。这样才能够使得修改过的源文件能够通过编译,主要分为两个步骤。1.修改fs/satext2文件夹下面的所有源文件.这个部分的工作通过一个脚本来完成,如下:#!/bin/shSCRIPT=substitute.shfor f in*;doif$f=$SCRIPT;thenecho skip$
9、fcontinuefiecho-n substitute ext2 to myext2 in$f.cat$f|sed s/ext2/myext2/g$f_tmpmv$f_tmp$fecho doneecho-n substitute EXT2 to MYEXT2 in$f.cat$f|sed s/EXT2/MYEXT2/g$f_tmpmv$f_tmp$fecho donedone截图如Figure 3:把这个脚本命名为substitute.sh,放在fs/satext2下面,加上可执行权限chmod+x,运行之后就可以把当前目录里所有文件里面的“ext2”和“EXT2”都替换成对应的“sate
10、xt2”和“SATEXT2”。截图如Figure 4:2.修改include/linux下面的两个.h文件简单的说,就是通过文本编辑器把两个.h里面的内容替换。在这里通过vim的功能来实现。我们以satext2_fs.h为例,来说明这个问题:cd include/linuxvim satext2_fs.h/*进入到vim里面之后输入如下内容*/:%s/ext2/satext2/g:%s/EXT2/SATEXT2/g这样就完成了include/linux下面的satext2_fs.h的文件替换工作。截图如Figure 5:同一个目录下面的satext2_fs_sb.h用同样的方法就可以完成替换了
11、。Figure 3:substitue.sh的内容Figure 4:执行substitue.sh的部分结果Figure 5:satext2_fs.h的部分内容5.1.4修改编译选项因为我们新增加了一个文件系统,而这个文件系统之前在内核的编译选项中是不存在的,所以我们要修改相关的配置,来使得make menuconfig中出现satext2选项。总体说来,有这么三个地方需要修改。这三个地方的修改方式都是一样的,把有关ext2的选项的内容复制一份,然后把ext2和EXT2替换为satext2和SATEXT2。1.fs/Kconfig我们需要Kconfig中拷贝一份对应的对Ext2文件宏的定义和帮助
12、信息,这样在make menuconfig的时候可以查看该选项的有关内容。截图如Figure 6:Figure 6:fs/Kconfig的内容2.fs/Makefile Makefile的修改是告诉内核编译系统,当satext2对应的宏被选上的时候,到fs/satext2目录下去编译satext2文件系统。截图如Figure 7:3.arch/x86/configs/i386_defconfig这个文件的改动是修改默认的编译选项。截图如Figure 8:Figure 7:fs/Makefile的内容Figure 8:fs/Makefile的内容最后在make menuconfig中,首先进入f
13、ile system的选项,看到有关satext2的选项如图9Figure 9:make menuconfig的截图5.1.5Something More如果现在开始make,是不能够通过编译的。因为fs/satext2中的一些函数还是需要引用一些头文件,而这些头文件中只有ext2相关的函数的定义,而我们需要的是satext2相关的函数定义。根据我自己的经验来看,有这么几个文件需要修改。include/asm-generic/bitops/ext2-atomic.hinclude/asm-generic/bitops/ext2-non-atomic.hinclude/asm-x86/bitop
14、s.hinclude/linux/magic.h下面是关于这些被修改的地方的截图。注意,这个只是部分的截图,只是个示意图。代码的修改,需要自己手动来完成!截图如Figure 10:Figure 10:ext2-atomic的内容截图如Figure 11:截图如Figure 12:截图如Figure 13:Figure 11:ext2-non-atomic的内容Figure 12:bitops.h的内容Figure 13:magic.h的内容也许你会问,这些要修改的文件是怎么被找出来的呢?我们并不知道编译satext2文件系统的时候到底引用了哪些.h文件阿?事实上,发现这些文件的位置并不难,主要
15、就是通过反复编译获得的。比如说,如果在编译的过程中发现了这样的一条错误:fs/fs.o(.text+0 x27f8a):undefined reference tosatext2_find_first_zero_bit那么也就是说,我们需要引用的satext2_find_first_zero_bit这样一个并没有被定义的东西。但是,可以确定的是,ext2_find_first_zero_bit肯定是存在的,我们只要找到ext2_find_first_zero_bit的位置。然后复制一份并改成satext2_find_first_zero_bit不就好了吗?就是这么简单。查找的过程使用下面这个命
16、令:cd linuxgrep*ext2_find_first_zero_bit-r这个命令默认是在当前的文件夹及其子目录下面的所有文件中搜索ext2_find_first_zero_bit。得到的就是包含这个字符串的文件和位置。找到了之后,只要把相关的内容复制一份,将定义改为的satext2_find_first_zero_bit即可。以上这四个额外需要修改的文件都是这么被找出来的。大家可以尝试一下这样的改错过程,这样有助于增加我们对于内核的理解。:)5.1.6重新编译内核做完了上述的工作之后,我们就要开始重新编译内核了,这一部分内容参见 实验辅助二:编译Linux内核编译完成之后,重启进入新
17、的内核,进行一下简单的测试。#dd if=/dev/zero of=satfs bs=1M count=1#mkfs.ext2 satfs#cat/pro/filesystems|grep ext#mount-t satext2-o loop./satfs/mnt#mount#umount/mnt#mount-t ext2-o loop./satfs/mnt#mount#umount看看这些命令一行一行输入下来的结果是不是和预期的一致呢?要是对了的话,就恭喜你,这个实验最难的一节已经完成了5.2修改satext2文件系统的magic number我们在已经解决了虎头之后,后面的问题就非常简单了
18、。我们只需要修改satext2的magic number就可以了。5.2.1修改magic number在include/linux/magic.h文件中做如下修改就可以了:截图如Figure 14:Figure 14:magic.h的内容就这样,我们把satext2的magic number改成了0 x6666。之后重新编译内核,进入新的内核。5.2.2一个小程序在我们测试之前,我们需要写个小程序来修改我们创建的satext2文件系统的magicnumber。因为它必须和内核中记录satext2文件系统的magic number相匹配,satext2文件系统才能够被正确的mount。我们假设
19、这个程序为changeMN.c(这个可以从老师官方的资料中获得),在此不赘述了。5.2.3简单的测试执行代码如下:#dd if=/dev/zero of=satfs bs=1M count=1#mkfs.ext2 satfs#./changeMN satfs#mount-t satext2-o loop./fs.new/mnt#mount#umount/mnt#mount-t ext2-o loop./fs.new/mnt结果应该是第一个mount-t satext2成功,第二个mount-t ext2失败。截图如Figure 15:Figure 15:测试修改magic number的结果5
20、.3剪裁satext2文件系统的mknod函数修改了satext2的magic number之后,我们剪裁一下satext2的mknod函数。5.3.1修改mknod函数截图如Figure 16:Figure 16:剪裁mknod5.3.2简单的测试#mount-t satext2-o loop./satfs/mnt#cd/mnt#mknod myfifo p执行完mknod之后,应该报错,然后用dmesg的命令得到如图的结果。截图如Figure 17:5.4完成mkfs.satext2功能这个过程,只用我们在目录/sbin下完成一个名为mkfs.satext2的脚本就可以了,代码如下:#!/
21、bin/sh/sbin/losetup-d/dev/loop0Figure 17:剪裁mknod/sbin/losetup/dev/loop0$1/sbin/mkfs.ext2/dev/loop0dd if=/dev/loop0 of=/tmp/tmpfs bs=1k count=2/sbin/changeMN/tmp/tmpfsdd if=/tmp/tmpfs of=/dev/loop0/sbin/losetup-d/dev/loop0rm-f/tmp/tmpfs测试的代码如下:#dd if=/dev/zero of=satfs bs=1M count=1#mkfs.satext2 satfs#mount-t satext2-o loop./satfs/mnt#mountmount之后,应该得到如下类似的结果截图如Figure 18:6结束语一个冬学期的操作系统实验的最后一个实验终于完成了。本人的工作也完成了一大半了这是本人第一次做助教,感觉还不错感谢大家一路的支持最后引用10086移动mm的一句话,作为结束:祝大家生活愉快:)Figure 18:剪裁mknod的结果
限制150内