实验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.实验名称:文件系统扩展实验2.实验要求:对【程序5_9】进行扩展,要求参数为目录名,且其下至少有三层目录,分别用深度遍历及广度遍历两种方法对此目录进行遍历,输出此目录下所有文件的大小及修改时间。

3.实验目的:(在实验过程中应用的操作系统理论知识)1.熟悉和应用深度优先和广度优先遍历算法2.熟练掌握linux 系统下关于文件系统的API3.掌握有关数据结构和指针的应用4.掌握使用gdb 调试的方法5.掌握实际运用中堆栈的内存分配4.实验内容:(为完成实验,如何进行程序设计)DFS:整体思路: 从所给的目录进入,按照reddir打开指针的顺序开始逐个遍历,遇到文件就按照规定格式输出信息。

遇到目录就对该目录进行DFS,之后返回上一级继续遍历。

当当前目录没有文件时返回流程图:重点部分: 重点是DFS 对退出循环和回溯时间点的把握。

这里退出循环的时间点是当前目录没有可读文件或者目录。

回溯时间点是当读到的文件为目录时,进入下一层DFS BFS:整体思路:利用队列,参考二叉树的层次遍历。

先将根目录入队,循环出队列。

进入目录后,当读取到文件时,输出信息;当读取到目录时,将目录入队,继续读取下一个文件;当当前目录的文件遍历完成时,退出此目录循环,从队列中弹出一个目录,再进入循环。

当队列为空时,退出。

流程图:重点部分: 1. 队列的建立,队列使用链表连接,存放字符串数据,要注意内存的分配和释放2.入队出队的时机;先将根目录入队,退出循环的条件为队列为空。

入队的条件为当前文件为目录。

出队的条件为一个目录遍历完毕。

5.程序:(较之已有程序有修改的、新增的程序段加下划线)#include<unistd.h>#include<stdio.h>#include<stdlib.h>#include<errno.h>#include<sys/types.h>#include<sys/stat.h>#include<dirent.h>#include<time.h>#include<string.h>#include<ctype.h>/*辅助函数输出文件的大小和最后修改时间*/static int get_file_size_time(const char *filename){struct stat statbuf;if(stat(filename,&statbuf)==-1) //取filename 的状态{printf("Get stat on %s Error:%s\n",filename,strerror(errno));return(-1);}if(S_ISDIR(statbuf.st_mode))return(1); //判断是否是目录文件if(S_ISREG(statbuf.st_mode)) //判断是否是普通文件printf("\t size:%ld bytes\t modifiedate: %s\n",statbuf.st_size,ctime(&statbuf.st _mtime)); //输出文件的大小和最后修改时间return(0);}/******************************** BFS 利用队列********************************************/// 在strcpy 指针前要先申请空间struct node {char* data;struct node* next;// struct node* pre;} *head,*tail,*tmp; // 头节点,尾节点,临时节点count++; }6.运行结果:(进行反白处理后截图)DFS:BFS7.实验总结:编程、调试过程中遇到的问题及解决办法。

Lniux文件系统实验报告

Lniux文件系统实验报告

实验五文件系统
一、实验目的
1.掌握Linux系统下fdisk命令的用法。

2.掌握Linux系统下文件系统的创建、挂载与卸载。

3.掌握Linux系统下利用RAID技术实现磁盘冗余阵列的方法。

二、实验内容
1.磁盘分区管理
2.动态磁盘管理
三、实验指导
1.服务器现需要新建一块20GB的硬盘,需要对新增的硬盘进行分区管理、分区方案为/user目录所在分区10GB,/backup目录所在分区5GB,/home目录所在分区5GB。

步骤一,添加新硬盘
点击“编辑虚拟机设置”按钮,如下图
选择添加硬盘,如下图
下一步选择“SCSI(S)推荐”,如下图
下一步创建“新虚拟磁盘”,设置磁盘空间大小为“20GB”,如下图所示
单击完成,即完成了新硬盘的添加,如下图所示
通过fdisk -l命令查看新硬盘是否添加成功
步骤二,利用fdisk命令对/dev/sdb/进行分区
步骤三,格式化新建分区,在各分区上建立ext3类型的文件的系统,建立时要求检查磁盘坏块并显示详细信息。

步骤四,将/dev/sdb1挂载到/user目录,/dev/sdb2挂载到
/backup目录,/dev/sdb3挂载到/home目录
2、某公司的Linux服务器新增两块硬盘,硬盘大小为40GB。

