实验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.c

fs/ext2/acl.h

fs/ext2/balloc.c

fs/ext2/bitmap.c

fs/ext2/dir.c

fs/ext2/ext2.h

fs/ext2/file.c

……

include/linux/ext2_fs.h

include/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/bash

SCRIPT=substitute.sh

for f in *

do

if [ $f = $SCRIPT ]

then

echo "skip $f"

continue

fi

echo -n "substitute ext2 to myext2 in $f..."

cat $f | sed 's/ext2/myext2/g' > ${f}_tmp

mv ${f}_tmp $f

echo "done"

echo -n "substitute EXT2 to MYEXT2 in $f..."

cat $f | sed 's/EXT2/MYEXT2/g' > ${f}_tmp

mv ${f}_tmp $f

echo "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/Kconfig

fs/Makefile

fs/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 ext

ext2

ext3

myext2

ext4

#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 /mnt

2.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 /mnt

mount: 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 144

144 static int ext2_mknod (struct inode * dir, struct dentry *dentry, int mode, dev_t rdev)

145 {

146 struct inode * inode;

147 int err;

148

149 if (!new_valid_dev(rdev))

150 return -EINVAL;

151

152 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_XATTR

157 inode->i_op = &ext2_special_inode_operations; 158 #endif

159 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 400

392 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_XATTR

403 .setxattr = generic_setxattr,

404 .getxattr = generic_getxattr,

405 .listxattr = ext2_listxattr,

406 .removexattr = generic_removexattr,

407 #endif

408 .setattr = ext2_setattr,

409 .permission = ext2_permission,

410 };

当然,从ext2克隆过去的myext2的myext2_mknod,以及myext2_dir_inode_operations和上面的程序是一样的。

对于mknod函数,我们在myext2中作如下修改:

fs/myext2/namei.c

static int myext2_mknod (struct inode * dir, struct dentry *dentry, int mode, int rdev)

{

printk(KERN_ERR “haha, mknod is not supported by myext2! you’ve been cheated!\n”);

return –EPERM;

}

添加的程序中:

第一行打印信息,说明mknod操作不被支持。

第二行将错误号为EPERM的结果返回给shell,即告诉shell,在myext2文件系统中,maknod不被支持。

修改完毕,然后重新编译内核。以新生成的内核重新启动计算机,我们在shell下执行如下测试程序:

# sudo mount –t myext2 –o loop ./fs.new /mnt

#cd /mnt

# sudo mknod myfifo p

