实验5添加一个文件系统方案

合集下载

文件系统设计实验报告

文件系统设计实验报告

文件系统设计实验报告文件系统设计实验报告一、引言在计算机科学领域,文件系统是操作系统中的一个重要组成部分,用于管理和组织计算机存储设备上的文件和目录。

一个高效稳定的文件系统对于计算机系统的正常运行至关重要。

本实验旨在设计一个简单但功能完善的文件系统,并通过实验验证其性能和可靠性。

二、实验背景文件系统是计算机操作系统的核心组成部分之一,它负责管理计算机存储设备上的文件和目录。

一个好的文件系统应该具备以下特点:高效的文件存取速度、可靠的数据完整性、良好的扩展性和灵活性。

三、实验目标本实验的主要目标是设计一个简单但功能完善的文件系统,并通过实验验证其性能和可靠性。

具体而言,我们将实现以下功能:1. 文件的创建、读取、写入和删除。

2. 目录的创建、删除和遍历。

3. 文件和目录的权限管理。

4. 文件系统的容量管理。

5. 文件系统的备份和恢复。

四、实验设计与实现1. 文件和目录的创建、读取、写入和删除在文件系统中,文件和目录都是通过数据块来存储的。

我们可以使用链表或树的数据结构来组织文件和目录之间的关系。

为了提高文件的读取和写入效率,可以采用缓存机制,将最近访问的文件块缓存在内存中。

2. 目录的创建、删除和遍历目录是文件系统中用于组织和管理文件的一种特殊文件。

为了实现目录的创建、删除和遍历功能,我们可以使用树的数据结构来表示目录结构,并通过递归算法来实现目录的遍历。

3. 文件和目录的权限管理为了保护文件和目录的安全,我们可以为每个文件和目录设置权限。

权限可以分为读、写和执行三种类型。

通过权限管理,可以限制用户对文件和目录的操作,提高文件系统的安全性。

4. 文件系统的容量管理文件系统的容量管理是指对文件和目录所占用的存储空间进行管理。

为了有效利用存储空间,我们可以使用位图或链表等数据结构来管理存储空间的分配和释放。

5. 文件系统的备份和恢复为了保证文件系统的可靠性,我们可以定期对文件系统进行备份。

备份可以通过复制文件和目录的数据块来实现。

文件系统实验 模拟设计文件操作

文件系统实验 模拟设计文件操作

实验五文件系统实验一. 目的要求. 用高级语言编写和调试一个简单的文件系统,模拟文件管理的工作过程。

从而对各种文件操作命令的实质内容和执行过程有比较深入的了解。

要求设计一个n个用户的文件系统,每次用户可保存m个文件,用户在一次运行中只能打开一个文件,对文件必须设置保护措施,且至少有Create、delete、open、close、read、write等命令。

二. 例题:设计一个N个用户的文件系统,每次用户可保存L个文件,一次运行用户可以打开S个文件。

程序采用二级文件目录(即设置主目录MFD)和用户文件目录(UFD)。

另外,为打开文件设置了运行文件目录,用户已打开文件表UOF.。

为了便于实现,对文件的读写作了简化,在执行读写命令时,只需改读写指针,并不进行实际的读写操作算法与框图:因系统小,文件目录的检索使用了简单的线性搜索。

文件保护简单使用了保护码:允许读写执行、对应位为1,对应位为2,和对应位为3。

程序中使用的主要设计结构如下:主文件目录和用户文件目录(MFD、UFD)打开文件目录(UOF)(即运行文件目录)主文件目录MFD:用户文件目录UFD用户已打开文件表UOF二、实验要求:显示初始的文件目录表、输入的文件操作命令和每条命令执行后的UOF文件,程序运行后打印所有用户的文件目录表。

