实验5 文件系统

合集下载

文件系统实验报告

文件系统实验报告

嵌入式系统实验报告(二)--嵌入式文件系统的构建138352019陈霖坤一实验目的了解嵌入式操作系统中文件系统的类型和作用了解JFFS2文件系统的优点及其在嵌入式系统中的作用掌握利用Busybox软件制作嵌入式文件系统的方法掌握嵌入式linux文件系统的挂载过程二实验内容与要求编译BusyBox,以BusyBox为基础,构建一个适合的文件系统;制作ramdisk文件系统映像,用你的文件系统启动到正常工作状态;研究NFS作为根文件系统的启动过程。

三Busybox介绍BusyBox最初是由Bruce Perens在1996年为Debian GNU/Linux安装盘编写的,其原始构想是希望在一张软盘上能放入一个开机系统,以作为急救盘和安装盘。

后来它变成了嵌入式Linux设备和系统和Linux发布版安装程序的实质标准,因为每个Linux可执行文件需要数Kb的空间,而集成两百多个程序的BusyBox可以节省大量空间。

Busybox集成了包括mini-vi编辑器、/sbin/init、文件操作、目录操作、系统配置等应用程序。

Busybox支持多种体系结构,可以选择静态或动态链接,以满足不同需要。

四linux文件系统文件系统是对一个存储设备上的数据和元数据进行组织的机制,linux文件系统接口设计为分层的体系结构,从而将用户接口层、文件系统实现层和操作存储设备的驱动程序分隔开。

在文件系统方面,linux可以算得上操作系统中的“瑞士军刀”。

Linux支持许多种文件系统,从日志型文件系统到集群文件系统和加密文件系统,而且对于使用标准的和比较奇特的文件系统以及开发文件系统来说,linux是极好的平台,这得益于linux内核中的虚拟文件系统(VFS,也称虚拟文件系统交换器)。

文件结构Windows的文件结构是多个并列的树状结构,不同的磁盘分区各对应一个树。

Linux的文件结构是单个的树,最上层是根目录,其它目录都从根目录生成。

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

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

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

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

要求设计一个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实验总结:
认真填写实验报告。

文件系统实验报告

文件系统实验报告

文件系统实验报告文件系统实验报告篇一:内核,文件系统实验报告一嵌入式系统实验报告(一) 091180083刘浩通信工程一、实验目的了解嵌入式系统的开发环境,内核的下载和启动过程;了解Linux内核源代码的目录结构及相关内容;了解Linux内核各配置选项的内容和作用;掌握Linux内核的编译过程;理解嵌入式操作系统文件系统的类型和作用;了解jffs2文件系统的优点及其在嵌入式系统中的作用;掌握busybx软件制作嵌入式文件系统的方法;掌握Linux嵌入式文件系统的挂载过程。

二、嵌入式系统开发实验1、mini和tftp(1)串口通信的硬件基础:嵌入式系统一般通过异步串行接口(UART)进行初级引导。

本实验中用到的是RS-232C标准的接口。

(2)软件结构:mini 运行mini,Ctrl+A-进入mini的cnfiguratin界面。

对串行通信接口进行配置,如串行通信口的设置,波特率、数据位等串口参数的设置。

保存好设置后以后可以不用再设置。

(3)btlader引导:给开发板加电,任意按下一个键进入btlader界面。

可以通过命令行方式进行设置,按0进入命令行模式,出现 51bard,可以设置开发板和pc机的ip地址:set myipaddr 192.168.207.113(设置开发板的ip地址),set destipaddr 192.168.207.13(设置pc机的ip地址)。

注意ip地址的设置:使其处于同一网段,并且避免和其他系统的ip发生冲突。

(4)通过btlader的主菜单可以完成很多功能,3——下载内核,4——将内核烧进flash,5——下载文件系统,6——将文件系统烧进flash,7——启动嵌入式操作系统等。

由于btlader需要从服务器上下载内核和文件系统,一般采用tftp服务。

进入/etc/xinetd.d/tftp修改配置,注意一定要关闭防火墙,否则可能导致下载时出问题。

再设置完后要重新启动tftp服务。

文件系统实验

文件系统实验

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

6.1.2 实验内容为DOS系统设计一个简单的二级文件系统。

要求做到以下几点:(1)可以实现下列几条命令LOGIN 用户登陆DIR 列文件目录CREATE 创建文件DELETE 删除文件OPEN 打开文件CLOSE 关闭文件READ 读文件WRITE 写文件(2)列目录时要列出文件名,物理地址,保护码和文件长度。

(3)源文件可以进行读写保护。

6.1.3 实验环境(1)PC兼容机(2)Windows、DOS系统(3)TC语言6.1.4 实验提示(1)首先应确定文件系统的数据结构:主目录、子目录及活动文件等。

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

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

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