为了实现数据保护功能,现需利用2块硬盘创建RAID1卷。

要求创建的RAID设备名为/dev/md110,并利用mkfs命令创建ext3文件系统。

最后将文件系统挂载到系统上。

四、实验总结
通过本次实验,我学习到fdisk 的一些命令和在Linux 系统下利用RAID 技术实现磁盘冗余阵列的方法。

文件系统模拟实验(C-实验教材)

文件系统模拟实验(C-实验教材)

文件系统实验1.1实验目的和要求1.1.1实验目的通常把文件与管理信息资源的管理程序的集合称为文件系统,它是操作系统中负责存取和管理信息资源的模块,采用统一的方法管理用户信息和系统信息的存储、检索、更新、共享和保护,并为用户提供一套行之有效的文件使用及操作方法。

本实验利用高级语言编写程序模拟文件系统,了解文件系统的基本结构和文件的各种操作方法,加深理解文件系统的内部功能及内部实现,从而帮助学生对各种文件操作命令的实质内容和执行过程有比较深入的了解。

1.1.2实验要求1.采用高级语言编写程序模拟文件系统,文件系统采用多级目录结构,实现对文件和目录的创建、删除、重命名、变更权限、显示文件内容、修改文件内容等操作。

2.撰写实验报告,报告应包含以下内容:(1)实验目的;(2)实验内容;(3)设计思路;(4)程序流程图;(5)程序中主要数据结构和函数说明;(6)带注释的源程序代码;(7)程序运行结果及分析(8)实验收获与体会1.2预备知识1.2.1文件和文件系统1.文件概念现代计算机系统中都配置了外存,大量的程序和数据以文件的形式存放在外存。

如果由用户直接管理文件,不仅要求用户熟悉外存特性,了解各种文件的属性,以及它们在外存上的位置,而且多用户环境下还必须能保持数据的安全性和一致性,这是用户不能胜任的。

因而,现代操作系统中都配备文件系统,以适应系统资源管理和用户使用信息的需要。

文件是指由创建者所定义的、具有文件名的一组相关元素的集合。

用户通过文件名就可对文件进行访问,文件名是由字母或数字组成的字母或数字串,其格式和长度都因系统而异。

操作系统提供文件系统的优点有:(1)便于用户使用。

(2)文件安全可靠。

(3)系统能有效利用存储空间,优化安排不同属主文件的位置。

(4)文件系统还能提供文件共享功能。

2.文件命名在不同的操作系统中对文件名的规定有所不同,文件名的格式和长度因系统而异。

一般来说,文件名由文件名和扩展名两部分组成,前者用于标识文件,后者用于区分文件类型,中间用“.”分割开来,它们都是字母或数字所组成的字母数字串。

操作系统实验-文件系统设计

操作系统实验-文件系统设计

文件系统设计1.目的和要求本实验的目的是通过一个简单多用户文件系统的设计,加深理解文件系统的内部功能和内部实现。

实验要求:①在系统中用一个文件来模拟一个磁盘;②此系统至少有:Create、delete、open、close、read、write等和部分文件属性的功能。

③实现这个文件系统。

④能实际演示这个文件系统。

基本上是进入一个界面(此界面就是该文件系统的界面)后,可以实现设计的操作要求。

2.实验内容1)设计一个10个用户的文件系统,每次用户可保存10个文件,一次运行用户可以打开5个文件。

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

另外,为打开文件设置了运行文件目录(AFD)。

3)为了便于实现,对文件的读写作了简化,在执行读写命令时,只需改读写指针,并不进行实际的读写操作。

4)因系统小,文件目录的检索使用了简单的线性搜索。

5)文件保护简单使用了三位保护码:允许读写执行、对应位为1,对应位为0,则表示不允许读写、执行。

6)程序中使用的主要设计结构如下:主文件目录和用户文件目录(MFD、UFD),打开文件目录(AFD)即运行文件目录。

3.实验环境VC 6.04.实验提示1) format 格式化只写打开模拟文件,初始化超级快,初始化dinode 位图 block 位图,初始化主目录,初始化etc 目录,初始化管理员admin 目录,初始化用户xiao 目录,初始化 用户passwd 文件,写入模拟硬盘文件。

2 )install 安装读写打开模拟文件,读取dinode 位图 block 位图,读取主目录,读取etc 目录,读取管理员admin 目录,读取用户xiao 目录,读取 用户passwd 文件。