假定文件系统提供的文件操作有建立文件(CREATE),打开文件(OPEN),关闭文件(CLOSE),读文件(READ),写文件(WRITE)和删除文件(DELETE),在模拟程序中可以从键盘上输入文件操作命令来模拟各用户程序中所调用的各种文件操作,用一个结束命令(end)停止程序执行。

主程序结构流图如下:用输入命令来模拟用户程序中调用的文件操作,这些命令的格式和和要求如下:①建立文件:create(文件名,文件长度,文件属性)②写文件:write(文件名,记录号)有两种情况,第一种是在执行create后要求写,第二种是在执行open 后要求写,即对一个已存在的文件进行修改。

实验5 文件系统的使用

实验5 文件系统的使用

实验5文件系统的使用
1.实验目的:
1)熟悉Linux操作系统中的文件与目录管理的概念。

2)掌握Linux操作系统中常用文件管理指令。

3)掌握硬连接和软连接的建立及使用。

4)进一步了解文件系统结构。

2.实验准备:
1)熟悉ls、mkdir、rmdir、cd、mv、rm、cp等文件目录管理指令
2)熟悉ln指令的使用
3)了解df、du、fdisk、gzip、gunzip、tar等磁盘管理指令
3.实验步骤:
1.登陆后察看文件系统的基本目录结构。

了解各主要目录。

2.用ln指令分别对文件建立硬连接和软连接。

按课本例子一一实现,注意硬连接和软连接的区
别。

3.使用df、du、fdisk察看系统中磁盘及文件系统的使用状况。

(注意查看帮助)
4.对命令中出现的各种特殊字符有正确的理解。

可参照课本例子实现。

4实验总结:
认真填写实验报告。

文件系统 实验报告

文件系统 实验报告

文件系统实验报告引言文件系统是操作系统中的一部分,用于管理计算机中的文件和目录。

它提供了数据的存储、访问、组织和管理功能,是操作系统的基础之一。

本实验通过实现一个简单的文件系统来深入理解文件系统的原理和实现方式。

实验目的1. 了解文件系统的基本概念和原理;2. 学习文件系统的设计和实现方法;3. 掌握文件系统的基本操作。

实验环境本次实验使用的是Ubuntu 20.04操作系统。

实验步骤1. 文件系统的设计在开始实现文件系统之前,我们首先需要设计文件系统的结构和功能。

1.1 文件系统的结构文件系统通常由三个主要部分组成:文件控制块、目录和数据块。

文件控制块用于存储文件的属性和元数据,目录用于组织文件和子目录,数据块用于存储文件的实际内容。

1.2 文件系统的功能文件系统需要提供以下功能:- 文件的创建、读取、修改和删除;- 目录的创建、读取、修改和删除;- 文件和目录的查找;- 文件的权限管理。

2. 文件系统的实现2.1 文件系统的初始化在实现文件系统之前,我们首先需要初始化文件系统。

包括创建超级块、位图和根目录,并将它们写入磁盘。

2.2 文件和目录的操作在文件系统中,我们需要实现文件和目录的基本操作,包括创建文件、创建目录、读取文件内容、修改文件内容和删除文件。

2.3 文件系统的其他操作除了基本的文件和目录操作之外,文件系统还需要实现其他一些功能,如文件查找、权限管理等。

3. 文件系统的测试在完成文件系统的实现后,我们需要对其进行测试,以验证其功能是否正常。

3.1 创建文件和目录我们首先创建一些文件和目录,检查它们是否被正确地写入磁盘,并且能够被正确地读取。

3.2 读取和修改文件我们随机选择一些文件,读取它们的内容,并对其内容进行修改。

修改后,我们再次读取文件,确保修改成功。

3.3 删除文件和目录我们尝试删除一些文件和目录,并检查它们是否被成功地删除。

4. 结果与讨论经过测试,我们发现我们实现的文件系统功能正常,能够按照我们的预期进行文件和目录的创建、读取、修改和删除等操作。

实现一个简单的文件系统

实现一个简单的文件系统