6.1.5 实验参考代码参考程序见下(本程序需要在c:下建一个名为osfile的目录及一个名为file的子目录):#include "stdio.h"#include "string.h"#include "conio.h"#include "stdlib.h"#define MAXNAME 25 /*the largest length of mfdname,ufdname,filename*/#define MAXCHILD 50 /*the largest child*/#define MAX (MAXCHILD*MAXCHILD) /*the size of fpaddrno*/typedef struct /*the structure of OSFILE*/{int fpaddr; /*file physical address*/int flength; /*file length*/int fmode; /*file mode:0-Read Only;1-Write Only;2-Read and Write(default);*/ char fname[MAXNAME]; /*file name*/} OSFILE;typedef struct /*the structure of OSUFD*/{char ufdname[MAXNAME]; /*ufd name*/OSFILE ufdfile[MAXCHILD]; /*ufd own file*/}OSUFD;typedef struct /*the structure of OSUFD'LOGIN*/{char ufdname[MAXNAME]; /*ufd name*/char ufdpword[8]; /*ufd password*/} OSUFD_LOGIN;typedef struct /*file open mode*/{int ifopen; /*ifopen:0-close,1-open*/int openmode; /*0-read only,1-write only,2-read and write,3-initial*/}OSUFD_OPENMODE;OSUFD *ufd[MAXCHILD]; /*ufd and ufd own files*/OSUFD_LOGIN ufd_lp;int ucount=0; /*the count of mfd's ufds*/int fcount[MAXCHILD]; /*the count of ufd's files*/int loginsuc=0; /*whether login successfully*/char username[MAXNAME]; /*record login user's name22*/char dirname[MAXNAME];/*record current directory*/int fpaddrno[MAX]; /*record file physical address num*/OSUFD_OPENMODE ifopen[MAXCHILD][MAXCHILD]; /*record file open/close*/ int wgetchar; /*whether getchar()*/FILE *fp_mfd,*fp_ufd,*fp_file_p,*fp_file;void main(){int i,j,choice1;char choice[50]; /*choice operation:dir,create,delete,open,delete,modify,read,write*/ int choiceend=1; /*whether choice end*/char *rtrim(char *str); /*remove the trailing blanks.*/char *ltrim(char *str); /*remove the heading blanks.*/void LoginF(); /*LOGIN FileSystem*/void DirF(); /*Dir FileSystem*/void CdF(); /*Change Dir*/void CreateF(); /*Create File*/void DeleteF(); /*Delete File*/void ModifyFM(); /*Modify FileMode*/void OpenF(); /*Open File*/void CloseF(); /*Close File*/void ReadF(); /*Read File*/void WriteF(); /*Write File*/void QuitF(); /*Quit FileSystem*/void help();if((fp_mfd=fopen("c:\\osfile\\mfd","rb"))==NULL){fp_mfd=fopen("c:\\osfile\\mfd","wb");fclose(fp_mfd);}for(i=0;i<MAX;i++) fpaddrno[i]=0;// textattr(BLACK*16|WHITE);system("cls");// clrscr(); /*clear screen*/LoginF(); /*user login*///clrscr();system("cls");if(loginsuc==1) /*Login Successfully*/{while (1){wgetchar=0;if (choiceend==1){printf("\n\nC:\\%s>",strupr(dirname));} //strupr将所有小写字母转换成大写else printf("Bad command or file name.\nC:\\%s>",strupr(username));gets(choice);strcpy(choice,ltrim(rtrim(strlwr(choice)))); //strlwr将所有大写字母转换成小写if (strcmp(choice,"dir")==0) choice1=1;else if(strcmp(choice,"creat")==0) choice1=2;else if(strcmp(choice,"delete")==0) choice1=3;else if(strcmp(choice,"attrib")==0) choice1=4;else if(strcmp(choice,"open")==0) choice1=5;else if(strcmp(choice,"close")==0) choice1=6;else if(strcmp(choice,"read")==0) choice1=7;else if(strcmp(choice,"modify")==0) choice1=8;else if(strcmp(choice,"exit")==0) choice1=9;else if(strcmp(choice,"cls")==0) choice1=10;else if(strcmp(choice,"cd")==0) choice1=11;else if(strcmp(choice,"help")==0) choice1=20;else choice1=12;switch(choice1){case 1:DirF();choiceend=1;break;case 2:CreateF();choiceend=1;if(!wgetchar) getchar();break;case 3:DeleteF();choiceend=1;if(!wgetchar)getchar();break;case 4:ModifyFM();choiceend=1;if(!wgetchar) getchar();break;case 5:choiceend=1;OpenF();if (!wgetchar) getchar();break;case 6:choiceend=1;CloseF();if (!wgetchar) getchar();break;case 7:choiceend=1;ReadF();if (!wgetchar) getchar();break;case 8:choiceend=1;WriteF();if (!wgetchar) getchar();break;case 9:printf("\nYou have exited this system.");QuitF();exit(0);break;case 10:choiceend=1; system("cls"); /*clrscr();*/break;case 11:CdF();choiceend=1;break;case 20:help();choiceend=1;break;default:choiceend=0;}}}else printf("\nAccess denied.");}void help(void){printf("\nThe Command List\n");printf("\nCd Attrib Creat Modify Read Open Cls Delete Exit Close\n"); }char *rtrim(char *str) /*remove the trailing blanks.*/{int n=strlen(str)-1;while(n>=0){if(*(str+n)!=' '){*(str+n+1)='\0';break;}else n--;}if (n<0) str[0]='\0';return str;}char *ltrim(char *str) /*remove the heading blanks.*/{char *rtrim(char *str);strrev(str); //将所有字母反向排列rtrim(str);strrev(str);return str;}void LoginF() /*LOGIN FileSystem*/{char loginame[MAXNAME],loginpw[9],logincpw[9],str[50];int i,j,flag=1;char a[25];int findout; /*login user not exist*/char *rtrim(char *str); /*remove the trailing blanks.*/char *ltrim(char *str); /*remove the heading blanks.*/void InputPW(char *password); /*input password,use '*' replace*/void SetPANo(int RorW); /*Set physical address num*/while(1){findout=0;printf("\n\nLogin Name:");gets(loginame);ltrim(rtrim(loginame));fp_mfd=fopen("c:\\osfile\\mfd","rb");for(i=0;fread(&ufd_lp,sizeof(OSUFD_LOGIN),1,fp_mfd)!=0;i++)if (strcmp(strupr(ufd_lp.ufdname),strupr(loginame))==0){findout=1;strcpy(logincpw,ufd_lp.ufdpword);}fclose(fp_mfd);if (findout==1) /*user exist*/{printf("Login Password:");InputPW(loginpw); /*input password,use '*' replace*/if (strcmp(loginpw,logincpw)==0){strcpy(username,strupr(loginame));strcpy(dirname,username);fp_mfd=fopen("c:\\osfile\\mfd","rb");for(j=0;fread(&ufd_lp,sizeof(OSUFD_LOGIN),1,fp_mfd)!=0;j++){strcpy(str,"c:\\osfile\\");strcat(str,ufd_lp.ufdname); //strcat字符串连接函数ufd[j]=(OSUFD*)malloc(sizeof(OSUFD));strcpy(ufd[j]->ufdname,strupr(ufd_lp.ufdname));fp_ufd=fopen(str,"rb");fcount[j]=0;for(i=0;fread(&ufd[j]->ufdfile[i],sizeof(OSFILE),1,fp_ufd)!=0;i++,fcount[j]++){ifopen[j][i].ifopen=0;ifopen[j][i].openmode=4;}fclose(fp_ufd);}fclose(fp_mfd);ucount=j;SetPANo(0);printf("\n\nLogin successful! Welcome to this FileSystem\n\n");loginsuc=1;return;}else{printf("\n\n");flag=1;while(flag){printf("Login Failed! Password Error. Try Again(Y/N):");gets(a);ltrim(rtrim(a));if (strcmp(strupr(a),"Y")==0) {loginsuc=0;flag=0;}else if(strcmp(strupr(a),"N")==0){loginsuc=0;flag=0;return;}}}}else{printf("New Password(<=8):");InputPW(loginpw); /*input new password,use '*' replace*/printf("\nConfirm Password(<=8):"); /*input new password,use '*' replace*/ InputPW(logincpw);if (strcmp(loginpw,logincpw)==0){strcpy(ufd_lp.ufdname,strupr(loginame));strcpy(ufd_lp.ufdpword,loginpw);fp_mfd=fopen("c:\\osfile\\mfd","ab");fwrite(&ufd_lp,sizeof(OSUFD_LOGIN),1,fp_mfd);fclose(fp_mfd);strcpy(username,strupr(loginame));strcpy(dirname,loginame);strcpy(str,"c:\\osfile\\");strcat(str,username);if((fp_ufd=fopen(str,"rb"))==NULL){fp_ufd=fopen(str,"wb");fclose(fp_ufd);}fp_mfd=fopen("c:\\osfile\\mfd","rb");for(j=0;fread(&ufd_lp,sizeof(OSUFD_LOGIN),1,fp_mfd)!=0;j++) {strcpy(str,"c:\\osfile\\");strcat(str,ufd_lp.ufdname);ufd[j]=(OSUFD*)malloc(sizeof(OSUFD));strcpy(ufd[j]->ufdname,strupr(ufd_lp.ufdname));fp_ufd=fopen(str,"rb");for(i=0;fread(&ufd[j]->ufdfile[i],sizeof(OSFILE),1,fp_ufd)!=0;i++,fcount[j]++){ifopen[j][i].ifopen=0;ifopen[j][i].openmode=4;}fclose(fp_ufd);}fclose(fp_mfd);ucount=j;SetPANo(0);printf("\n\nLogin Successful! Welcome to this System\n\n");loginsuc=1;return;}else{printf("\n\n");flag=1;while(flag){printf("Login Failed! Password Error. Try Again(Y/N):");gets(a);ltrim(rtrim(a));if (strcmp(strupr(a),"Y")==0) {loginsuc=0;flag=0;}else if(strcmp(strupr(a),"N")==0){loginsuc=0;flag=0;return;}}}}}}void SetPANo(int RorW) /*Set physical address num,0-read,1-write*/{int i,j;if (RorW==0){if((fp_file_p=fopen("c:\\osfile\\file\\file_p","rb"))==NULL){fp_file_p=fopen("c:\\osfile\\file\\file_p","wb");fclose(fp_file_p);}fp_file_p=fopen("c:\\osfile\\file\\file_p","rb");for(i=0;fread(&j,sizeof(int),1,fp_file_p)!=0;i++)fpaddrno[j]=1;/*for(i=1;i<MAX;i++)if ((i%13)==0) fpaddrno[i]=1;*/}else{fp_file_p=fopen("c:\\osfile\\file\\file_p","wb");/*for(i=1;i<MAX;i++)if((i%13)==0) fpaddrno[i]=0;*/for(i=0;i<MAX;i++)if (fpaddrno[i]==1)fwrite(&i,sizeof(int),1,fp_file_p);}fclose(fp_file_p);}void InputPW(char *password) /*input password,use '*' replace*/{int j;for(j=0;j<=7;j++){password[j]=getch();if ((int)(password[j])!=13){if((int)(password[j])!=8)putchar('*');else{if (j>0){j--;j--;putchar('\b');putchar(' ');putchar('\b');}else j--;}}else{password[j]='\0';break;}}password[j]='\0';}void DirF() /*Dir FileSystem*/{int i,j,count=0;char sfmode[25],sfpaddr[25],str[25];int ExistD(char *dirname); /*Whether DirName Exist,Exist-i,Not Exist-0*///clrscr();system("cls");if (strcmp(strupr(ltrim(rtrim(dirname))),"")!=0){printf("\n\nC:\\%s>dir\n",dirname);printf("\n%14s%16s%14s%10s%18s\n","FileName","FileAddress","FileLength","Type","FileMode"); j=ExistD(dirname);for(i=0;i<fcount[j];i++){if ((i%16==0)&&(i!=0)){printf("\nPress any key to continue..");getch();//clrscr();system("cls");printf("\n%14s%16s%14s%10s%18s\n","FileName","FileAddress","FileLength","Type","FileMode");}itoa(ufd[j]->ufdfile[i].fpaddr,str,10);strcpy(sfpaddr,"file");strcat(sfpaddr,str);if (ufd[j]->ufdfile[i].fmode==0) strcpy(sfmode,"Read Only");else if(ufd[j]->ufdfile[i].fmode==1) strcpy(sfmode,"Write Only");else if(ufd[j]->ufdfile[i].fmode==2)strcpy(sfmode,"Read And Write");else strcpy(sfmode,"Protect");printf("%14s%16s%14d%10s%18s\n",ufd[j]->ufdfile[i].fname,sfpaddr,ufd[j]->ufdfile[i].flength," <FILE>",sfmode);}printf("\n %3d file(s)\n",fcount[j]);}else{printf("\n\nC:\\>dir\n");printf("\n%14s%18s%8s\n","DirName","OwnFileCount","Type");for(i=0;i<ucount;i++){if ((i%16==0)&&(i!=0)){printf("\nPress any key to continue...");getch();// clrscr();system("cls");printf("\n%14s%18s%8s\n","DirName","OwnFileCount","Type");}printf("%14s%18d%8s\n",ufd[i]->ufdname,fcount[i],"<UFD>");count=count+fcount[i];}printf("\n %3d dir(s),%5d file(s)\n",ucount,count);}}int ExistD(char *dirname) /*Whether DirName Exist,Exist-i,Not Exist-0*/{int i;int exist=0;for(i=0;i<ucount;i++)if (strcmp(strupr(ufd[i]->ufdname),strupr(dirname))==0){exist=1;break;}if (exist) return(i);else return(-1);}void CdF() /*Exchange Dir*/{char dname[MAXNAME];char *rtrim(char *str); /*remove the trailing blanks.*/char *ltrim(char *str); /*remove the heading blanks.*/int ExistD(char *filename); /*Whether FileName Exist,Exist-i,Not Exist-0*/printf("\nPlease input DirName (cd..-Previous dir; DirNAME-cd [DirNAME]):");gets(dname);ltrim(rtrim(dname));if (ExistD(dname)>=0) strcpy(dirname,strupr(dname));else if(strcmp(strupr(dname),"CD..")==0) strcpy(ltrim(rtrim(dirname)),"");else printf("\nError.\'%s\' does not exist.\n",dname);}void CreateF() /*Create File*/{int fpaddrno,flag=1,i;char fname[MAXNAME],str[50],str1[50],strtext[255],a[25];char fmode[25];char *rtrim(char *str); /*remove the trailing blanks.*/char *ltrim(char *str); /*remove the heading blanks.*/int FindPANo(); /*find out physical address num*/int WriteF1(); /*write file*/int ExistF(char *filename); /*Whether FileName Exist,Exist-i,Not Exist-0*/int ExistD(char *dirname);if (strcmp(strupr(dirname),strupr(username))!=0){printf("\nError. You must create file in your own dir.\n");wgetchar=1;}else{printf("\nPlease input FileName:");gets(fname);ltrim(rtrim(fname));if (ExistF(fname)>=0){printf("\nError. Name \'%s\' has already existed.\n",fname);wgetchar=1;}else{printf("Please input FileMode(0-Read Only, 1-Write Only, 2-Read and Write, 3-Protect):");gets(fmode);ltrim(rtrim(fmode));if((strcmp(fmode,"0")==0)||(strcmp(fmode,"1")==0)||(strcmp(fmode,"2")==0)||(strcmp(fmode,"3") ==0)){fpaddrno=FindPANo();if (fpaddrno>=0){i=ExistD(username);strcpy(ufd[i]->ufdfile[fcount[i]].fname,fname);ufd[i]->ufdfile[fcount[i]].fpaddr=fpaddrno;ufd[i]->ufdfile[fcount[i]].fmode=atoi(fmode);ifopen[i][fcount[i]].ifopen=0;ifopen[i][fcount[i]].openmode=4;strcpy(str,"c:\\osfile\\file\\file");itoa(fpaddrno,str1,10);strcat(str,str1);fp_file=fopen(str,"wb");fclose(fp_file);fcount[i]++;while(flag){printf("Input text now(Y/N):");gets(a);ltrim(rtrim(a));ufd[i]->ufdfile[fcount[i]-1].flength=0;if(strcmp(strupr(a),"Y")==0){fp_file=fopen(str,"wb+");ufd[i]->ufdfile[fcount[i]-1].flength=WriteF1();flag=0;}else if(strcmp(strupr(a),"N")==0){flag=0;wgetchar=1;}}printf("\n\'%s\' has been created successfully!\n",fname);}else{printf("\nFail!No Disk Space. Please format your disk.\n");wgetchar=1;} }else {printf("\nError. FileMode\'s Range is 0-3\n");wgetchar=1;} }}}int ExistF(char *filename) /*Whether FileName Exist,Exist-i,Not Exist-0*/ {int i,j;int exist=0;int ExistD(char *dirname);j=ExistD(dirname);for(i=0;i<fcount[j];i++)if (strcmp(strupr(ufd[j]->ufdfile[i].fname),strupr(filename))==0) {exist=1;break;}if (exist) return(i);else return(-1);}int FindPANo() /*find out physical address num*/{int i;for(i=0;i<MAX;i++)if (fpaddrno[i]==0) {fpaddrno[i]=1;break;}if (i<MAX) return(i);else return(-1);}int WriteF1() /*write file*/{int length=0;char c;printf("Please input text(\'#\' stands for end):\n");while((c=getchar())!='#'){fprintf(fp_file,"%c",c);if (c!='\n') length++;}fprintf(fp_file,"\n");fclose(fp_file);return(length);}void DeleteF() /*Delete File*/{char fname[MAXNAME];char str[50],str1[50];int i,j,k,flag=1;char a[25]; /*whether delete*/char *rtrim(char *str); /*remove the trailing blanks.*/char *ltrim(char *str); /*remove the heading blanks.*/int ExistF(char *filename); /*Whether FileName Exist,Exist-i,Not Exist-0*/ int ExistD(char *dirname);if (strcmp(strupr(dirname),strupr(username))!=0){printf("\nError. You can only delete file in your own dir.\n");wgetchar=1;} else{printf("\nPlease input FileName:");gets(fname);ltrim(rtrim(fname));i=ExistF(fname);if (i>=0){k=ExistD(username);if(ifopen[k][i].ifopen==1){printf("\nError. \'%s\' is in open status. Close it before delete.\n",fname);wgetchar=1;} else{while(flag){printf("\'%s\' will be deleted. Are you sure(Y/N):",fname);gets(a);ltrim(rtrim(a));if(strcmp(strupr(a),"Y")==0){fpaddrno[ufd[k]->ufdfile[i].fpaddr]=0;itoa(ufd[k]->ufdfile[i].fpaddr,str,10);for(j=i;j<fcount[k]-1;j++){strcpy(ufd[k]->ufdfile[j].fname,ufd[k]->ufdfile[j+1].fname);ufd[k]->ufdfile[j].fpaddr=ufd[k]->ufdfile[j+1].fpaddr;ufd[k]->ufdfile[j].flength=ufd[k]->ufdfile[j+1].flength;ufd[k]->ufdfile[j].fmode=ufd[k]->ufdfile[j+1].fmode;ifopen[k][j]=ifopen[k][j+1];}fcount[k]--;strcpy(str1,"c:\\osfile\\file\\file");strcat(str1,str);remove(str1);flag=0;printf("\n\'%s\' has been deleted successfully.\n",fname);wgetchar=1;}else if(strcmp(strupr(a),"N")==0){printf("\nError. \'%s\' hasn\'t been deleted.\n",fname);wgetchar=1;flag=0;}}}}else{printf("\nError. \'%s\' does not exist.\n",fname);wgetchar=1;}}}void ModifyFM() /*Modify FileMode*/{char fname[MAXNAME],str[50];int i,j,k,flag;char fmode[25]; /*whether delete*/char *rtrim(char *str); /*remove the trailing blanks.*/char *ltrim(char *str); /*remove the heading blanks.*/void InputPW(char *password); /*input password,use '*' replace*/void SetPANo(int RorW); /*Set physical address num*/int ExistF(char *filename); /*Whether FileName Exist,Exist-i,Not Exist-0*/int ExistD(char *dirname);if (strcmp(strupr(dirname),strupr(username))!=0) {printf("\nError.You can only modify filemode in yourself dir.\n");wgetchar=1;}else{ printf("\nPlease input FileName:");gets(fname);ltrim(rtrim(fname));i=ExistF(fname);if (i>=0){k=ExistD(username);if(ifopen[k][i].ifopen==1){printf("\nError.\'%s\' is in open status. Close it before modify.\n",fname);wgetchar=1;}else{if(ufd[k]->ufdfile[i].fmode==0) strcpy(str,"read only"); /*FileMode*/else if(ufd[k]->ufdfile[i].fmode==1) strcpy(str,"write only");else if(ufd[k]->ufdfile[i].fmode==2) strcpy(str,"read and write");else strcpy(str,"Protect");printf("\'%s\' filemode is %s.\n",fname,strupr(str));printf("Modify to(0-read only,1-write only,2-read and write,3-Protect):");gets(fmode);ltrim(rtrim(fmode));if(strcmp(fmode,"0")==0){ufd[k]->ufdfile[i].fmode=0;printf("\n\'%s\' has been modified to READ ONLY mode successfully.\n",fname);wgetchar=1;}else if(strcmp(fmode,"1")==0){ufd[k]->ufdfile[i].fmode=1;printf("\n\'%s\' has been modified to WRITE ONLY mode successfully.\n",fname);wgetchar=1;}else if(strcmp(fmode,"2")==0){ufd[k]->ufdfile[i].fmode=2;printf("\n\'%s\' has been modified to READ AND WRITE mode successfully.\n",fname);wgetchar=1;}else if(strcmp(fmode,"3")==0){ufd[k]->ufdfile[i].fmode=3;printf("\n\'%s\' has been modified to FORBID mode successfully.\n",fname);wgetchar=1;}else {printf("\nError.\'%s\' is not modified.\n",fname);wgetchar=1;}}}else{printf("\nError. \'%s\' dose not exist.\n",fname);wgetchar=1;}}}void OpenF() /*Open File*/{char fname[MAXNAME];char str[25],str1[25],fmode[25];int i,k;char *rtrim(char *str); /*remove the trailing blanks.*/char *ltrim(char *str); /*remove the heading blanks.*/int ExistF(char *filename); /*Whether FileName Exist,Exist-i,Not Exist-0*/int ExistD(char *dirname);if (strcmp(strupr(ltrim(rtrim(dirname))),"")==0){printf("\nError. Please change to ufd dir before open.\n");wgetchar=1;return;}printf("\nPlease input FileName:");gets(fname);ltrim(rtrim(fname));i=ExistF(fname);if (i>=0){k=ExistD(dirname);if(!ifopen[k][i].ifopen){if (ufd[k]->ufdfile[i].fmode==3){printf("\nError. The file\'s mode is FORBID. Can not open.\n");wgetchar=1;}else{printf("Please input FileOpenMode(0-Read Only,1-Write Only,2-Read and Write):");gets(fmode);ltrim(rtrim(fmode));if((strcmp(fmode,"0")==0)||(strcmp(fmode,"1")==0)||(strcmp(fmode,"2")==0)){if(fmode[0]=='0') /*open file with read only mode*/{strcpy(str,"read only");if((ufd[k]->ufdfile[i].fmode==0)||(ufd[k]->ufdfile[i].fmode==2)) ifopen[k][i].ifopen=1;}else if(fmode[0]=='1') /*open file with write only mode*/{strcpy(str,"write only");if((ufd[k]->ufdfile[i].fmode==1)||(ufd[k]->ufdfile[i].fmode==2)) ifopen[k][i].ifopen=1;}else if(fmode[0]=='2') /*open file with read and write mode*/{strcpy(str,"read and write");if(ufd[k]->ufdfile[i].fmode==2) ifopen[k][i].ifopen=1;}if(ufd[k]->ufdfile[i].fmode==0) strcpy(str1,"read only"); /*FileMode*/else if(ufd[k]->ufdfile[i].fmode==1) strcpy(str1,"write only");else if(ufd[k]->ufdfile[i].fmode==2) strcpy(str1,"read and write");if(ifopen[k][i].ifopen==1){ifopen[k][i].openmode=atoi(fmode);if (ifopen[k][i].openmode==0) strcpy(str,"read only");else if(ifopen[k][i].openmode==1) strcpy(str,"write only");else if(ifopen[k][i].openmode==2) strcpy(str,"read and write");printf("\n\'%s\' has been opened. OpenMode is %s,FileModeis %s\n",fname,strupr(str),strupr(str1));wgetchar=1;}else{printf("\nError. \'%s\' hasn\'t been opened. OpenMode Error. OpenMode is %s,but FileMode is %s\n",fname,strupr(str),strupr(str1));wgetchar=1;}}else {printf("\nError. FileOpenMode\'s Range is 0-2\n");wgetchar=1;}}}else {printf("\nError. \'%s\' is in open status.\n",fname);wgetchar=1;}}else{printf("\nError. \'%s\' does not exist.\n",fname);wgetchar=1;}}void CloseF() /*Close File*/{int i,k,n=0;char fname[MAXNAME];char *rtrim(char *str); /*remove the trailing blanks.*/char *ltrim(char *str); /*remove the heading blanks.*/int ExistF(char *filename); /*Whether FileName Exist,Exist-i,Not Exist-0*/int ExistD(char *dirname);if (strcmp(strupr(ltrim(rtrim(dirname))),"")==0){printf("\nError. Please convert to ufd dir before close.\n");wgetchar=1;return;}k=ExistD(dirname);printf("\nOpen File(s) In This Ufd:\n");/*display openned file*/for(i=0;i<fcount[k];i++){if (ifopen[k][i].ifopen==1) {printf("%15s",ufd[k]->ufdfile[i].fname);n++;}if((n%4==0)&&(n!=0)) printf("\n");}printf("\n%d files openned.\n",n);if (n==0) wgetchar=1;if(n!=0){printf("\nPlease input FileName:");gets(fname);ltrim(rtrim(fname));i=ExistF(fname);if(i>=0){if(ifopen[k][i].ifopen==1){ifopen[k][i].ifopen=0;ifopen[k][i].openmode=4;printf("\n\'%s\' has been closed successfully.\n",fname);wgetchar=1;}else {printf("\nError.\'%s\' is in closing status.\n",fname);wgetchar=1;}}else {printf("\nError. \'%s\' is not exist.\n",fname);wgetchar=1;}}}void ReadF() /*Read File*/{int i,k,n=0;char fname[MAXNAME];char str[255],str1[255],c;char *rtrim(char *str); /*remove the trailing blanks.*/char *ltrim(char *str); /*remove the heading blanks.*/int ExistF(char *filename); /*Whether FileName Exist,Exist-i,Not Exist-0*/int ExistD(char *dirname);if (strcmp(strupr(ltrim(rtrim(dirname))),"")==0) {printf("\nError.Please convert to ufd dir before read.\n");wgetchar=1;return;}printf("\nCaution:Open file first\n");printf("Opened File(s) List:\n");k=ExistD(dirname);for(i=0;i<fcount[k];i++){if (ifopen[k][i].ifopen==1)if ((ifopen[k][i].openmode==0) ||(ifopen[k][i].openmode==2)){printf("%15s",ufd[k]->ufdfile[i].fname);n++;}if((n%4==0)&&(n!=0)) printf("\n");}printf("\n%d files openned.\n",n);if (n==0) wgetchar=1;if(n!=0){printf("\nPlease input FileName:");gets(fname);ltrim(rtrim(fname));i=ExistF(fname);if(i>=0){if(ifopen[k][i].ifopen==1){if((ifopen[k][i].openmode==0) ||(ifopen[k][i].openmode==2)){itoa(ufd[k]->ufdfile[i].fpaddr,str,10);strcpy(str1,"file");strcat(str1,str);strcpy(str,"c:\\osfile\\file\\");strcat(str,str1);fp_file=fopen(str,"rb");fseek(fp_file,0,0);printf("\nThe text is:\n\n");printf(" ");while(fscanf(fp_file,"%c",&c)!=EOF)if (c=='\n') printf("\n ");else printf("%c",c);printf("\n\n%d Length.\n",ufd[k]->ufdfile[i].flength);fclose(fp_file);wgetchar=1;}else{printf("\nError.\'%s\' has been opened with WRITE ONLY mode. It isn\'tread.\n",fname);wgetchar=1;}}else {printf("\nError.\'%s\' is in closing status. Please open it before read\n",fname);wgetchar=1;} }else {printf("\nError. \'%s\' does not exist.\n",fname);wgetchar=1;}}}void WriteF() /*Write File*/{int i,k,n=0;char fname[MAXNAME];char str[50],str1[50],a[50];char *rtrim(char *str); /*remove the trailing blanks.*/char *ltrim(char *str); /*remove the heading blanks.*/int ExistF(char *filename); /*Whether FileName Exist,Exist-i,Not Exist-0*/int ExistD(char *dirname);int WriteF1(); /*write file*/if (strcmp(strupr(ltrim(rtrim(dirname))),"")==0) {printf("\nError. Please convert to ufd dir before write.\n");wgetchar=1;return;}k=ExistD(dirname);printf("\nOpen File(s) with write only mode or read and write mode:\n");/*display openned files with writable mode*/for(i=0;i<fcount[k];i++){if (ifopen[k][i].ifopen==1)if ((ifopen[k][i].openmode==1) ||(ifopen[k][i].openmode==2)){printf("%15s",ufd[k]->ufdfile[i].fname);n++;}if((n%4==0)&&(n!=0)) printf("\n");}。