mknod: `myfifo': Operation not permitted

#

第一行命令:将fs.new mount到/mnt目录下。

第二行命令:进入/mnt目录,也就是进入fs.new这个myext2文件系统。

第三行命令:执行创建一个名为myfifo的命名管道的命令。

第四、五行是执行结果:第四行是我们添加的myext2_mknod函数的printk的结果;第五行是返回错误号EPERM结果给shell,shell捕捉到这个错误后打出的出错信息。需要注意的是,如果你是在图形界面下使用虚拟控制台,printk打印出来的信息不一定能在你的终端上显示出来,但是可以通过命令dmesg|tail来观察。

可见,我们的裁减工作取得了预期的效果。

2.4. 添加文件系统创建工具

文件系统的创建对于一个文件系统来说是首要的。因为,如果不存在一个文件系统,所有对它的操作都是空操作,也是无用的操作。

其实,前面的第一小节《添加一个和ext2完全相同的文件系统myext2》和第二小节《修改myext2的magic number》在测试实验结果的时候,已经陆陆续续地讲到了如何创建myext2文件系统。下面工作的主要目的就是将这些内容总结一下,制作出一个更快捷方便的myext2文件系统的创建工具:mkfs.myext2(名称上与mkfs.ext2保持一致)。

首先需要确定的是该程序的输入和输出。为了灵活和方便起见,我们的输入为一个文件,这个文件的大小,就是myext2文件系统的大小。输出就是带了myext2文件系统的文件。我们在主目录下编辑如下的程序:

~/mkfs.myext2

#!/bin/bash

/sbin/losetup -d /dev/loop2

/sbin/losetup /dev/loop2 $1

/sbin/mkfs.ext2 /dev/loop2

dd if=/dev/loop2 of=./tmpfs bs=1k count=2

./changeMN ./tmpfs

dd if=./fs.new of=/dev/loop2

/sbin/losetup -d /dev/loop2

rm -f ./tmpfs

第一行表明是shell程序。

第三行如果有程序用了/dev/loop2了,就将它释放。

第四行用losetup将第一个参数装到/dev/loop2上

第五行用mkfs.ext2格式化/dev/loop2。也就是用ext2文件系统格式格式化我们的文件系统。

第六行将文件系统的头2K字节的内容取出来。

第七行调用程序changeMN将magic number改成0x6666

第八行再将2K字节的内容写回去。

第九行把我们的文件系统从loop2中卸下来。

第十行将临时文件删除。

编辑完了之后,做如下测试:

# dd if=/dev/zero of=myfs bs=1M count=1

# ./mkfs.myext2 myfs (或sudo bash mkfs.myext2 myfs )

# sudo mount –t myext2 –o loop ./fs.new /mnt

# mount

/dev/loop0 on /mnt myext2 (rw)

#

至此,文件系统部分的实验已经全部完成了。通过本实验,你对Linux整个文件系统的运作流程,如何添加一个文件系统,以及如何修改Linux对文件系统的操作,有了比较深的了解。在本实验的基础上,你完全可以发挥自己的创造性,构造出自己的文件系统,然后将它添加到Linux中。

撰写实验报告的要求

1.按照实验报告模板格式撰写;

2.整个实验过程的截图;

3.程序的修改部分,运行结果的截图;

4.实验过程中遇到的问题及解决方法等。

5.心得体会

操作系统文件管理实验报告

操作系统实验报告实验名称:文件管理 专业班级:网络工程1301 学号: 姓名: 2015 年6 月16 日

实验一文件管理 一、实验目的 文件管理是操作系统的一个非常重要的组成部分。学生应独立用高级语言编写和调试一个简单的文件系统,模拟文件管理的工作过程。从而对各种文件操作命令的实质容和执行过程有比较深入的了解,掌握它们的实施方法,加深理解课堂上讲授过的知识。 二、预备知识 1.VS2010的使用 2.C#的学习 3.文件主目录与子目录的理解 三、实验容与步骤 用高级语言编写和调试一个简单的文件系统,模拟文件管理的工作过程。要求设计一个10 个用户的文件系统,每次用户可保存10 个文件,一次运行用户可以打开5 个文件。系统能够检查打入命令的正确性,出错时能显示出错原因。对文件必须设置保护措施,例如只能执行,允许读等。在每次打开文件时,根据本次打开的要求,在此设置保护级别,即有二级保护。文件的操作至少有Create、delete、open、close、read、write 等命令。 所编写的程序应采用二级文件目录,即设置主文件目录和用户文件目录。前者应包含文件主及它们的目录区指针;后者应给出每个文件占有的文件目录,即文件名,保护码,文件长度以及它们存放的位置等。另外为打开文件设置运行文件目录(AFD),在文件打开时应填入打开文件号,本次打开保护码和读写指针等。 程序流程图:

逻辑设计: 使用线性数组表表示MFD,泛型数组表示UFD,每个元素包括用户ID、保存的文件数、再使用线性表表示文件信息,每个元素包括文件名,文件属性(保护码),文件的状态等信息。 物理设计: //主目录 private FileUser[] mfd; //当前用户 private FileUser currentuser; ///

/// 文件 /// public class FileObject { public string filename; public int size=20; public int read=0; public int write = 0; public string author; } /// /// 文件系统用户 /// public class FileUser { public string username;

实验5 Linux文件系统实验

实验五 Linux文件系统实验 实验内容: 1.仔细阅读以下代码; 2.画出系统功能框图 3.程序注释 4.运行程序,写出程序执行结果,并分析说明。 #include #include #include #include #include #include #include #include #define MAX 128 int chmd(); int chmd () { int c; mode_t mode=S_IWUSR; printf(" 0. 0700\n 1. 0400\n 2. 0200 \n 3. 0100\n "); //还可以增加其它权限printf("Please input your choice(0-3):"); scanf("%d",&c); switch(c) { case 0: chmod("file1",S_IRWXU);break; case 1: chmod("file1",S_IRUSR);break; case 2: chmod("file1",S_IWUSR);break; case 3: chmod("file1",S_IXUSR);break; default:printf("You have a wrong choice!\n"); } return(0); } main() { int fd; int num; int choice;

char buffer[MAX]; struct stat buf; char* path="/bin/ls"; char* argv[4]={"ls","-l","file1",NULL}; while(1) { printf("********************************\n"); printf("0. 退出\n"); printf("1. 创建新文件\n"); printf("2. 写文件\n"); printf("3. 读文件\n"); printf("4. 修改文件权限\n"); printf("5. 查看当前文件的权限修改文件权限\n"); printf("********************************\n"); printf("Please input your choice(0-6):"); scanf("%d",&choice); switch(choice) { case 0:close(fd); exit(0); case 1: fd=open("file1",O_RDWR|O_TRUNC|O_CREAT,0750); if(fd==-1) printf("File Create Failed!\n"); else printf("fd = %d\n",fd); break; case 2: num=read(0,buffer,MAX); write(fd,buffer,num); break; case 3: read(fd,buffer,MAX); write(1,buffer,num); break; case 4: chmd (); printf("Change mode success!\n"); break; case 5: execv(path,argv); break;

操作系统简单文件系统设计及实现

简单文件系统的设计及实现 一、实验目的: 1、用高级语言编写和调试一个简单的文件系统,模拟文件管理的工作过程。从而对各种文件操作命令的实质内容和执行过程有比较深入的了解 2、要求设计一个 n个用户的文件系统,每次用户可保存m个文件,用户在一次运行中只能打开一个文件,对文件必须设置保护措施,且至少有Create、delete、open、close、read、write等命令。 二、实验内容: 1、设计一个10个用户的文件系统,每次用户可保存10个文件,一次运行用户可以打开5个文件。 2、程序采用二级文件目录(即设置主目录[MFD])和用户文件目录(UED)。另外,为打开文件设置了运行文件目录(AFD)。 3、为了便于实现,对文件的读写作了简化,在执行读写命令时,只需改读写指针,并不进行实际的读写操作 4、算法与框图 ?因系统小,文件目录的检索使用了简单的线性搜索。 ?文件保护简单使用了三位保护码:允许读写执行、对应位为 1,对应位为0,则表示不允许读写、执行。 ?程序中使用的主要设计结构如下:主文件目录和用户文件目录( MFD、UFD); 打开文件目录( AFD)(即运行文件目录) 文件系统算法的流程图如下

三、工具/准备工作: 在开始本实验之前,请回顾教科书的相关内容。并做以下准备: 1) 一台运行Windows 2000 Professional或Windows 2000 Server的操作系统的计算机。 2) 计算机中需安装Visual C++ 6.0专业版或企业版 四、实验要求: (1)按照学校关于实验报告格式的要求,编写实验报告(含流程图); (2)实验时按两人一组进行分组,将本组认为效果较好的程序提交检查。

实验六 文件系统设计结果

实验六文件系统设计 1.目的和要求 本实验的目的是通过一个简单多用户文件系统的设计,加深理解文件系统的内部功能和内部实现。 2.实验内容 为DOS系统设计一个简单的二级文件系统,可以实现下列几条命令DIR 列文件目录 CREATE 创建文件 DELETE 删除文件 MODIFY 修改文件 OPEN 打开文件 CLOSE 关闭文件 列目录时要列出文件名,物理地址,保护码和文件长度。 3.实验环境 ①PC兼容机 ②Windows、DOS系统、Turbo c 2.0 ③C语言 4.实验提示 ①首先应确定文件系统的数据结构:主目录、活动文件等。主目录文件的形式存放于磁盘,这样便于查找和修改。 主目录结构: Ufdname 用户名 Ufdfile 指向用户的活动文件 活动文件结构: Fpaddr 文件物理地址 Flength 文件长度 Fmode 文件属性(file mode:0-Read Only;1-Write Only;2-Read and Write(default)) Fname 文件名称 ②用户创建的文件,可以编号存储于磁盘上。如:file0,file1,file2…并

以编号作为物理地址,在目录中进行登记。

③本程序需要在c:下建一个名为osfile的目录及一个名为file的子目录,在利用程序创建了文件系统后,可以在这个文件夹下查看到相关的内容。5.实验程序 #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;

操作系统实验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 #include #include #include #include #include #include #include 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");

实验5 文件系统管理

广东技术师范学院实验报告 学院:计算机科学学 院 专业:物联网工程班级: 12物 联网 成绩: 姓名:邓文龙学号:08 组别:组员: 实验地点:工业中心204 实验日期:2014.03.26 指导教师签名: 实验5项目名称:文件系统管理 1、实验目的 理解Linux系统中的文件系统基本结构,掌握各种访问和管理文件以及文件系统的基本命令。 2、实验内容 2.1 文件系统管理的基本概念 文件系统(file system)是指操作系统中用于管理文件信息的软件机构。借用维基百科里面关于文件系统的解释(https://www.360docs.net/doc/2d1613238.html,/wiki/文件系统):计算机的文件系统是一种存储和组织计算机数据的方法,它使得对其访问和查找变得容易,文件系统使用文件和树形目录的抽象逻辑概念代替了硬盘和光盘等物理设备使用数据块的概念,用户使用文件系统来保存数据不必关心数据实际保存在硬盘(或者光盘)的地址为多少的数据块上,只需要记住这个文件的所属目录和文件名。在写入新数据之前,用户不必关心硬盘上的那个块地址没有被使用,硬盘上的存储空间管理(分配和释放)功能由文件系统自动完成,用户只需要记住数据被写入到了哪个文件中。 文件系统既要建立在一定的物理存储设备上,但却是一个逻辑上的概念。对用户来说,关于文件的各种操作及访问都需要通过文件系统进行,文件系统成为用户和存储设备之间的一个重要界面。本实验主要讨论在Linux系统中文件以及文件系统管理的各种操作。 文件系统管理主要包括两大部分的内容,一部分是结合文件系统的基本特性,对文件系统作必要的设置,监控文件系统的基本使用状态,另一部分则是对文件的各类管理操作。这些都是从软件层面上对文件系统进行管理。部分最基本的shell命令已经之前的实验中有所介绍。 2.2文件系统 2.2.1文件系统的层次结构(补充教材6.4.1节) 文件系统表达了一种组织文件的方式。一般地,UNIX文件系统采用的都是一种所谓树状的层次结构,称为“根文件系统”。如下图所示,树根以“/”表示,

实验四 文件系统实验

实验四文件系统实验 一 . 目的要求 1、用高级语言编写和调试一个简单的文件系统,模拟文件管理的工作过程。从而对各种文件操作命令的实质内容和执行过程有比较深入的了解。 2、要求设计一个 n个用户的文件系统,每次用户可保存m个文件,用户在一次运行中只能打开一个文件,对文件必须设置保护措施,且至少有Create、delete、open、close、read、write等命令。 二 . 例题: 1、设计一个10个用户的文件系统,每次用户可保存10个文件,一次运行用户可以打开5个文件。 2、程序采用二级文件目录(即设置主目录[MFD])和用户文件目录(UED)。另外,为打开文件设置了运行文件目录(AFD)。 3、为了便于实现,对文件的读写作了简化,在执行读写命令时,只需改读写指针,并不进行实际的读写操作。 4、算法与框图: ①因系统小,文件目录的检索使用了简单的线性搜索。 ②文件保护简单使用了三位保护码:允许读写执行、对应位为 1,对应位为0,则表示不允许读写、执行。 ③程序中使用的主要设计结构如下: 主文件目录和用户文件目录( MFD、UFD) 打开文件目录( AFD)(即运行文件目录)

文件系统算法的流程图如下: 三 . 实验题: 1、增加 2~3个文件操作命令,并加以实现。(如移动读写指针,改变文件属 性,更换文件名,改变文件保护级别)。 #include #include #include #define getpch(type) (type*)malloc(sizeof(type)) int userNum=0; struct mdf {

Linux文件系统实验

实验编号与实验名称: 文件系统实验 实验目的: 熟悉文件和目录的基本操作;了解Linux的/proc文件系统 实验内容及要求(详见实验讲义与实验指导书): 内容: 1)在/usr目录下创建一个目录usr_test和文本文件test,并建立一个test文件的链接 test02。通过修改test文件中的内容查看test和test02中内容的情况,并分析原因。 2)编写程序,从/proc文件中抽取内核参数(任意的2个参数即可,如CPU时钟速度信 息等) 3)实现文件的拷贝,即把一个文件内容复制到另一个文件 要求: 对于内容1),给出操作步骤和结果分析,需回顾第二次实验中练习过的Shell命令和教材中的文件和目录操作系统调用 对于内容2)和3)给出完整C语言代码或者代码截图和代码执行结果,可参考本文件“实验预读”中相关内容和教材P.149/266图4-5相关代码 实验用到的软件(:) VMware 实验内容及关键步骤(代码)Q2(60分) 1)在/usr目录下创建一个目录usr_test和文本文件test,并建立一个test文件的链接 test02。通过修改test文件中的内容查看test和test02中内容的情况,并分析原因。

分析:在linux系统中通过link连接就可以通过第三方的查询,通过link函数后test01被绑定给test02中,所以可以通过test02去查询。 2.编写程序,从/proc文件中抽取内核参数(任意的2个参数即可,如CPU时钟速度信息等)

3.实现文件的拷贝,即把一个文件内容复制到另一个文件

实验过程中遇到的问题解决办法与实验体会Q3(10分)得分: 评阅教师特殊评语: 评阅教师: 日期:

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

实验报告 实验题目:文件系统 姓名: 学号: 课程名称:操作系统 所在学院:信息科学与工程学院 专业班级:计算机 任课教师:

实验项目名称文件系统 一、实验目的与要求: 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命令,回车,输入文件名,回车,即会在当前目录文件下删除一个名为刚刚输入的文件名的数据文件。在该删除过程中要判断该目录中是否存在该文件,如果不存在就没有必要执行该操作了,还要判断在该目录下有没有删除文件的权限,有权限才可以删除。具体流程图查看第二节,系统流程图设计部分。 ◆ls 显示当前目录下所有目录的模块,输入 ls 命令,回车 ,即会在屏幕上显示当前目录下的所有目录。在该过程中要判断该目录中是否为空,如果为空就没有必要执行该操作了。执行操作时,要调用 readdir (INode inode )函数 ,先读入文件内容到 content 里面,然后直接输出。如果子目录里面还有子目录,则通过递归,一并输出来。具体流程图查看第二节,系统流程图设计部分。 ◆chmod 改变文件权限模块,输入 chmod 命令,回车,输入文件名,回车,即会根据不同类别的用户在屏幕上提示要改变哪一类用户的权限。如果是文件拥有者执行该操作,他可以选择修改自己、其他用户的权限;如果是文件所属组成员执行该操作,他可以选择修改自己、其他用户的权限;如果是其他用户执行该操作,他只能选择修改自己的权限;在该过程中要判断该目录中是否存在该文件,如果不存在就没有必要执行该操作了。执行操作时,要判断对该文件有没有执行写操作的权利,没有就不能进行。具体流程图查看第二节,系统流程图设计部分。 ◆cd 改变当前所在目录的模块。输入 cd,回车,相应的字符串,回车,则会根据输入字符串的不同跳转到不同的目录下。如果字符串是‘ .’ ,则到当前目录;如果字符串是‘ ..’ ,则到父目录;如果字符串是‘/’ ,则到根目录;如果字符串是当前目录下的子目录,则到该子目录;如果字符串是一个决定路径,则到该绝对路径。当然在执行的时候要判断有没有该子目录或者该绝对路径,如果没有的话,就不能执行。具体流程图查看第二节,系统流程图设计部分。 2. 用户操作 ◆login 用户注销模块,输入 login ,回车,当前用户就退出了,需要重新登录。 ◆pw 用户修改口令模块,输入 pw ,回车,则会提示输入原始密码,输入正确了才可以提示输入新密码,并且要求新密码输入两次,两次一样了才能通过修改密码成功。具体流程图查看第二节,系统流程图设计部分。 ◆logout 用户退出系统模块,输入 logout ,回车,系统自动退出。

文件系统实验报告

实验二文件系统实验报告

一.实验简介 本实验要求在假设的I/O 系统之上开发一个简单的文件系统,这样做既能让实验者对文件系统有整体了解,又避免了涉及过多细节。用户通过create, open, read 等命令与文件系统交互。文件系统把磁盘视为顺序编号的逻辑块序列,逻辑块的编号为0 至L-1。I/O 系统利用内存中的数组模拟磁盘。 实际物理磁盘的结构是多维的:有柱面、磁道、扇区等概念。I/O 系统的任务是隐藏磁盘的结构细节,把磁盘以逻辑块的面目呈现给文件系统。逻辑块顺序编号,编号取值范围为0 至L .. 1,其中L 表示磁盘的存储块总数。实验中,我们可以利用字符数组ldisk[L][B] 构建磁盘模型,其中 B 表示每个存储块的长度。I/O 系统从文件系统接收命令,根据命令指定的逻辑块号把磁盘块的内容读入命令指定的内存区域,或者把命令指定的内存区域内容写入磁盘块。 我设计的文件系统拥有三个用户。 二.具体说明 1.文件系统的组织:磁盘的前k 个块是保留区,其中包含如下信息:位图和文件描述符。位图用来描述磁盘块的分配情况。位图中的每一位对应一个逻辑块。创建或者删除文件,以及文件的长度发生变化时,文件系统都需要进行位图操作。前k 个块的剩余部分包含一组文件描述符。每个文件描述符包含如下信息: ?文件长度,单位字节 ?文件分配到的磁盘块号数组。该数组的长度是一个系统参数。在实验中我们可以把它设置为一个比较小的数,例如3。 2.目录:我们的文件系统中仅设置一个目录,该目录包含文件系统中的所有文件。除了不需要显示地创建和删除之外,目录在很多方面和普通文件相像。目录对应0 号文件描述符。初始状态下,目录中没有文件,所有,目录对应的描述符中记录的长度应为0,而且也没有分配磁盘块。每创建一个文件,目录文件的长度便增加一分。目录文件的内容由一系列的目录项组成,其中每个目录项由如下内容组成: ?文件名 ?文件描述符序号 3.对文件的操作: 文件系统需提供如下函数;create, destroy, open, read, write。 ?create(filename): 根据指定的文件名创建新文件。 ?destroy(filename): 删除指定文件。 ?open(filename): 打开文件。该函数返回的索引号可用于后续的read, write, lseek, 或close 操作。 ?close(index): 关闭制定文件。 ?read(index, mem_area, count): 从指定文件顺序读入count 个字节mem_area 指定的内存位

操作系统实验文件管理C 代码

#include #include #include #include #include using namespace std; #define BLKSIZE 512 // 数据块的大小 #define BLKNUM 512 // 数据块的块数 #define INODESIZE 32 // i节点的大小 #define INODENUM 32 // i节点的数目 #define FILENUM 8 // 打开文件表的数目//用户 typedef struct { char user_name[10]; // 用户名 char password[10]; // 密码 } User; //i节点 typedef struct { short inum; // 文件i节点号 char file_name[10]; // 文件名

char type; // 文件类型 char user_name[10]; // 文件所有者 short iparent; // 父目录的i节点号 short length; // 文件长度 short address[2]; // 存放文件的地址 } Inode; //打开文件表 typedef struct { short inum; // i节点号 char file_name[10]; // 文件名 short mode; // 读写模式(1:read, 2:write, // 3:read and write) } File_table; // 申明函数 void login(void); void init(void); int analyse(char *); void save_inode(int); int get_blknum(void); void read_blk(int); void write_blk(int);

实验五 文件管理

课程名称:操作系统 课程类型:必修 实验项目名称:文件管理 实验题目:设计一个多用户的文件系统 一、实验目的 随着社会信息量的极大增长,要求计算机处理的信息与日俱增,涉及到社会生活的各个方面。因此,文件管理是操作系统的一个非常重要的组成部分。学生应独立用高级语言编写和调试一个简单的文件系统,模拟文件管理的工作过程。从而对各种文件操作命令的实质内容和执行过程有比较深入的了解,掌握它们的实施方法,加深理解课堂上讲授过的知识。 二、实验要求及实验环境 用高级语言编写和调试一个简单的文件系统,模拟文件管理的工作过程。要求设计一个10 个用户的文件系统,每次用户可保存10 个文件,一次运行用户可以打开5 个文件。系统能够检查打入命令的正确性,出错时能显示出错原因。对文件必须设置保护措施,例如只能执行,允许读等。在每次打开文件时,根据本次打开的要求,在此设置保护级别,即有二级保护。文件的操作至少有Create、delete、open、close、read、write 等命令。所编写的程序应采用二级文件目录,即设置主文件目录和用户文件目录。前者应包含文件主及它们的目录区指针;后者应给出每个文件占有的文件目录,即文件名,保护码,文件长度以及它们存放的位置等。另外为打开文件设置运行文件目录(AFD),在文件打开时应填入打开文件号,本次打开保护码和读写指针等。 三、设计思想(本程序中的用到的所有数据类型的定义,主程序的流程图及各程序模块之间的调用关系) 1.程序流程图

2.逻辑设计 使用线性表表示UFD,每个元素包括用户ID、保存的文件数、再使用线性表表示文件信息,每个元素包括文件名,文件属性(保护码),文件的状态等信息。该结构需支持以下操作:在尾部插入,查找,修改,在任意位置删除。3、物理设计 char UserName[SizeOfUser][SizeOfUserName];//用户ID long User;//当前用户标志 struct InfoOfFile { char Name[SizeOfFileName];//文件名 bool safe[3];//Read,Write,Execute long status;//ready,open; }UFD[SizeOfUser][SizeOfFile];

实验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.c fs/ext2/acl.h fs/ext2/balloc.c fs/ext2/bitmap.c fs/ext2/dir.c

操作系统实验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 #include #include #include #include #include #include #include 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;

计算机操作系统实验-文件管理

哈尔滨工业大学计算机科学与技术学院 实验报告 课程名称:操作系统 课程类型:必修 实验项目名称:文件管理 实验题目:设计一个多用户的文件系统 班级:实验学院一班 学号:6040310110 姓名:张元竞 设计成绩报告成绩指导老师

一、实验目的 随着社会信息量的极大增长,要求计算机处理的信息与日俱增,涉及到社会生活的各个方面。因此,文件管理是操作系统的一个非常重要的组成部分。学生应独立用高级语言编写和调试一个简单的文件系统,模拟文件管理的工作过程。从而对各种文件操作命令的实质内容和执行过程有比较深入的了解,掌握它们的实施方法,加深理解课堂上讲授过的知识。 二、实验要求及实验环境 用高级语言编写和调试一个简单的文件系统,模拟文件管理的工作过程。要求设计一个10个用户的文件系统,每次用户可保存10个文件,一次运行用户可以打开5个文件。系统能够检查打入命令的正确性,出错时能显示出错原因。对文件必须设置保护措施,例如只能执行,允许读等。在每次打开文件时,根据本次打开的要求,在此设置保护级别,即有二级保护。文件的操作至少有Create、delete、open、close、read、write等命令。 所编写的程序应采用二级文件目录,即设置主文件目录和用户文件目录。前者应包含文件主及它们的目录区指针;后者应给出每个文件占有的文件目录,即文件名,保护码,文件长度以及它们存放的位置等。另外为打开文件设置运行文件目录(AFD),在文件打开时应填入打开文件号,本次打开保护码和读写指针等。 三、设计思想(本程序中的用到的所有数据类型的定义,主程序的流程图及各程序模块之间的调用关系)

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

文件系统设计 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.0 4.实验提示 1) format 格式化

只写打开模拟文件,初始化超级快,初始化dinode 位图 block 位图,初始化主目录,初始化etc 目录,初始化管理员admin 目录,初始化用户xiao 目录,初始化 用户passwd 文件,写入模拟硬盘文件。 2 )install 安装 读写打开模拟文件,读取dinode 位图 block 位图,读取主目录,读取etc 目录,读取管理员admin 目录,读取用户xiao 目录,读取 用户passwd 文件。 3 )login 登陆 用户输入用户名和密码,在passwd 文件中查找是否有此用户,核对密码。正确则登陆成功,当前目录设定到当前用户文件夹下。 Login 登录 结束是,登录成功 输入用户名 查找是否有改 用户名 输入密码是 否 密码是否正确 否 4 )ialloc 申请inode 空间 先检测inode 位图是否加锁,是则退出。加锁,检测inode 空间是否还有已满,是则退出。在inode 位图中顺序查找空闲的inode ,找到则返回inode 地址,block 解锁。函数结束。

兰州大学操作系统实验七存储管理题目和答案

实验七实验报告 实验名称:7 存储管理 实验目的: 1.观察系统存储器使用情况 2.观察进程使用存储器的情况 3.掌握通过内存映像文件提高性能的方法 4.掌握动态内存分配技术 实验时间 3学时 预备知识: 1.存储相关的命令 free 显示系统使用和未被使用的内存数量(可以实时执行) 输出包含的标题有 3 行信息: Mem。此行包含了有关物理内存的信息。包括以下详细内容: total。该项显示可用的物理内存总量,单位为KB。该数字小于安装的物理内存的 容量,是因为内核本身也要使用一小部分的内存。 used。该项显示了用于应用程序超速缓存数据的内存容量。 free。该项显示了此时未使用且有效的内存容量。 Shared/buffers 缓冲区/cached。这些列显示了有关内存如何使用的更为详细的信息。 -/+ buffers/cache。Linux 系统中的部分内存用来为应用程序或设备高速缓存数据。这部分内存在需要用于其他目的时可以释放。 free列显示了调整的缓冲区行,显示释放缓冲区或高速缓存时可以使用的内存容量。 Swap。该行显示有关交换内存利用率的信息。该信息包含全部、已使用和释放的可用内存容量。 vmstat 报告进程、内存、分页、IO等多类信息(使用手册页) size 列出目标文件段大小和总大小(使用手册页)

2./proc文件系统(使用手册页man 5 proc) /proc/meminfo 内存状态信息 /proc/stat 包含内存页、内存对换等信息。 /proc/$pid/stat 某个进程的信息(包含内存使用信息) /proc/$pid/maps某个进程的内存映射区信息,包括地址范围、权限、偏移量以及主次设备号和映射文件的索引节点。 /proc/$pid/statm 某个进程的内存使用信息,包括内存总大小、驻留集大小、共享页面数、文本页面数、堆栈页面数和脏页面数。 3.内存映像文件 内存映像文件是指把一个磁盘文件映像到内存中,二者存在逐字节的对应关系。这样做可以加速I/O操作,并可以共享数据。 3.1 mmap(建立内存映射) 表头文件#include #include 定义函数void *mmap(void *start,size_t length,int prot,int flags,int fd,off_t offsize); 函数说明mmap()用来将某个文件内容映射到内存中,对该内存区域的存取即是直接对该文件内容的读写。参数start指向欲对应的内存起始地址,通常设为NULL,代表让系统自动选定地址,对应成功后该地址会返回。参数length代表将文件中多大的部分对应到内存。 参数prot代表映射区域的保护方式有下列组合 PROT_EXEC 映射区域可被执行 PROT_READ 映射区域可被读取 PROT_WRITE 映射区域可被写入 PROT_NONE 映射区域不能存取 参数flags会影响映射区域的各种特性 MAP_FIXED 如果参数start所指的地址无法成功建立映射时,则放弃映射,不 对地址做修正。通常不鼓励用此旗标。 MAP_SHARED对映射区域的写入数据会复制回文件内,而且允许其他映射该 文件的进程共享。 MAP_PRIV A TE 对映射区域的写入操作会产生一个映射文件的复制,即私人的

相关文档
最新文档