实现一个简单的文件系统一个简单的文件系统是指一个用于管理文件和文件夹的系统,可以进行基本的文件和文件夹的创建、删除、重命名、查找、打开、关闭等操作。

以下是一个简单文件系统的实现,主要包括文件和文件夹的数据结构和相关操作。

1.数据结构:- 文件(File):包含文件名、文件内容、创建时间、修改时间等属性。

- 文件夹(Folder):包含文件夹名、文件夹路径、创建时间、修改时间等属性,以及包括的文件和文件夹列表。

2.操作:-创建文件夹:可以根据输入的文件夹名和路径,在对应的位置创建一个新的文件夹对象,并将其添加到上级文件夹的文件夹列表中。

-创建文件:可以根据输入的文件名和路径,在对应的位置创建一个新的文件对象,并将其添加到对应的文件夹的文件列表中。

-删除文件夹:可以根据输入的文件夹名和路径,将对应的文件夹对象从上级文件夹的文件夹列表中删除,并删除其包含的所有文件和文件夹。

-删除文件:可以根据输入的文件名和路径,将对应的文件对象从所在文件夹的文件列表中删除。

-重命名文件夹:可以根据输入的原文件夹名和路径以及新文件夹名,将对应的文件夹对象重命名。

-重命名文件:可以根据输入的原文件名和路径以及新文件名,将对应的文件对象重命名。

-查找文件夹/文件:可以根据输入的文件夹名和路径,查找对应的文件夹对象。

-打开文件:可以根据输入的文件名和路径,打开对应的文件对象,并显示其内容。

-关闭文件:可以关闭当前打开的文件。

3.实现:- 定义一个文件夹类(Folder),包含文件夹名、文件夹路径、创建时间、修改时间等属性,以及一个存储文件夹对象的列表。

- 定义一个文件类(File),包含文件名、文件内容、创建时间、修改时间等属性。

- 实现创建文件夹的方法(createFolder),在对应的位置创建一个新的文件夹对象,并将其添加到上级文件夹的文件夹列表中。

- 实现创建文件的方法(createFile),在对应的位置创建一个新的文件对象,并将其添加到对应的文件夹的文件列表中。

实验五-文件系统实验

实验五-文件系统实验

实验五 EXT4文件系统结构分析一、实验目的:掌握文件系统的工作机理;理解文件系统的主要数据结构;学习较为复杂的Linux下的编程;了解EXT4文件系统的结构。

二、实验平台:虚拟机:VMWare9操作系统:Ubuntu12.04文件系统:EXT4编辑器:Gedit | Vi三、实验内容:(1)该实验要求编写程序,完成以下功能(注意保存截图):1、查看主硬盘设备名、挂载目录及文件系统信息2、程序编译进入check_ext4fs目录,输入 make clean; make编译程序,生成check_ext4fs程序:获取ext4文件系统超级块,并显示超级块数据结构ext4_super_block的字段信息;获取块组描述符表,并能根据输入的块组号显示该块组描述符ext4_group_desc的字段信息;先获取组块描述表info groups [1, 33]获取索引节点表,并能根据输入的索引节点号(比如根目录文件的索引节点号是2),显示其索引节点数据结构ext4_inode的字段信息。

(2)分析上述实验代码,回答下列问题:大小(单位用字节):逻辑块、超级块ext4_super_block、组描述符ext4_group_desc、索引节点ext4_inode;逻辑块大小4096、超级块大小、组描述符ext4_group_desc大小512块、索引节点大小256字节个数及位置:块组0中组描述符占用的块数708及所占块号1057-1568、inode个数及inode表占用的块数1057、块位图block bitmap占用块数1025及所在块号1025、索引节点位图inode bitmap占用块数1041及所在块号1041;验证:执行sudo dumpe2fs /dev/sda1 | more命令,验证上述分析是否正确。