实验五-文件系统实验

实验五-文件系统实验

实验五 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 。

实验五文件系统

实验五文件系统

实验五文件系统实验目的:通过对一个真实文件系统镜像的分析,理解文件系统在磁盘上的组织结构,掌握文件创建、删除、读、写等功能的实现。

实验内容:分析Minix1.0文件系统在磁盘上的组织形式;结合理论课相关知识点,掌握Minix1.0文件系统的访问方法,掌握磁盘块的分配回收方法;编写程序,实现以下功能:浏览整个文件系统的目录结构,创建文件,删除文件,读写文件等。

实验步骤:阅读实验预备知识,了解Minix1.0文件系统在磁盘上的组织结构;运用WinHex等二进制分析工具,手工验证部分磁盘内容的存储位置,相互关系;根据实验要求,进行系统设计(包括需实现的功能,数据结构,细化后的各功能模块、接口定义,调用关系)。

需要实现的功能包括:extern void read_inode(CFile &file,int ni,struct d_inode*pi);extern int get_all_sub_entrys(CFile& file,int parent,char** pnames);extern BOOL IsDir(CFile &file,unsigned short i);extern unsigned short create_sub_file(CFile &file,unsigned short parent,CString name,char*buffer,long len);extern unsigned short create_sub_dir(CFile &file,unsigned short parent,CString name);extern unsigned short get_file_type(CFile &file,int in);extern void delete_file(CFile &file,int parent,CString title);extern unsigned long get_file_len(CFile &file,unsigned short ni);extern int read_file(CFile &file,unsigned short ni,char**pBuff);编码实现实验要求的功能;测试,验证将Windows下任意文件导入到FS镜像,或从镜像中导出文件到Windos 系统。