3 )login 登陆用户输入用户名和密码,在passwd 文件中查找是否有此用户,核对密码。

正确则登陆成功,当前目录设定到当前用户文件夹下。

Login登录结束是,登录成功输入用户名查找是否有改用户名输入密码是否密码是否正确否4 )ialloc 申请inode 空间先检测inode 位图是否加锁,是则退出。

W5 实验五 文件系统制作实验

W5 实验五 文件系统制作实验

实验五 嵌入式文件系统的构建【实验目的】1、了解嵌入式操作系统中文件系统的类型和作用 2、了解 JFFS2 文件系统的优点及其在嵌入式系统中的作用 3、掌握利用 BusyBox 软件制作嵌入式文件系统的方法 4、掌握嵌入式 Linux 文件系统的的挂载过程【实验原理】1、Linux 文件系统的类型 (1) 、EXT 文件系统 Ext2fs 是 Linux 的标准文件系统,它已经取代了扩展文件系统(或 Extfs) 。

扩展文件系 统 Extfs 支持的文件大小最大为 2 GB, 支持的最大文件名称大小为 255 个字符, 而且它不支 持索引节点(包括数据修改时间标记) 。

Ext2fs 取代 Extfs 具有一些优点:  Ext2fs 支持达 4 TB 的内存。

 Ext2fs 文件名称最长可以到 1012 个字符。

 在创建文件系统时,管理员可以根据需要选择存储逻辑块的大小(通常大小可选择 1024、2048 和 4096 字节) 。

 Ext2fs 可以实现快速符号链接(相当 windows 文件系统的快捷方式) ,不需为符号链接 分配数据块,并且可将目标名称直接存储在索引节点(inode)表中。

这使文件系统的 性能有所提高,特别在访问速度上。

由于 Ext2fs 文件系统的稳定性、可靠性和健壮性,所以几乎在所有基于 Linux 的系统 (包括台式机、服务器和工作站,并且甚至一些嵌入式设备)上都使用 Ext2fs 文件系统。

(2) 、NFS 文件系统 NFS 是一个 RPC service ,它是由 SUN 公司开发,并于 1984 年推出。

NFS 文件系统能 够使文件实现共享,它的设计是为了在不同的系统之间使用,所以 NFS 文件系统的通信协 议设计与作业系统无关。

当使用者想使用远端文件时只要用“mount”命令就可以把远端文 件系统挂载在自己的文件系统上,使远端的文件在使用上和本地机器的文件没有区别。

实验指导书-文件系统

实验指导书-文件系统

实验:文件系统实训课时:2实训目的:1、了解Linux的文件系统类型2、掌握Linux的文件权限的设置实验设备和环境已经安装好Linux操作系统的计算机一台实训内容:一、文件和目录类命令的使用●用pwd命令查看当前所在的目录。

●用ls命令列出此目录下的文件和目录。

-a选项列出此目录下包括隐藏文件在内的所有文件和目录-l命令以长格形式列出当前目录下的所有文件●用cd命令实现目录之间的切换。

●利用touch命令,在当前目录创建一个新的空文件●利用mkdir命令创建一个新目录。

●利用cat、more、less、head、tail命令查看文件内容。

二、设置文件权限●创建目录test,进入test目录创建空文件file1。

并以长格形式显示文件信息,注意文件的权限和所属用户和组。

●对文件file1设置权限,使其他用户可以对此文件进行写操作。

并查看设置结果。

●取消同组用户对此文件的读取权限。

查看设置结果。

●用数字形式为文件file1设置权限,所有者可读、可写、可执行;其他用户和所属组用户只有读和执行的权限。

设置完成后查看设置结果。

●用数字形式更改文件file1的权限,使所有者只能读取此文件,其他任何用户都没有权限。

查看设置结果。

●为其他用户添加写权限。

查看设置结果。

●回到上层目录,查看test的权限。

●为其他用户添加对此目录的写权限。

●查看目录test及其中文件的所属用户和组。

chown 用户:属组文件列表chgrp 属组文件列表●把目录test及其下的所有文件的所有者改成bin,所属组改成daemon。

查看设置结果。

●删除目录test及其下的文件。

文件系统实验说明书(含代码).

文件系统实验说明书(含代码).

文件系统实验说明书(含代码).摘要本程序将模拟一个很简单的文件系统,实现对文件的管理和控制功能,文件系统向用户提供了一整套的文件体统调用命令,在用户程序中用户可通过使用文件系统提供的一系列命令对文件进行操作。