实验总结这次实验中,我了解了文件系统的基本工作原理,也明白了文件系统的主要数据结构,了解了EXT4文件系统的结构。

文件系统的构建实验报告

文件系统的构建实验报告

文件系统的构建实验报告 实验名称:文件系统的构建实验目的:掌握磁盘的工作原理和操作系统进行文件管理的原理实验原理:硬盘的MBR :MBR (Main Boot Record ),按其字面上的理解即为主引导记录区,位于整个硬盘的0磁道0柱面1扇区。

在总共512字节的主引导扇区中,MBR 只占用了其中的446个字节(偏移0000--偏移01BD ),另外的64个字节(偏移01BE--偏移01FD )交给了DPT(Disk Partition Table 硬盘分区表),最后两个字节"55,AA"(偏移01FE- 偏移01FF )是分区的结束标志。

这个整体构成了硬盘的主引导扇区。

硬盘依据分区表中的信息把硬盘划分为最多四个分区(对于扩展分区,可进一步划分为多个逻辑分区)。

U 盘采用类似的方法划分分区。

每个分区或软盘上可建立独立的文件系统。

下图是FAT 文件系统空间分布结构。

实验内容:在掌握磁盘的工作原理和操作系统进行文件管理原理的基础上,自行设计实现在磁盘上建立文件系统的软件,该软件应该具有与Format 类似的功能,至少支持一种文件系统格式,如FAT 、NTFS 或EXT2,至少能够对一种媒体进行格式化,如软盘,U 盘或硬盘(不得在实验室的机器上进行硬盘格式化的实验)等。

不能直接调用操作系统提供的格式化工具或类似SHFormatDrive ()的高层系统函数实现该软件。

在Windows 环境可使用biosdisk()函数完成底层盘操作,在Linux 环境上可参考format 的源代码。

比较自己设计实现的软件.与FORMAT ,分析存在什么异同。

背景知识介绍 一个分区或磁盘能作为文件系统使用前,需要初始化,并将记录数据结构写到磁盘上。

这个过程就叫建立文件系统。

大部分linux 文件系统种类具有类似的通用结构。

其中心概念是超级块superblock, i 节点inode, 数据块data block,目录块directory block, 和间接块indirection block 。

操作系统 文件系统的多级目录管理实验

操作系统 文件系统的多级目录管理实验

实验五文件系统的多级目录管理(4课时)一、实验目的通过实验了解文件系统管理的基本原理和方法。

掌握在在文件系统中进行多级目录的管理。

了解文件和目录的基本操作。

二、实验内容在系统中进行目录的建立、改变当前目录、对目录进行删除;建立一个文件,显示文件内容,删除文件等。

三、实验提示1、目录的存储结构的设置。

2、文件的建立方式,文件内容的管理。

3、如何进行文件的按名管理,文件在内存中的如何存储。

4、必要的提示信息。