文件系统实验素材

文件系统实验素材

文件系统实验素材首先回答最常见的问题,“什么是文件系统”。

文件系统是对一个存储设备上的数据和元数据进行组织的机制。

一、实验步骤:1、我们在当前文件系统的一个文件中创建一个文件系统。

实现的方法是,首先用dd 命令创建一个指定大小的文件(使用/dev/zero 作为源进行文件复制)——换句话说,一个用零进行初始化的文件。

$ dd if=/dev/zero of=file.img bs=1k count=1000010000+0 records in10000+0 records out$2、现在有了一个10MB 的file.img 文件。

使用losetup 命令将一个循环设备与这个文件关联起来,让它看起来像一个块设备,而不是文件系统中的常规文件:$ losetup /dev/loop0 file.img$3、这个文件现在作为一个块设备出现(由/dev/loop0 表示)。

然后用mke2fs 在这个设备上创建一个文件系统。

这个命令创建一个指定大小的新的ext2 文件系统。

$ mkfs.ext2 -c /dev/loop0 10000mke2fs 1.35 (28-Feb-2004)max_blocks 1024000, rsv_groups = 1250, rsv_gdb = 39Filesystem label=OS type: LinuxBlock size=1024 (log=0)Fragment size=1024 (log=0)2512 inodes, 10000 blocks500 blocks (5.00%) reserved for the super user...$使用mount 命令将循环设备(/dev/loop0)所表示的file.img 文件挂装到挂装点/mnt/point1。