其功能对文件的增加、删除、显示、修改,以及对文件目录的查询(显示)、改变、创建、删除、等操作文件采用的物理结构为连续。

程序是采用二级文件目录。

(即设置主目录(MFD)和用户文件目录(UFD)。

另外,为打开文件设置指针。

为了方便实现,对文件的读写作了简化。

在执行读写命令时,只需改读写指针。

并不进行实际的读写操作。

关键词:文件系统文件指针模拟管理信息正文1.设计思想程序是采用二级文件目录。

(即设置主目录(MFD)和用户文件目录(UFD)。

另外,为打开文件设置指针。

为了方便实现,对文件的读写作了简化。

在执行读写命令时,只需改读写指针。

并不进行实际的读写操作。

框图如下:(用户“1”文件目录)(用户目录) 1 文件名保护码文件长度文件指针MFD 2用户1(名字) 3用户2 4用户3 5用户4 678910(用户“2”文件目录)1 文件名保护码文件长度文件指针2345678910图1 目录框图实验开始,先进入MFD表,初值为空。

输入用户名字,需要保存用户名字,同时也有了有个新文件目录表。

接着是文件的一系列的基本操作:1、打印所有文件名。

2、打开一个文件。

3、添加一个文件。

4、删除一个文件。

5、改文件的保护码。

6、写文件。

7、读文件。

8、退出。

2. 函数调用关系图:图2 流程图在MFD 中找到该用户输入用户名开始输入操作命令初始化运行文件表AFD显示该用户目录表UFD 中的所有文件是什么命令打开全部文件打开一个文件创建一个文件删除文件读文件写文件改变保护码退出结束3.算法用到的主要数据结构//结构体,用户变量struct user {char name[10];}user[10];//结构体,文件变量struct link {struct file {char name[10]; //文件名int lenght; //文件长度int write; //读文件int read; //写文件int exe;}file[10];int used;}link[10];4.相关的各模块的伪码算法检测用户函数checkuser(){for(int i=0;i<10;i++){s=strcmp(“cin<<name”,);< p="">if(s==0) return i;}建立用户函数createuser(){strcpy(,”cin<<name”);< p="">link[in].used=0;in++;}打开所有文件openall(){If :file p==0 ,file is empty;else :{cout<<"文件名读保护写保护执保护"<<endl;< p="">cout<<、、、、、、、、、相、、、、、、、、关、、、、、、、、、值、、、、、、、、}}打开单个文件openfile(){ if :cin>>name;int i=find();cannot find;file not existelse :{cout<<"文件名读保护写保护执保护文件长度”<<endl;< p=""> cout <<、、、、、、相、、、、、、、、关、、、、、、、、、、、值、、、、、、、、、、、} }建立文件createfile(){cin>>file name;write=0;read=0;exe=0;lenght=0;}删除文件deletefile(){ cin>>file nameUse function find()If cannot find;cout<<"此文件不存在!";else {deletefile and some filepointers; }写文件write(){ cin>>file nameFunction find();If:cannot findcout<<"此文件不存在!";else :{cin>>lengthfile.lenght+=l;}}读文件 read(){ cin>>file name;Function find();If :cannot findcout<<此文件不存在!else :{cout<<文件已经打开cout<<"文件长度为:file.length }}查找 find(){for(int i=0;i<10;i++){a=strcmp(“cin <<name”,);< p="">if :a=0 ,return i;}}5.调试分析调试中遇到的问题及对问题的解决方法:由于文件管理系统相对于本人来说不是那么容易就可以轻易实现的,在设计之前,我先做了些准备工作,首先设计在实现程序中要用到的数据结构模型,使用了结构体数据结构,然后将各个功能模块化,依次编写,调试。

操作系统实验5文件系统:Linux文件管理

操作系统实验5文件系统:Linux文件管理

实验5 文件系统: Linux文件管理1. 实验目的〔1〕掌握Linux提供的文件系统调用的使用方法;〔2〕熟悉文件和目录操作的系统调用用户接口;〔3〕了解操作系统文件系统的工作原理和工作方式。

2. 实验内容〔1〕利用Linux有关系统调用函数编写一个文件工具filetools, 要求具有下列功能:***********0.退出1.创建新文件2.写文件3.读文件4.复制文件5.修改文件权限6.查看文件权限7.创建子目录8.删除子目录9.改变当前目录到指定目录10.操作***********代码:#include<stdio.h>#include<sys/types.h>#include<unistd.h>#include<fcntl.h>#include<sys/stat.h>#include<syslog.h>#include<string.h>#include<stdlib.h>void menu(void);void openfile(void);void writefile(void);void readfile(void);void copyfile(void);void chmd(void);void ckqx(void);void cjml(void);void scml(void);void ggml(void);void ylj(void);int main(){int choose;int suliangjin=1;menu();scanf("%d",&choose);while(choose!=0){switch(choose){case 1:openfile();break;case 2:writefile();break;case 3:readfile();break;case 4:copyfile();break;case 5:chmd();break;case 6:ckqx();break;case 7:cjml();break;case 8:scml();break;case 9:ggml();break;case 10:ylj();break;}menu();scanf("%d",&choose);}return 0;}void menu(void){printf("文件系统\n");printf("1.创建新文件\n");printf("2.写文件\n");printf("3.读文件\n");printf("4.复制文件\n");printf("5.修改文件权限\n");printf("6.查看文件权限\n");printf("7.创建子目录\n");printf("8.删除子目录\n");printf("9.改变目前目录到指定目录\n");printf("10.操作\n");printf("0.退出\n");printf("请输入您的选择...\n");}void openfile(void){int fd;if((fd=open("/tmp/hello.c",O_CREAT|O_TRUNC|O_RDWR,0666))<0) perror("open");elseprintf("open file:hileo.c %d\n",fd);if(close(fd)<0)perror("close");elseprintf("Close hello.c\n");}void writefile(void){int fd,size,len;char *buf="Hello!I'm writing to this file!";len=strlen(buf);if((fd=open("/tmp/hello.c",O_CREAT|O_TRUNC|O_RDWR,0666))<0) perror("open");elseprintf("open file:hileo.c %d\n",fd);if((size=write(fd,buf,len))<0)perror("write");elseprintf("Write:%s\n",buf);if(close(fd)<0)perror("close");elseprintf("Close hello.c \n");}void readfile(void){int fd,size;char b[10];if((fd=open("/tmp/hello.c",O_CREAT|O_TRUNC|O_RDWR,0666))<0) perror("open");elseprintf("open file:hileo.c %d\n",fd);lseek(fd,0,SEEK_SET);if((size=read(fd,b,10))<0)perror("read");elseprintf("read from file:%s\n",b);if(close(fd)<0)perror("close");elseprintf("Close hello.c\n");}void copyfile(void){if(fork()==0)execlp("/bin/cp","cp","/tmp/hello.c","/tmp/he.c",NULL);elsewait(0);printf("将hello.c复制he.c");}void chmd(void){int a;printf("1.文件主可读可写可执行\n");printf("2.文件主可读\n");printf("3.文件主可写\n");printf("4.文件主可执行\n");printf("请输入您的选项\n");scanf("%d",&a);switch(a){case 1:chmod("/tmp/hello.c",S_IRWXU);printf("ok!\n");break;case 2:chmod("/tmp/hello.c",S_IRUSR);printf("ok!\n");break;case 3:chmod("/tmp/hello.c",S_IWUSR);printf("ok!\n");break;case 4:chmod("/tmp/hello.c",S_IXUSR);printf("ok!\n");break;default:printf("您选择有误\n");}}void ckqx(void){char *path="/bin/ls";char *argv[4]={"ls","-l",NULL};if(fork()==0)execv(path,argv);elsewait(0);}void cjml(void){if(mkdir("/tmp/a",S_IRWXU)<0)perror("Mkdir");elseprintf("创建成功\n");}void scml(void){if(rmdir("/tmp/a")<0)perror("Rmdir");elseprintf("删除成功\n");}void ggml(void){if(chdir("/tmp/bc")<0)perror("chdir");elseprintf("更改目录成功\n"); }void ylj(void){if(link("hello.c","h.c")<0)perror("Link");elseprintf("建立硬连接\n"); }打开文件:写文件:读文件:复制文件: 修改权限: 查看权限:创建目录:删除目录:更改目录:硬连接:1.问题解决方案:在复制文件时用execlp函数, 虽然有复制成功但是他就跳出整个程序, 这就是一个缺陷。

计算机操作系统实验指导计算机文件系统

计算机操作系统实验指导计算机文件系统

第一一章￿文件系统设计《计算机操作系统实验指导》文件系统•文件系统是操作系统最直观地部分,用户可以通过文件直接地与操作系统互,操作系统也需要为用户提供数据计算,数据存储地功能。

•文件是数据地集合,文件系统不仅包含着文件地数据,还有文件系统地结构。

文件系统负责管理外存上地文件,并把对文件地存取,享与保护以接口地方式提供给操作系统与用户。

它不仅方便了用户使用,保证了文件地安全,还可以极大地提高系统资源地利用率。

因此,文件系统是操作系统最为重要地组成部分之一。

设计一个简单文件系统本章实验内容是设计一个简单文件系统。

实验主要内容分为四个部分:添加一个类似ext二地文件系统myext二;修改myext二地magic number;修改文件系统操作;添加文件系统创建工具。

实验这个类似于ext二地自定义文件系统myext二具体描述如下:myext二文件系统地物理格式定义与ext二基本一致,但 myext二地magic number是0x六六六六,ext二地magic number是0xEF五三。

myext二是ext二地定制版本,它不但支持原来ext二文件系统地部分操作,还通过修改实现了与原文件系统不同地操作,另外,还添加了文件系统创建工具。

注意:该实验需要在root权限下行,实验前请切换权限。

(一)源代码复制把ext二部分地源代码克隆到myext二,按照Linux源代码地组织结构,把myext二文件系统地源代码存放到fs/myext二下,头文件放到include/linux下。

执行如下操作:#cd /usr/src/linux /*内核源代码目录,假设内核源代码解压在主目录地linux子目录*/ #cd fs#cp -R ext二 myext二#cd /usr/src/linux/fs/myext二#mv ext二.h myext二.h#cd /lib/modules/$(uname -r)/build/include/linux#cp ext二_fs.h myext二_fs.h#cd /lib/modules/$(uname -r)/build/include/asm-generic/bitops#cp ext二-atomic.h myext二-atomic.h#cp ext二-atomic-setbit.h myext二-atomic-setbit.h命令地执行没有输出结果。

操作系统实验---文件系统

操作系统实验---文件系统

实验报告实验题目:文件系统姓名:学号:课程名称:操作系统所在学院:信息科学与工程学院专业班级:计算机任课教师:实验项目名称文件系统一、实验目的与要求:1、通过一个简单多用户文件系统的设计,加深理解文件系统的内部功能及其内部实现。

2、熟悉文件管理系统的设计方法,加深对所学各种文件操作的了解及其操作方法的特点。

3、通过模拟文件系统的实现,深入理解操作系统中文件系统的理论知识, 加深对教材中的重要算法的理解。

4、通过编程实现这些算法,更好地掌握操作系统的原理及实现方法,提高综合运用各专业课知识的能力。

二、实验设备及软件:一台PC(Linux系统)三、实验方法(原理、流程图)试验方法(1)首先应当确定文件系统的数据结构:主目录、子目录以及活动文件等。

主目录和子目录都以文件的形式存放于磁盘,这样便于查找和修改。

(2)用户创建文件,可以编号存储于磁盘上。

如file0,file1,file2…并以编号作为物理地址,在目录中登记。

文件系统功能流程图图1.文件系统总体命令分析图 2.登录流程图图 3. ialloc流程图图4.balloc流程图图5.密码修改流程图图6.初始化磁盘图 7.显示所有子目录 dir/ls 操作流程图图8.创建文件 creatfile 、创建目录 mkdir 流程图图9.改变当前路径 cd 操作流程图实验原理1.文件操作◆mkdir 创建目录文件模块,输入 mkdir 命令,回车,输入文件名,回车,即会在当前目录文件下创建一个名为刚刚输入的文件名的目录文件。

在该创建过程中首先要判断该目录中有没有同名的文件,如果有的话就创建失败,还要判断在该目录下有没有创建文件的权限,有权限才可以创建。

具体流程图查看第二节,系统流程图设计部分。

◆del 删除文件模块,输入 del命令,回车,输入文件名,回车,即会在当前目录文件下删除一个名为刚刚输入的文件名的数据文件。

在该删除过程中要判断该目录中是否存在该文件,如果不存在就没有必要执行该操作了,还要判断在该目录下有没有删除文件的权限,有权限才可以删除。

实验5添加一个文件系统

实验5添加一个文件系统

实验5添加⼀个⽂件系统实验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源代码。

  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 和上面的程序是一样的。

相关文档
最新文档