程序://本程序模拟文件系统的多级目录管理,实现按名存取//#include<iostream.h>#include<iomanip.h>#include<stdlib.h>#include<stdio.h>#include<string.h>//文件类class file{private:int size;char filename[9];char *text;public:file *next;file();voideditfile();char *getfilename() {return filename;} //返回文件名void show_text() {cout<<endl;cout<<text;cout<<endl;} //显示文本内容intgetsize() { return size;}~file() {delete text;};};//目录类class directory{private:chardirname[9];public:file *pfile;directory *nextdir,*subdir,*fatherdir;directory(char *dname) { strcpy(dirname,dname);pfile=NULL;} directory() { pfile=NULL;cin>>dirname; }void creatfile(); //新建文件void deletefile(); //删除文件void showfile(); //显示文件char *getdname() {return dirname;} //返回目录名~directory() {delete pfile;};};//文件目录管理类classdirmanager{public:void manager(); //文件和目录管理的主控函数void addnew(); //新增目录void cdsubdir(); //进入子目录void showdir(); //提示当前所在目录路径void showdirinfor(); //显示当前目录所包含子目录和文件信息~dirmanager() {delete root;}private:directory *root,*p,*p1,*p2;directory *dir[10]; //存放目录指针};//文件类构造函数,询问是否编辑文件file::file(){char edit;cin>>filename;cout<<"是否编辑文件?(y/n):";cin>>edit;if(edit=='y'||edit=='Y')editfile();else size=0;}//编辑文件函数的实现void file::editfile(){text=new char[1024];cout<<"请输入文件内容:"<<endl;gets(text);size=strlen(text);}//新建文件函数的实现void directory::creatfile(){file *pf,*p1;if(pfile==NULL) {pf=new file; pfile=pf;pf->next=NULL;}else { p1=pfile;while(p1->next!=NULL) p1=p1->next;pf=new file;p1->next=pf; pf->next=NULL;}}//处理目录下是否有文件显示命令void directory::showfile(){char name[9],ch1;intfindfile=-1;file *pt;if(pfile!=NULL){ pt=pfile;cin>>name;while(pt!=NULL){ findfile=strcmp(name,pt->getfilename());if(findfile==0){ if(pt->getsize()!=0) pt->show_text();else {cout<<"文件中无内容!"<<endl;cout<<"是否编辑该文件(y/n):";cin>>ch1;if(ch1=='y'||ch1=='Y') pt->editfile();}break;}pt=pt->next;}if(findfile!=0) cout<<"文件名错误,无此文件!"<<endl;}else cout<<"当前目录无文件!"<<endl;}//删除文件函数的实现void directory::deletefile(){char filename[9],choice;file *p1,*p2;intfindfile=-1;if(pfile!=NULL){ p1=pfile;cin>>filename;while(p1!=NULL){findfile=strcmp(filename,p1->getfilename());if(findfile==0){ cout<<"真的要删除文件吗?(y/n):";cin>>choice;if(choice=='y'||choice=='Y') {if(p1==pfile) pfile=p1->next; else p2->next=p1->next;/*delete p1;*/break;} }p2=p1;p1=p1->next;}if(findfile!=0) cout<<"文件名错误!"<<endl;}else cout<<"当前目录下无文件!"<<endl;}//新建目录函数的实现voiddirmanager::addnew(){p1=new directory;p1->fatherdir=p;p1->subdir=NULL;p1->nextdir=NULL;if(p->subdir==NULL) p->subdir=p1;else {p2=p->subdir;while(p2->nextdir!=NULL) p2=p2->nextdir;p2->nextdir=p1;}}//进入子目录函数的实现voiddirmanager::cdsubdir(){chardname[9];int find;directory *p3=p;//cout<<"请输入你要进入的目录名:";cin>>dname;if(p->subdir!=NULL){ p3=p3->subdir;while(p3!=NULL) {find=strcmp(dname,p3->getdname());if(find==0) {p=p3;break;}p3=p3->nextdir;}if(find!=0) cout<<"目录名错误!"<<endl;}else cout<<"当前目录为空目录!"<<endl;}//显示所在目录路径函数的实现voiddirmanager::showdir(){ int i=0,j;directory *pd;dir[i++]=p; pd=p->fatherdir;while(pd!=NULL){ dir[i]=pd;pd=pd->fatherdir;i++;}for(j=i-1;j>=0;j--){cout<<dir[j]->getdname();if(j!=0||i==1)cout<<"\\";}cout<<">";}//显示当前目录的文件和目录信息函数的实现voiddirmanager::showdirinfor(){int length;file *pfi;directory *pdi;if(p->pfile!=NULL){ pfi=p->pfile;while(pfi!=NULL){ length=strlen(pfi->getfilename());cout<<pfi->getfilename()<<setw(30-length)<<"<文件>"<<endl;pfi=pfi->next;}}if(p->subdir!=NULL){pdi=p->subdir;while(pdi!=NULL){ length=strlen(pdi->getdname());cout<<pdi->getdname()<<setw(30-length)<<"<目录>"<<endl;pdi=pdi->nextdir;}}if(p->pfile==NULL&&p->subdir==NULL)cout<<"空目录!"<<endl;}//文件和目录管理的主控函数的实现voiddirmanager::manager(){charch;int i;cout<<"新建、进入命令其后都必须加上文件或目录名,显示文件内容也必须加上文件名"<<endl;cout<<"<1>新建目录<2>返回上级目录<3>进入子目录"<<endl;cout<<"<4>新建文件<5>删除文件<6>显示文件内容"<<endl;cout<<"<7>显示当前目录信息<8>退出"<<endl;root=new directory("c:"); root->fatherdir=NULL;root->subdir=NULL;root->nextdir=NULL;p=root;for(i=0;i<200;i++){ cout<<"\n";showdir();cin>>ch;switch(ch){case '1': addnew();break;case '2': {if(p->fatherdir!=NULL) p=p->fatherdir;break;}case '3': cdsubdir();break; //进入子目录case '4': p->creatfile();break;//新建文件case '5' :p->deletefile();break; //删除目录下的文件case '6': p->showfile();break; //显示文件内容case '7': showdirinfor();break; //显示目录信息case '8': exit(1);default: cout<<"无效命令"<<endl;break;}}}void main(){dirmanager admin;admin.manager();}。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验5 添加一个文件系统实验目的文件系统是操作系统中最直观的部分,因为用户可以通过文件直接地和操作系统交互,操作系统也必须为用户提供数据计算、数据存储的功能。