注意,文件系统类型指定为ext2。

挂装之后,就可以将这个挂装点当作一个新的文件系统,比如使用ls 命令。

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

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

计算机科学与技术学院2018-2019学年第一学期《操作系统》实验报告班级: XXXXXXX学号: XXXXXXXXX姓名: XXX教师: XXX成绩:1. 题目分析设计目的深入了解磁盘文件系统的实现。

设计内容(1)设计一个简单的文件系统,用文件模拟磁盘,用数组模拟缓冲区,要求实现:(2)支持多级目录结构,支持文件的绝对读路径;(3)文件的逻辑结构采用流式结构,物理结构采用链接结构中的显示链接方式;(4)采用文件分配表;(5)实现的命令包括建立目录、列目录、删除空目录、建立文件、删除文件、显示文件内容、打开文件、读文件、写文件(追加方式)、关闭文件、改变文件属性。

(6)最后编写主函数对所做工作进行测试。

相关知识概述(1)文件的操作:①创建文件;②删除文件;③读文件;④写文件;⑤设置文件读/写位置。

(2)文件的逻辑结构:从用户的观点出发所能观察到的文件组织形式,即问价是由一系列的逻辑记录组成的,是用户可以直接处理的数据及其结构。

文件的物理结构:系统将文件存储在外存上所形成的一种存储组织形式,用户不可见。

(3)磁盘空间的管理:采取合理的文件分配方式,为每个文件分配必要的存储空间,使每个文件都能“各得其所”,并能有效减少磁盘碎片。

(4)磁盘目录结构2. 实验设计基本设计思路用一个文件模拟磁盘:FAT 根目录目录1目录2目录3目录4…文件1文件2…文件分配表FAT(128B):第几项0 1 2 3 4 5 6 7 8 9 …内容-1 -1 -1 4 9 0 7 8 -1 12 …根目录(64B)目录1(64B)目录6(64B)目录……….实验中,模拟的磁盘有128块,每块64B,故文件分配表有128项,每项3一个字节,共占磁盘的前两块,盘块编号0、1;根目录紧邻在文件分配表后面,占编号为2的盘块。

01234567891011128B8B8B8B8B8B8B8B文件管理系统要实现的功能包括:(1)磁盘操作:①磁盘分配(2)目录操作:①建立目录②显示目录内容③删除空目录(3)文件操作:①建立文件②打开文件③关闭文件④读文件⑤写文件⑥删除文件(磁盘回收)⑦显示文件内容⑧改变文件属性⑨使用绝对路径名查找文件(4)对数据结构——已打开文件表的操作:①在已打开文件表中查找某文件②将文件从已打开文件表中删除③将某文件插入已打开文件表主要数据结构描述1、每个目录项的数据结构(8B):typedef struct{char name[3];开始找到文件分配表第x项,i=x第i项值是否为第i项是否为最后一项磁盘满,分配失败结束i=i+1分配第i块NYNY图2-10分配一个磁盘块的流程图结束查找路径名为pname的文件i=0i为已打开文件表一栏查找成功结束查找失败i=i+1文件路径名相符NNYY图2-13 在已打开文件表中查找某文件开始删除路径名为n ame 的文件在已打开文件表中查找路径名为n ame的登记项i找到该文件登记项删除第i项:[i]=openfile[]=结束文件没有打开,删除失败NY结束插入路径名为n ame的文件在已打开文件表中查找路径名为n ame的登记项找到该文件登记项已打开文件表已满文件登记表满,无法打开文件结束在[length]处填写该文件的各项内容:=+1文件已打开YNYN图2-15将某文件插入已打开文件表的流程图图2-14 将某文件从已打开文件表中删除的流程开始 关闭文件路径名为 name 的文件 查找已打开文件表文件打开 追加文件结束符修改目录中文件长度 结束文件未打开, 无法关闭文件结束在已打开文件表中删 除该文件登记项操作为 “ 写 ”NNY Y图 2-20模拟关闭文件的流程图开始读 n ame 文件 l ength 字节查找已打开文件表文件打开文件以读方式打开从已打开文件表的到读指针 :将盘块d um 读入缓冲 b uffer1 文件未打开 , 无法读文件结束文件不能读结束t=0文件未结束且 t<=length显示读出内容; 修改读指针的 b unum: bnum=bnum+1t=t+1读完一个盘块修改读指针 bnum=0;: dnum= 文件分配表第 n um 项将盘块 d num 读入缓冲 b uffer1读文件结束 结束NYNNNYYY结束显示路径名为name的文件查找目录n ame找到该文件文件打开dnum=该目录起始盘块号第d num块是该文件一块第d num块内容读入buffer1显示b uffer1中的内容结束或到文件结束符dnum=FAT 第d num项结束结束文件打开,显示文件失败结束指定的文件不存在,显示文件内容失败NYNYNY编码实现实现过程总结部分功能代码:(1)目录操作:①建立目录:int md(char *pathName, char *contentName, char address) ame[0] = '$';}fseek(fc, address * 64, SEEK_SET);fwrite(contentBuffer, 64L, 1, fc);return 1; ttribute == 8) ame << endl;cout << "类型:空" << endl;cout << "属性:目录项" << endl;cout << "起始地址:" << (int)contentBuffer[i].address << endl;cout << "长度:1" << endl << endl;}else if (contentBuffer[i].name[0] == '$'){cout << "一个空的目录登记项" << endl;}else{cout << "名字:" << contentBuffer[i].name << endl;cout << "类型:" << contentBuffer[i].type << endl;if (contentBuffer[i].attribute == 3){cout << "属性:只读系统文件" << endl;}else{cout << "属性:可读可写的普通文件" << endl;}cout << "起始地址:" << (int)contentBuffer[i].address << endl;cout << "长度" << (int)contentBuffer[i].length << endl << endl;}}}(2)文件操作:①建立文件:bool create_file(){ttribute;= temp->address;= temp->length;= flag;pointer read, write;= dnum;= 0;= dnum;= 0;= write;= read;(cu);return 3;}③关闭文件:int close_file(char *pathName){list<OFILE>::iterator it;int i = 0;for (it = (); it != ();){if (strcmp(it->name, pathName) == 0){it = (it);return 1;}else{++it;}}return 0;}④读文件:bool read_file(char *pathName){int a;unsigned char c;bool flag = false;OFILE exist;list<OFILE>::iterator it;int i = 0;for (it = (); it != (); it++){if (strcmp(it->name, pathName) == 0){exist = *it;flag = true;break;}}if (flag == false){return flag;}int dnumTemp = fseek(fc, 64 * SEEK_SET);for (i = 0; i < ; i++){cout << "第" << << "个盘块内容如下:" << endl;while{if % 8 == 0){cout << endl;}c = getc(fc);a = c;cout << hex << " " << a;}= 0;fseek(fc, SEEK_SET);c = getc(fc);if (c == 255){cout << "文件末尾" << endl;break;}= c;fseek(fc, * 64, SEEK_SET);cout << endl;}return flag;}⑤写文件:bool write_file(char *pathName){int dnum; ;type = (pointPosition + 1, ());everyPath = (0, pointPosition);}结果分析与总结结果分析部分功能演示:总结与建议总结:通过本次实验我学会了如何建立文件管理系统,学会了一些常用的目录、问津功能的实现,还学会了如何用文件读写指针对文件进行操作。