本实验通过添加一个文件系统,进一步理解Linux中的文件系统原理及其实现。

深入理解操作系统文件系统原理学习理解Linux的VFS文件系统管理技术学习理解Linux的ext2文件系统实现技术设计和实现自定义文件系统实验容添加一个类似于ext2的自定义文件系统myext2。

实验主要容:添加一个和ext2完全相同的文件系统myext2修改myext2的magic number修改文件系统操作添加文件系统创建工具实验指导1. 问题描述本实验的容是要添加一个类似于ext2的自定义文件系统myext2。

myext2文件系统的描述如下:1、myext2文件系统的物理格式定义与ext2基本一致,除了myext2的magic number 是0x6666,而ext2的magic number是0xEF53。

2、myext2是ext2的定制版本,它只支持原来ext2文件系统的部分操作,以及修改了部分操作。

2. 实验步骤提示:下面的操作步骤以3.6.6版本的核为例,2.6.15版本的核请参照教材,其它版本核可能会有所区别。

2.1 添加一个和ext2完全相同的文件系统myext2要添加一个与ext2完全相同的文件系统myext2,首先是确定实现ext2文件系统的核源码是由哪些文件组成。

Linux源代码结构很清楚地告诉我们:fs/ext2目录下的所有文件是属于ext2文件系统的。

再检查一下这些文件所包含的头文件,可以初步总结出来Linux 源代码中属于ext2文件系统的有:fs/ext2/acl.cfs/ext2/acl.hfs/ext2/balloc.cfs/ext2/bitmap.cfs/ext2/dir.cfs/ext2/ext2.hfs/ext2/file.c……include/linux/ext2_fs.hinclude/linux/ext2_fs_sb.h接下来开始添加myext2文件系统的源代码到Linux源代码。

把ext2部分的源代码克隆到myext2去,即复制一份以上所列的ext2源代码文件给myext2用。

按照Linux源代码的组织结构,把myext2文件系统的源代码存放到fs/myext2下,头文件放到include/linux 下。

在Linux的shell下,执行如下操作:#cd ~/linux-3.6.6 /* 核源代码目录,假设核源代码解压在主目录的Linux-3.6.6只目录中*/#cd fs#cp –R ext2 myext2#cd ../include/linux#cp ext2_fs.h myext2_fs.h#cp ext2_fs_sb.h myext2_fs_sb.h //3.6.6没有此文件#cd ~/linux-3.6.6/fs/myext2#mv ext2.h myext2.h#cd ~/linux-3.6.6# cd include/asm-generic/bitops# cp ext2-atomic.h myext2-atomic.h# cp ext2-atomic-setbit.h myext2-atomic-setbit.h //3.6.6修改此文件这样就完成了克隆文件系统工作的第一步——源代码复制。

对于克隆文件系统来说,这样当然还远远不够,因为文件里面的数据结构名、函数名、以及相关的一些宏等容还没有根据myext2改掉,连编译都通不过。

下面开始克隆文件系统的第二步:修改上面添加的文件的容。

为了简单起见,做了一个最简单的替换:将原来“EXT2”替换成“MYEXT2”;将原来的“ext2”替换成“myext2”。

对于fs/myext2下面文件中字符串的替换,也可以使用下面的脚本:#!/bin/bashSCRIPT=substitute.shfor f in *doif [ $f = $SCRIPT ]thenecho "skip $f"continuefiecho -n "substitute ext2 to myext2 in $f..."cat $f | sed 's/ext2/myext2/g' > ${f}_tmpmv ${f}_tmp $fecho "done"echo -n "substitute EXT2 to MYEXT2 in $f..."cat $f | sed 's/EXT2/MYEXT2/g' > ${f}_tmpmv ${f}_tmp $fecho "done"done把这个脚本命名为substitute.sh,放在fs/myext2下面,加上可执行权限,运行之后就可以把当前目录里所有文件里面的“ext2”和“EXT2”都替换成对应的“myext2”和“MYEXT2”。

用编辑器的替换功能,把include/linux/myext2_fs.h , include/linux/myext2_fs_sb.h( 3.6.6没有此文件)和include/asm-generic/bitops/myext2-atomic.h,myext2-atomic-setbit.h(3.6.6为此文件)文件中的“ext2”、“EXT2”分别替换成“myext2”、“MYEXT2”在include/asm-generic/bitops.h文件中添加:kernel 3.6.6 :其他核版本可能需要做:在arch/x86/include/asm/bitops.h文件中添加:kernel 3.6.6:其他核版本可能需要做:在include/linux/magic.h 文件中添加”#define MYEXT2_SUPER_MAGIC 0xEF53”源代码的修改工作到此结束。

接下来就是第三步工作——编译源代码。

首先要把myext2加到编译选项中去,以便在做make menuconfig的时候,可以将该选项加上去。

做这项工作只需要修改三个文件:fs/Kconfigfs/Makefilefs/Kconfig中拷贝一份对应的对EXT2文件宏的定义和帮助信息,这样在做make menuconfig 的时候可以查看该选项的有关帮助的容。

fs/Makefile的修改是告核编译系统,当myext2对应的宏被选择上的时候,到fs/myext2目录下去编译myext2文件系统。

在kernel 3.6.6,在fs/Kconfig文件中增加 source “fs/myext2/Kconfig”,并且对“ext2”相关项的地方添加“myext2”项。

在 fs/Makefile 文件中添加“obj-$(CONFIG_MYEXT2_FS) += myext2/”为了在make mencuconfig中看得更加清楚,修改 fs/myext2/Kconfig文件中“Ext2”替换为“MYExt2”,“Second”前加上“MY”一切都准备就绪了,使用make menuconfig选择上myext2,如下:# cd ~/linux-3.6.6# make menuconfig选中ext2和myext2文件系统对应的选项,即原来空白用空格键选中为*号:保存修改,退出。

然后做make等重建核的工作。

第一部分工作——克隆ext2文件系统已经完成了。

新编译出来的核重新启动系统。