实验5 文件系统

实验5 文件系统

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

2.实验内容(1)利用Linux有关系统调用函数编写一个文件工具filetools,要求具有下列功能:***********0. 退出1. 创建新文件2. 写文件3. 读文件4. 复制文件5. 修改文件权限6. 查看文件权限7. 创建子目录8. 删除子目录9. 改变当前目录到指定目录10. 链接操作***********3. 实验指导(1).有关系统调用FILE *fopen(const char *filename, int flags);//打开或创建文件flags参数取值:O_RDONL Y--只读方式O_WRONL Y—只写方式O_RDWR—读写方式还可以用或运算对下列标志进行组合O_CREAT---如果文件不存在则创建,存在则不再创建O_TRUNC---如果文件已存在,则清除文件原有内容O_EXECL---如果文件已存在,又设置了O_CREAT,则强制open失败O_APPEND---每次写入时从文件尾部开始。

例:创建一个可读可写的文件file1,可用fd=open(“file1”,O_CREAT|O_RDWR);int fclose(int fd); //关闭文件size_t fwrite(const void*buffer,size_t size,size_t count,FILE*stream); //写文件size_t fread( void*buffer, size_t size, size_t count, FILE*stream ); //读文件int fseek( FILE*stream, long offset, int origin ); //文件读写指针定位int chmod(char *pathname, mode_t mode); //更改文件权限int mkdir(const char *path,mode_t mode); //mode是子目录的权限int rmdir(const char *path);int chdir(const char *path);int link(const char *oldpath,const char *newpath); //以newpath为名建立一个硬链接到oldpath所指定的文件,成功返回0,失败为-1。

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

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

实验报告实验题目:文件系统姓名:学号:课程名称:操作系统所在学院:信息科学与工程学院专业班级:计算机任课教师:实验项目名称文件系统一、实验目的与要求: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命令,回车,输入文件名,回车,即会在当前目录文件下删除一个名为刚刚输入的文件名的数据文件。

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

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 技术实现磁盘冗余阵列的方法。

实验五 磁盘管理

实验五 磁盘管理

实验五磁盘管理一、实验目的掌握文件系统的权限设置,保护文件系统的安全性。

二、实验原理1.磁盘配额是指限定用户对磁盘空间的使用。

(例:电子邮件用户,普通用户等);配额是基于卷完全分开独立的;同一用户若在同一磁盘的不同卷上都获得了配额,则他对该磁盘的最大使用空间为这些配额之和。

2.基本磁盘是包含主磁盘分区、扩展磁盘分区或逻辑驱动器的物理磁盘。

3 .动态磁盘是包含动态卷的磁盘。

三、实验设备Windows 2000 系统和计算机四、实验内容基本磁盘管理、动态磁盘管理、配额管理五、实验步骤(一) 配额管理1.可以为每个人设置通用的配额(1)打开“我的电脑”(2)右击要启用磁盘配额的磁盘卷,然后单击“属性”按钮;(3)在“属性”对话框中,单击“配额”选项卡;(4)在“配额”属性页上,单击“启用配额管理”复选框,然后单击“确定”按钮。

2.为那些需要多一些或少一些的人设置特定的配额(1)在上述的“配额”选项卡上单击“配额项目”按钮(2)在“配额项目”窗口中单击“配额”菜单上的“新配项目”;(3)选择用户(4)在“添加新配额项目”对话框中,指不定期一个选项,单击“确定”(二)基本磁盘管理1 .创建主磁盘分区(1)打开“磁盘管理”。

(2)在基本磁盘上,用鼠标右键单击一个未指派的空间,然后在弹出菜单中单击“创建磁盘分区”。

(3)在创建磁盘分区向导的欢迎页上,单击“下一步”按钮。

(4)在“选择分区类型”页上,单击“主磁盘分区”,然后单击“下一步”按钮。

(5)在“指定分区大小”页上,键入该主磁盘分区的容量,然后单击“下一步”按钮。

(6)在“指派驱动器号和路径”页上,选中“指派驱动器号”,并选择一个字母来代表该主磁盘分区,然后单击“下一步”按钮。

(7)在“格式化分区”页上,单击“不要格式化这个磁盘分区”,然后单击“下一步”按钮。

(8)在“完成创建磁盘分区向导”页上,单击“完成”按钮。

回到“磁盘管理”窗口,可以看到新创建的分区 F: ,同时在窗口中的驱动器列表中也有了这个驱器。

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

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

(1)掌握Linux 提供的文件系统调用的使用方法;
(2)熟悉文件和目录操作的系统调用用户接口;
(3)了解操作系统文件系统的工作原理和工作方式。

(1) 利用Linux 有关系统调用函数编写一个文件工具filetools,要求具有下列功能:***********
0. 退出
1. 创建新文件
2. 写文件
3. 读文件
4. 复制文件
5. 修改文件权限
6. 查看文件权限
7. 创建子目录
8. 删除子目录
9. 改变当前目录到指定目录
10. 链接操作
通过这次实验掌握Linux 提供的文件系统调用的使用方法;熟悉文件和目录操作的调用用户接口,了解操作系统文件系统的工作原理和工作方式。

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”命令就可以把远端文 件系统挂载在自己的文件系统上,使远端的文件在使用上和本地机器的文件没有区别。

文件系统实验报告

文件系统实验报告
fp=fopen("LOGIN.exe","wb+"); //创建该信息管理文件
char name[12];
curuser = getspace(MFD);
while(1)
{
cout<<"\n ;<endl;
cout<<"用户名:";
cin>>name; //输入用户注册名
}
}
void DisplayUFD()//打印用户信息,包括用户的各个文件
//名称、长度和操作权限的设置信息
{
if(curuser->filepoint == false)//当前用户目录下没有任何文件存在
cout<<"\n用户 "<<curuser->username<<" 文件夹是空的"<<endl;
二、实验题目:
采用二级目录结构实现磁盘文件操作。
要求:
1.普通文件的目录项包括文件名,文件类型,文件长度,指向文件内容的指针内容。
2.目录文件的目录项包括目录名,指向下一级目录块的指针内容。假定每个目录文件最多只能占用一个块;
3.程序功能方面的要求: 需要实现一个命令行操作界面,包含如下命令:
4.程序实现方面的要求:
{
cout<<"\n保存错误。";//fclose(infile);
return;
}
else
{
if((outfile=fopen(out,"wb+"))==NULL)//申请一个缓冲区管理模块

操作系统 课程实验-实验五 磁盘文件操作

操作系统 课程实验-实验五 磁盘文件操作

实验五磁盘文件操作一、实验目的深入了解磁盘文件系统的实现。

二、实验预备知识文件的操作;文件的逻辑结构和物理结构;磁盘空间的管理;磁盘目录结构。

三、实验内容设计一个简单的文件系统,用文件模拟磁盘,用数组模拟缓冲区,要求实现:支持多级目录结构,支持文件的绝对读路径;文件的逻辑结构采用流式结构,物理结构采用链接结构中的显示链接方式;采用文件分配表;实现的命令包括建立目录、列目录、删除空目录、建立文件、删除文件、显示文件内容、打开文件、读文件、写文件(追加方式)、关闭文件、改变文件属性。

最后编写主函数对所做工作进行测试。

四、提示与讲解为了正确地实现文件的存取,文件系统设计了一组与存取文件有关的功能模块,用户可以用“访管指令”调用这些功能模块,以实现文件的存取要求。

我们把文件系统设计的这一组功能模块称为“文件操作”,实验就是要模拟实现一些文件操作。

文件操作不是独立的,它和文件系统的其他部分密切相关,若要实现文件操作就离不开文件的目录结构、文件的组织结构和磁盘空间的管理。

因此,这个实验虽然是文件操作的模拟实现,但是还必须模拟一部分文件的组织结构、目录结构和磁盘空间管理的实现。

(1)文件的组织结构文件的逻辑结构有两种形式:流式文件和记录式文件。

实验中只支持流式文件,采用称为显示链接的物理文件结构,把磁盘中每一块的指针部分提出来,组织在一起,形成文件分配表(FAT)。

文件分配表的作用不仅如此,其他的作用下面将提到。

磁盘有多少块,文件分配表就有多少项,若某文件的一个磁盘块号为i,则这个文件的下一个磁盘的块号应该记录在文件分配表第i项。

例如,某系统文件分配表前几项值如图10所示。

某个文件的起始盘块号为3,则该文件的磁盘块号依次为3、4、9、12、13。

图10 某磁盘文件分配表部分内容(2)磁盘空间的管理首先要模拟一个磁盘。

因为是实验,不使用真正的磁盘,所以实验中用一个文件模拟一个小磁盘。

假设模拟磁盘有128个物理块,每个物理块大小为64字节。

Linux文件系统实验报告

Linux文件系统实验报告
return 1;
}
temp=temp->child;
while(temp)
{
if(temp->isdir)
{cout<<" <DIR> "<<temp->filename<<endl;i++;}
else
{cout<<" <FILE> "<<temp->filename<<endl;j++;}
temp=temp->next;
关闭文件:可通过选择关闭文件的功能选项,来关闭系统中所有打开的文件,如果没有文件被打开,则系统会显示没有文件打开。
删除用户、文件、文件夹:用户可通过选择删除的功能选项来删除不想再保存的文件和文件夹,删除后,用户会自动注销;当选择删除用户的功能选项时,系统会删除该用户,以及该用户所创建的所有文件和文件夹。
node->child=NULL;
node->prev=NULL;
node->next=NULL;
return node;
}
//创建文件存储结点
void createroot ()
{
recent=root=initfile("/",1);
root->parent=NULL;
root->child=NULL;
root->prev=root->next=NULL;
strcpy(para,"/");
}
int mkdir()
{
temp=initfile(" ",1);
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

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

2.实验内容
(1)利用Linux有关系统调用函数编写一个文件工具filetools,要求具有下列功能:
***********
0. 退出
1. 创建新文件
2. 写文件
3. 读文件
4. 复制文件
5. 修改文件权限
6. 查看文件权限
7. 创建子目录
8. 删除子目录
9. 改变当前目录到指定目录
10. 链接操作
***********
3. 实验指导
(1).有关系统调用
FILE *fopen(const char *filename, int flags);//打开或创建文件
flags参数取值:O_RDONL Y--只读方式O_WRONL Y—只写方式O_RDWR—读写方式
还可以用或运算对下列标志进行组合
O_CREAT---如果文件不存在则创建,存在则不再创建
O_TRUNC---如果文件已存在,则清除文件原有内容
O_EXECL---如果文件已存在,又设置了O_CREAT,则强制open失败
O_APPEND---每次写入时从文件尾部开始。

例:创建一个可读可写的文件file1,可用fd=open(“file1”,O_CREAT|O_RDWR);
int fclose(int fd); //关闭文件
size_t fwrite(const void*buffer,size_t size,size_t count,FILE*stream); //写文件
size_t fread( void*buffer, size_t size, size_t count, FILE*stream ); //读文件
int fseek( FILE*stream, long offset, int origin ); //文件读写指针定位
int chmod(char *pathname, mode_t mode); //更改文件权限
int mkdir(const char *path,mode_t mode); //mode是子目录的权限
int rmdir(const char *path);
int chdir(const char *path);
int link(const char *oldpath,const char *newpath); //以newpath为名建立一个硬链接到oldpath所指定的文件,成功返回0,失败为-1。

如:link(“etc/passwd”,”pass”);
int symlink(const char *oldpath,const char *newpath);//建立符号链接
int unlink(const char *pathname); //取消指定的链接
有关头文件:
(2) 部分参考程序
//设置文件权限
//查看文件权限
//文件读写
//修改文件的权限注意用户id和组id分别保存在/etc/passwd和/etc/group目录下。

相关文档
最新文档