下面我们来对添加的myext2文件系统进行一下测试:#pwd/root#dd if=/dev/zero of=myfs bs=1M count=1#/sbin/mkfs.ext2 myfs#cat /proc/filesystems | grep extext2ext3myext2ext4#sudo mount –t myext2 –o loop ./myfs /mnt#mount……/dev/loop0 on /mnt type myext2 (rw)#sudo umount /mnt#sudo mount –t ext2 –o loop ./myfs /mnt#mount……/dev/loop0 on /mnt type ext2 (rw)#sudo umount /mnt2.2 修改myext2的magic number在上面做的基础上。

找到myext2的magic number,并将其改为0x6666:2.6.20以后核版本,这个值在include/linux/magic.h文件中。

2.6.15核参照教材。

- #define MYEXT2_SUPER_MAGIC 0xEF53+ #define MYEXT2_SUPER_MAGIC 0x6666改动完成之后,再用make重新编译核。

以新核重新启动,准备下面的测试。

在我们测试这个部分之前,我们需要写个小程序changeMN.c,来修改我们创建的myfs 文件系统的magic number。

因为它必须和核中记录myext2文件系统的magic number匹配,myfs文件系统才能被正确地mount。

changeMN.c程序可以在课程中下载。

这个程序经过编译后产生的可执行程序名字为changeMN。

下面我们开始测试:#dd if=/dev/zero of=myfs bs=1M count=1#/sbin/mkfs.ext2 myfs#./changeMN myfs#sudo mount –t myext2 –o loop ./fs.new /mnt#mount/home/user/fs.new on /mnt type myext2 (rw)#sudo umount /mnt# sudo mount –t ext2 –o loop ./fs.new /mntmount: wrong fs type, bad option, bad superblock on /dev/loop0, …#2.3 修改文件系统操作myext2只是一个实验性质的文件系统,我们希望它只要能支持简单的文件操作即可。

因此在完成了myext2的总体框架以后,我们来修改掉myext2支持的一些操作,来加深对操作系统对文件系统的操作的理解。

下面以裁减myext2的mknod操作为例,了解这个过程的实现流程。

Linux将所有的对块设备、字符设备和命名管道的操作,都看成对文件的操作。

mknod 操作是用来产生那些块设备、字符设备和命名管道所对应的节点文件。

在ext2文件系统中它的实现函数如下:fs/ext2/namei.c, line 144144 static int ext2_mknod (struct inode * dir, struct dentry *dentry, int mode, dev_t rdev)145 {146 struct inode * inode;147 int err;148149 if (!new_valid_dev(rdev))150 return -EINVAL;151152 inode = ext2_new_inode (dir, mode);153 err = PTR_ERR(inode);154 if (!IS_ERR(inode)) {155 init_special_inode(inode, inode->i_mode, rdev);156 #ifdef CONFIG_EXT2_FS_XATTR157 inode->i_op = &ext2_special_inode_operations;158 #endif159 mark_inode_dirty(inode);160 err = ext2_add_nondir(dentry, inode);161 }162 return err;163 }它定义在结构ext2_dir_inode_operations中:fs/ext2/namei.c, line 400392 struct inode_operations ext2_dir_inode_operations = {393 .create = ext2_create,394 .lookup = ext2_lookup,395 .link = ext2_link,396 .unlink = ext2_unlink,397 .symlink = ext2_symlink,398 .mkdir = ext2_mkdir,399 .rmdir = ext2_rmdir,400 .mknod = ext2_mknod,401 .rename = ext2_rename,402 #ifdef CONFIG_EXT2_FS_XATTR403 .setxattr = generic_setxattr,404 .getxattr = generic_getxattr,405 .listxattr = ext2_listxattr,406 .removexattr = generic_removexattr,407 #endif408 .setattr = ext2_setattr,409 .permission = ext2_permission,410 };当然,从ext2克隆过去的myext2的myext2_mknod,以及myext2_dir_inode_operations 和上面的程序是一样的。

相关文档
最新文档