磁盘和文件系统管理(二)实验报告
- 格式:docx
- 大小:17.63 KB
- 文档页数:3
磁盘管理的实验报告实验报告:磁盘管理一、引言(100字)磁盘是计算机中主要的存储介质之一,磁盘管理是操作系统中的一项重要任务。
本实验旨在通过模拟磁盘管理的相关操作,加深对磁盘管理的理解,并学习实际应用中磁盘管理的策略。
二、实验目的(100字)1.了解磁盘管理的基本原理和相关概念;2.学习磁盘分区的原理及实践;3.理解磁盘调度算法的工作原理;4.掌握常用的磁盘管理策略。
三、实验内容(300字)1.磁盘分区:a.使用磁盘分区工具将物理磁盘划分为若干个分区;b.使用命令查看已分区、格式化后的磁盘分区。
2.磁盘调度算法:a.了解并实现FCFS(先来先服务)、SSTF(最短寻道时间优先)和SCAN(扫描)等磁盘调度算法;b.分别使用模拟程序测试不同算法的性能。
3.磁盘缓存:a.实现一个简单的磁盘缓存管理系统;b.学习并使用命令进行磁盘缓存管理的相关操作。
四、实验步骤(400字)1.磁盘分区:a.打开磁盘分区工具,选择对应磁盘进行分区,设置分区大小和类型;b.格式化已分区的磁盘,创建文件系统;c.使用命令查看分区情况,确认分区操作是否成功。
2.磁盘调度算法:a.阅读并理解给定的FCFS、SSTF和SCAN算法的伪代码;b.根据伪代码实现相应的算法,并进行测试;c.分别使用模拟程序测试不同算法的性能,根据性能结果评估各算法的优劣。
3.磁盘缓存:a.阅读并理解磁盘缓存管理的相关原理和命令;b.实现一个简单的磁盘缓存管理系统,包括缓存页面的替换策略;c.使用命令进行磁盘缓存管理的相关操作,通过测试验证缓存管理系统的正确性。
五、实验结果(150字)1.磁盘分区工具成功将物理磁盘划分为若干个分区,并格式化后创建了文件系统;2.使用命令查看分区情况,确认分区操作成功;3.实现了FCFS、SSTF和SCAN算法,并成功模拟了它们的运行过程;4.使用模拟程序测试了不同算法的性能,分析并比较了各算法的优劣;5.成功实现了一个简单的磁盘缓存管理系统,并通过测试验证了其正确性。
Windows网络操作系统管理课程实训报告实训名称:管理磁盘存储实训h-OX»|I G,T fl.SQ-QOflifidJXlB gw QJCT2.使用服务器管理器,在第一个磁盘上创建一个主分区号为X;文件系统为ReFS;卷标为Data。
4.使用磁盘管理,将卷X ,扩展到4096 MB 。
文世闺»^AJ« = M 品沏林0 31目USr X 01 BE工■可闰市! 凌串 |胃行蓄差W7S一三二二・ 二回-0« i» 网 -rue 花+周干 置羊 虫 *唯 S3:SiNTK挈工 而陪艇NJF5状石艮F L-iUiBUJ(-4XHR1F L 状哼吃21© Me 200 MB 里他G& 47.W 驰 杂 XGB 4.30 GB 加 MB4&1MBtoo % 79 U97% 年了 M.叱i 於工■55.M GB 呢C-sta -X: 5.00 GB 3汽54J87 G :B■丑士2设ttA (曲凤敦胧 G6 504 M B NIF S 聚仁UlSff■ * 4 ■ _ -.■二■ F 3堂5M9 GB iWffi■吐[之任里年. |概t旨i 、Eax» miME己叩印用1 】g#3 理事..不%48 仃寤融 79%C-dLa Dtl降百庆时: 一11£0日i^bM& 至**由川寿四土费NTFSWi M s4MMRq 『,ww gi ; moo ME NTFSH.ROfl装万良牙5.将C:\Windows\System32\imgageres.dll复制到卷Z,再复制出9个副本文件。
a. 茎事至百G 5号一■楸摩田 3 \:青=*。
诏(7:'停表3 If ML*也博时可■ S3mg—时=ru.dl25,仃.弓。
15:: 2宜阳等寸温力Kfi・Egag白七-副豆.dll2C 寸:0口15:1.5度用磐F属OKE♦卜科E!X.L3J dll15455.!wr©*tj p fl IIICB* 1力呜d拒rl - E S® 3 dll20"仃巧1。
实验报告磁盘管理实验磁盘管理【实验理论基础】以教材作为实验的理论基础【实验环境】1、完成Windows 2000 server安装的计算机。
2、某磁盘已格式化为NFTS5.0文件系统 3、 Windows 2000 Server安装光盘。
【实验内容】1. Windows 2000 Server数据加密与解密.2. Windows 2000 Server数据压缩。
3. Windows 2000 文件与目前权限设置。
4. Windows 2000磁盘配额。
【实验步骤】(一)数据的加密与解密 1. 数据加密欲做数据加密,先做一个xtvtc文件夹以方便说明,然后以上一章所建立的一个用户账户(Chujl)来登录。
登陆之后打开xtvtc文件夹属性对话框,在该对话框中击“高级”按钮,弹出文件夹的“高级属性”对话框,在此对话框中,必须勾选“加密内容以便保护数据”选项来为该文件夹与文件加密,按“确定”按钮返回“文件夹属性”对话框。
完成数据加密。
注意:加密文件夹可说是一个加密的容器,因此任何人都可以将数据放入该文件夹之中,且这些数据都会自动加密,但是只有用户本人(或数据加密代理者)才能读取该文件。
2. 数据解密经过数据加密之后,如果想要将数据解密,则可以在文件夹高级属性对话框中将“加密内容以便保护数据”选项解除勾选即可。
解密之后系统会要求给予解密的范围,如果在解密的范围内有不属于该用户加密的文件,略过无法解密的文件后,系统会将可解密的文件属性还原成正常。
3、数据压缩为了提高磁盘的存储数据量,可以压缩内容一边节省磁盘空间。
文件夹的“高级属性”对话框中,有一“压缩内容以便节省磁盘空间”选项,如果点击该选项,则当文件数据储存至该文件夹时会自动压缩,且当您要读取数据时系统又会自动解压缩,因此可以节省磁盘空间。
(二)数据安全性设置由于windows 2000 Server 可以当作文件服务器,所以会有多人同时使用的状况,因此对于文件或目录就必须有一套规则来管理。
一、实训背景随着信息技术的飞速发展,文件系统作为存储和管理数据的核心,其性能、稳定性和安全性越来越受到重视。
为了提高我们对文件系统管理的理解和实践能力,我们进行了文件系统管理实训。
本次实训以Linux系统下的文件系统管理为主要内容,通过实际操作,加深对文件系统结构、命令、权限管理等方面的认识。
二、实训目标1. 掌握Linux文件系统的基本结构;2. 熟悉常用的文件系统管理命令;3. 理解文件权限和属性的概念;4. 学会文件系统备份与恢复;5. 提高文件系统的安全性和性能。
三、实训内容(一)文件系统结构Linux文件系统采用树状结构,以根目录“/”为起点,所有文件和目录都从根目录开始分层排列。
常见的文件系统结构包括:1. 根目录(/):包含系统中的所有目录和文件;2. 换行目录(/bin、/sbin、/usr):存放常用的系统命令和系统服务;3. 用户目录(/home):存放用户个人文件和目录;4. 临时目录(/tmp):存放临时文件和程序;5. 系统目录(/etc、/var、/opt):存放系统配置文件、日志文件和可选软件包。
(二)文件系统管理命令1. ls:列出目录内容;2. pwd:显示当前目录的绝对路径;3. cd:切换目录;4. mkdir:创建目录;5. rmdir:删除空目录;6. touch:创建空文件;7. rm:删除文件或目录;8. cp:复制文件或目录;9. mv:移动或重命名文件或目录;10. chmod:修改文件权限;11. chown:更改文件所有者;12. chgrp:更改文件所属组。
(三)文件权限和属性Linux文件权限分为三组:所有者、所属组和其他用户。
每组权限包括读(r)、写(w)和执行(x)三种。
通过chmod命令可以修改文件权限,例如:- chmod 755 filename:设置所有者有读、写、执行权限,所属组和其他用户有读、执行权限;- chmod u+x filename:给所有者添加执行权限;- chmod g-w filename:取消所属组的写权限。
实验二文件系统实验报告一.实验简介本实验要求在假设的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。
磁盘管理实验报告心得引言磁盘是计算机中重要的硬件设备,负责存储和管理大量的数据。
磁盘管理是操作系统中非常重要的一部分,对系统的性能和稳定性有着直接的影响。
在这次磁盘管理实验中,我深入了解了磁盘的内部组织结构以及常见的磁盘管理算法,并通过实验学习了磁盘的分区、格式化、文件读写等操作。
这次实验让我对磁盘管理有了更深入的理解,并且增强了我在操作系统方面的实践能力。
实验内容这次实验主要包括以下几个方面的内容:1. 磁盘的组织结构和工作原理:了解磁盘的物理结构,包括道、磁头和扇区的概念,以及磁盘读写的基本原理。
2. 分区与格式化:了解磁盘分区和格式化的概念和操作方法,并通过实验进行磁盘分区和格式化的操作。
3. 文件读写:学习文件的逻辑结构和文件读写的基本原理,通过实验实现一些简单的文件读写操作。
4. 空闲空间管理:了解磁盘上空闲空间的管理方法,包括位图法和链表法,并通过实验实现了位图法的空闲空间管理算法。
实验过程在实验过程中,我首先通过阅读相关资料了解了磁盘的组织结构和工作原理。
磁盘是由多个碟片组成的,每个碟片分为若干个圆环状的道,每个道又被划分为若干个弧段,也就是扇区。
每个碟片上还有一个或多个磁头,可以在碟片上进行磁道和扇区的读写操作。
接着,我进行了磁盘的分区和格式化操作。
分区是将一个物理磁盘划分为多个逻辑区域,每个逻辑区域可以独立管理。
格式化是对分区进行初始化操作,以便后续的文件读写等操作。
通过实验,我成功地对磁盘进行了分区和格式化,并对分区和格式化的过程有了更深入的了解。
在文件读写方面,我学习了文件的逻辑结构和文件读写的基本原理。
文件是操作系统中的基本单位,有顺序文件和随机文件两种不同的逻辑结构。
顺序文件的读写是按照文件中记录的顺序进行的,而随机文件的读写则是按照文件中记录的位置进行的。
通过实验,我实现了一些简单的文件读写操作,并加深了对文件读写原理的理解。
最后,我学习了磁盘空闲空间的管理算法。
磁盘上有大量的空闲空间,如何高效地管理这些空闲空间对系统的性能有着重要的影响。
磁盘管理实验报告磁盘管理实验报告概述:磁盘管理是计算机操作系统中的重要组成部分,它负责管理计算机系统中的磁盘存储空间,确保数据的高效存取和安全性。
本实验旨在通过实际操作和测试,探究磁盘管理的原理和技术,并评估其对系统性能的影响。
实验目标:1. 理解磁盘管理的基本概念和原理。
2. 掌握磁盘分区和文件系统的创建与管理方法。
3. 了解磁盘调度算法的工作原理和性能特点。
4. 分析磁盘缓存和磁盘阵列技术对系统性能的影响。
实验环境:本次实验使用了一台配置较为普通的计算机,搭载了Windows 10操作系统和500GB机械硬盘。
实验步骤和结果:1. 磁盘分区和文件系统的创建与管理:在Windows 10操作系统中,我们使用了磁盘管理工具对硬盘进行了分区和格式化操作。
通过分区,我们将硬盘划分为多个逻辑驱动器,以便更好地管理和组织数据。
而文件系统的格式化则是为了在磁盘上创建文件系统,并对其进行初始化。
我们选择了NTFS文件系统,因为它支持更大的文件大小和更高的性能。
经过实验操作,我们成功地创建了多个分区,并将它们格式化为NTFS文件系统。
2. 磁盘调度算法的工作原理和性能特点:磁盘调度算法是为了优化磁盘访问的顺序和效率而设计的。
在本次实验中,我们选择了最常用的磁盘调度算法——SCAN算法,并通过实验测试其性能。
我们使用了一个模拟的磁盘访问序列,并记录了SCAN算法下的平均寻道时间和平均旋转延迟时间。
实验结果表明,SCAN算法在磁盘访问效率方面表现出色,能够较好地平衡磁盘访问的延迟和吞吐量。
3. 磁盘缓存和磁盘阵列技术对系统性能的影响:磁盘缓存和磁盘阵列技术是提高磁盘访问性能的两种常见方法。
磁盘缓存利用高速缓存存储器来暂存磁盘数据,以减少对磁盘的实际访问次数,从而提高系统的响应速度。
而磁盘阵列则是通过将多个磁盘组合成一个逻辑单元,实现数据的并行读写,从而提高磁盘的吞吐量。
通过实验测试,我们对比了启用和禁用磁盘缓存以及使用单个磁盘和磁盘阵列的情况下的磁盘访问性能。
磁盘管理实训报告一、实训目的本次实训旨在通过实际操作,使学生掌握Linux系统下磁盘管理的相关知识,包括磁盘分区、格式化、挂载等基本操作,提高学生在实际工作中处理磁盘问题的能力。
二、实训环境1. 操作系统:Linux(CentOS 7)2. 磁盘:一块2G的虚拟硬盘3. 工具:fdisk、parted、mkfs.ext4、mount等三、实训内容1. 磁盘分区(1)使用fdisk命令创建分区首先,使用fdisk命令对虚拟硬盘进行分区操作。
在Linux终端输入以下命令:```fdisk /dev/sdb```其中,/dev/sdb表示虚拟硬盘的设备名称。
(2)选择分区类型进入fdisk交互模式后,按p键查看当前磁盘的分区情况。
按n键创建新分区,然后根据提示选择分区类型(主分区或扩展分区)。
这里以创建主分区为例。
(3)设置分区大小和起始位置根据提示输入新分区的大小和起始位置。
这里以创建一个2G的主分区为例。
(4)保存分区表创建完分区后,按w键保存分区表。
2. 格式化分区使用mkfs.ext4命令对新建的分区进行格式化。
格式如下:```mkfs.ext4 /dev/sdb1```其中,/dev/sdb1表示新建的主分区。
3. 挂载分区(1)创建挂载点在Linux系统中,需要创建一个挂载点来存放分区中的文件。
使用mkdir命令创建挂载点:```mkdir /mnt/sdb1```(2)挂载分区使用mount命令将分区挂载到挂载点:```mount /dev/sdb1 /mnt/sdb1```4. 查看磁盘空间使用情况使用df命令查看磁盘空间使用情况:```df -h```5. 卸载分区使用umount命令卸载分区:```umount /mnt/sdb1```四、实训总结通过本次实训,我掌握了以下磁盘管理操作:1. 使用fdisk命令创建、删除和修改分区。
2. 使用mkfs.ext4命令对分区进行格式化。
文件管理系统实验报告文件管理系统实验报告一、引言文件管理系统是现代社会中不可或缺的一部分。
随着信息技术的迅猛发展,文件的产生和管理变得越来越重要。
本实验旨在通过设计和实现一个简单的文件管理系统,探索文件管理的原理和方法。
二、实验目的1.了解文件管理系统的基本概念和功能;2.掌握文件的创建、读取、修改和删除等操作;3.熟悉文件的组织和存储结构;4.实践文件管理系统的设计和实现。
三、实验内容1.文件的创建和读取在文件管理系统中,文件的创建和读取是最基本的操作。
通过调用系统函数,我们可以创建一个新文件,并向其中写入数据。
而读取文件则是通过指定文件路径和文件名来获取文件的内容。
2.文件的修改和删除文件的修改和删除是文件管理系统中的常见操作。
通过系统函数,我们可以打开一个已有的文件,并对其进行修改。
而删除文件则是通过指定文件路径和文件名来删除一个文件。
3.文件的组织和存储结构文件管理系统中,文件的组织和存储结构对于文件的管理和访问有着重要的影响。
常见的文件组织结构包括顺序文件、索引文件和哈希文件等。
在本实验中,我们将选择适合的文件组织结构,并实现相应的存储和检索算法。
四、实验步骤1.设计文件管理系统的数据结构在开始实验之前,我们需要先设计文件管理系统的数据结构。
这包括文件控制块(FCB)、目录项(Directory Entry)和文件块(File Block)等。
通过合理的数据结构设计,可以提高文件管理系统的性能和效率。
2.实现文件的创建和读取功能根据文件管理系统的设计,我们可以开始实现文件的创建和读取功能。
通过调用系统函数,我们可以创建一个新的文件,并向其中写入数据。
而读取文件则是通过指定文件路径和文件名来获取文件的内容。
3.实现文件的修改和删除功能文件的修改和删除是文件管理系统中的常见操作。
通过调用系统函数,我们可以打开一个已有的文件,并对其进行修改。
而删除文件则是通过指定文件路径和文件名来删除一个文件。
一、实验目的1. 理解磁盘的基本结构和工作原理。
2. 掌握Linux操作系统中磁盘管理的常用命令。
3. 学会使用磁盘分区、格式化、挂载等基本操作。
4. 了解磁盘故障的检测与修复方法。
二、实验环境1. 操作系统:Linux2. 硬件设备:计算机、硬盘(包括固态硬盘和机械硬盘)3. 软件工具:磁盘分区工具、格式化工具、磁盘检测工具等三、实验内容1. 磁盘结构和工作原理磁盘是计算机中常用的存储设备,主要由以下几个部分组成:磁头:用于读写磁盘上的数据。
磁盘片:由多个磁性盘片组成,用于存储数据。
控制单元:负责控制磁头的移动和数据读写。
磁盘的工作原理如下:1. 当读取数据时,磁头定位到指定位置,读取磁盘片上的数据。
2. 当写入数据时,磁头将数据写入磁盘片上的指定位置。
2. 磁盘管理命令Linux操作系统中,常用的磁盘管理命令如下:fdisk:用于磁盘分区。
mkfs:用于格式化磁盘分区。
mount:用于挂载磁盘分区。
df:用于查看磁盘使用情况。
du:用于查看文件/文件夹大小。
3. 磁盘分区磁盘分区是指将硬盘划分为多个逻辑分区,每个分区可以独立存储数据。
实验步骤:1. 使用fdisk命令创建新的磁盘分区。
2. 使用mkfs命令格式化磁盘分区。
3. 使用mount命令将磁盘分区挂载到文件系统。
4. 磁盘格式化磁盘格式化是指将磁盘分区上的数据全部清空,并建立文件系统。
实验步骤:1. 使用mkfs命令格式化磁盘分区。
2. 使用df命令查看磁盘使用情况。
5. 磁盘挂载磁盘挂载是指将磁盘分区与文件系统关联起来,以便用户访问。
实验步骤:1. 使用mount命令将磁盘分区挂载到文件系统。
2. 使用df命令查看磁盘挂载情况。
6. 磁盘故障检测与修复磁盘故障可能导致数据丢失或系统崩溃。
以下是一些常用的磁盘故障检测与修复方法:使用磁盘检测工具检测磁盘健康状态。
使用磁盘修复工具修复磁盘错误。
备份数据以防止数据丢失。
四、实验结果与分析通过本次实验,我们成功掌握了以下内容:1. 磁盘的基本结构和工作原理。
磁盘管理实验报告
磁盘管理实验报告
⼀、实验要求:
1.掌握磁盘分区技巧。
2.掌握虚拟内存的增配及优先级调配。
3.掌握tune2fs的使⽤⽅法。
⼆、实验过程:
1.磁盘的分区:
在linux中我们对磁盘进⾏分区时需要理解添加⼀个新的⽂件系统需要⽣成的⽂件树规则:定义⼀个设备
设备分区
创建⼀个⽂件系统(格式化)
建⽴⼀个卷标
写⼊到/etc/fstab
挂载新的⽂件系统
2.虚拟内存:
虚拟内存的创建有两种⽅式,⼀种是fdisk创建,⼀种是空设备⽂件创建。
(1)fdisk创建(在fdisk界⾯创建需要更改系统标识,然后格式化为swap格式):
(2)空设备创建(这个相当于在已有的分区中腾出空设备,给他名字,然后格式化为swap):
(3)swap优先调⽤级别调试:
3. tune2fs的使⽤:
tune2fs是查看某⼀个分区的详细信息,就如在windows下查看属性⼀样!
我们通过tune2fs -l /dev/sda5来查看sda5的详细信息。
其中我们
需要注意的是Default mount options (none)这⾥的none表⽰什么都没有,⽽/dev/sda2是系统缺省(默认)创建的分区。
Default mount options缺省挂载选项⾃动添加acl权限,不随系统创建,是⾃⼰之后创建出来的。
实验成功。
实验报告完成。
实验二文件系统及磁盘管理1.文件系统管理一、实验目的●掌握Linux下文件系统的创建、挂载与卸载。
●掌握文件系统的自动挂载。
二、项目背景某企业的Linux服务器中新增了一块硬盘/dev/sdb,请使用fdisk命令新建/dev/sdb1主分区和/dev/sdb2扩展分区,并在扩展分区中新建逻辑分区/dev/sdb5,并使用mkfs命令分别创建vfat和ext3文件系统。
然后用fsck命令检查这两个文件系统;最后,把这两个文件系统挂载到系统上。
三、实验内容练习Linux系统下文件系统的创建、挂载与卸载及自动挂载的实现。
四、实验步骤子项目1.创建/dev/sdb1和/dev/sdb5●使用fdisk命令创建/dev/sdb1主分区。
●使用fdisk命令创建/dev/sdb2扩展分区。
●使用fdisk命令创建/dev/sdb5逻辑分区。
●输入子命令w,把设置写入硬盘分区表,退出fdisk并重新启动系统。
●用mkfs命令在上述刚刚创建的分区上创建ext3文件系统和vfat文件系统。
●用fsck命令检查上面创建的文件系统。
子项目2.挂载/dev/sdb1和/dev/sdb5●利用mkdir命令,在/mnt目录下建立挂载点,mountpoint1和mountpoint2。
●把上述新创建的ext3分区挂载到/mnt/mountpoint1上。
●把上述新创建的vfat分区挂载到/mnt/mountpoint2上。
●利用mount命令列出挂载到系统上的分区,查看挂载是否成功。
●利用umount命令卸载上面的两个分区。
子项目3.实现/dev/sdb1和/dev/sdb5的自动挂载●编辑系统文件/etc/fstab文件,把上面两个分区加入此文件中。
●重新启动系统,显示已经挂载到系统上的分区,检查设置是否成功。
子项目4.挂载光盘和U盘●取一张光盘放入光驱中,将光盘挂载到/media/cdrom目录下。
查看光盘中的文件。
大学操作系统课程综合实践题目:磁盘文件操作班级:姓名:学号:指导教师:2011年 12 月 23日磁盘文件操作摘要:为了正确地实现文件的存取,文件系统设计了一组与存取文件有关的功能模块,用户可以用“访问指令”调用这些功能模块,以实现文件的存取要求。
我们把文件系统设计的这一组功能模块称为“文件操作“,实验就是要模拟实现一些文件操作。
文件操作不是独立的,它和文件系统的其他部分密切相关,若要实现文件操作就离不开文件的目录结构、文件的组织结构和磁盘空间的管理。
因此,这个实习虽然是文件操作的模拟实现,但还是必须模拟一部分文件的组织结构、目录结构和磁盘空间管理的实现。
关键字:磁盘、文件、目录、分配表。
一、实验内容:设计一个简单的文件系统,用文件模拟磁盘,用数组模拟缓冲区,要求实现;1.支持多级目录结构,支持文件的绝对路径;2.文件的逻辑结构采用流式结构,物理结构采用链接结构中的显示链接方式;3.采用文件分配表;4.实现的命令包括建立目录、列目录、删除空目录、建立文件、删除文件、显示文件内容、打开文件、读文件、写文件(追加方式)、关闭文件、改变文件属性。
最后编写主函数对所做工作进行测试。
二、实验目的:1、文件的操作。
2、文件的逻辑结构和物理结构3、磁盘空间的管理4、磁盘目录结构三、实验环境:Windows XP、VC++四、程序运行结果(详图):程序运行的主界面:用户运行命令7-建立目录用户运行命令1-建立文件:显示目录内容:打开文件:写文件:关闭文件:再次显示目录内容:以上为程序的运行的部分截图。
五、程序清单:#define false 0#define true 1#include "stdio.h"//#include <fcntl>#include<string.h>//#param warning(disable:4996)FILE*x1,*x2;typedef struct{char name[3]; /*文件或目录名*/char type[2]; /*文件类型名*/char attribute; /*属性*/char address; /*文件或目录的起始盘块号*/char length; /*文件长度,以盘块为单位*/}content; /*目录结构*/#define n 5 /*模拟实验中系统允许打开文件的最大数量*/ typedef struct{int dnum; /*磁盘盘块号*/int bnum; /*盘块内第几项*/}pointer; /*已打开文件表中读写指针的结构*/typedef structchar name[20]; /*文件绝对路径名*/char attribute;/*文件的属性,用1个字节表示,所以用了char类型*/ int number; /*文件起始盘块号*/int length; /*文件长度,文件占用的字节数*/int flag; /*操作类型,用"0"表示以读操作方式开文件,用"1"表示写操作方式打开文件*/pointer read; /*读文件的位置,文件刚打开时dnum为文件起始盘块号,bnum 为"0"*/pointer write; /*写文件的位置,文件建立时dnum为文件起始盘块号,bnum 为"0",打开时为文件末尾*/}OFILE; /*已打开文件表项类型定义*/struct{OFILE file[n]; /*已打开文件表*/int length; /*已打开文件表中登记的文件数量*/}openfile; /*已打开文件表定义*/char buffer1[64];/*模拟缓冲1*/content buffer2[8];/*模拟缓冲2*/FILE *fc; /*模拟磁盘的文件指针*/void copen(OFILE *x1,OFILE *x2)//OFILE *x1,*x2;{strcpy(x1->name,x2->name);x1->attribute=x2->attribute;x1->number=x2->number;x1->length=x2->length;x1->flag=x2->flag;x1->read.dnum=x2->read.dnum;x1->read.bnum=x2->read.bnum;x1->write.dnum=x2->write.dnum;x1->write.bnum=x2->write.bnum;}int sopen(char *name)/*在已打开文件表中查找文件name*/ //P172//char *name;{int i;i=0;while(i<openfile.length&&strcmp(openfile.file[i].name,name)!=0)/*依次查找已打开文件表*/i++;if(i>=openfile.length)return(-1);return(i);}/*查找sopen函数结束*/void dopen(char *name)/*在已打开文件表中删除文件name*///char *name;{int i;i=sopen(name);if(i==-1)printf("文件未打开\n");else{copen(&openfile.file[i],&openfile.file[openfile.length-1]);openfile.length--;}}/*删除函数结束*/int iopen(content *x)/*在已打开文件表中插入文件name*///content *x;{int i;i=sopen(x->name);if(i!=-1){printf("文件已经打开\n");return(false);}else if(openfile.length==n){printf("已打开文件表已满\n");return(false);}else{//copen(&openfile.file[openfile.length],x);openfile.length++;return(true);}}/*填写已打开文件表函数结束*/int allocate( )/*分配一个磁盘块,返回块号*/{int i;fseek(fc,0,SEEK_SET); /*将模拟磁盘的文件指针移至模拟磁盘FAT表*/fread(buffer1,64L,1,fc);/*将FAT表中第一个磁盘块读入模拟缓冲buffer1中*/for(i=3;i<63;i++)if(buffer1[i]==0){ /*FAT中的第i项为0,分配第i块磁盘块,修改FAT表,并且写回磁盘*/buffer1[i]=255; //P173fseek(fc,0,SEEK_SET);fwrite (buffer1,64L,1,fc);return(i); /*返回磁盘号*/}fread(buffer1,64L,1,fc);/*将FAT表中第二个磁盘块读入模拟缓冲buffer1中*/for(i=0;i<63;i++)if(buffer1[i]==0){/*FAT中的第i项为0,分配第i+64块磁盘块,修改FAT表,并且写回磁盘*/buffer1[i]=255;fseek(fc,-64L,SEEK_CUR);fwrite(buffer1,64L,1,fc);return(i+64); /*返回磁盘号*/}printf("已经没有磁盘空间\n");return(false);}/*分配磁盘块函数结束*/int read_file(char *name,int length)/*读文件函数,文件路径名name,读取长度length*///char *name;//int length;{int i,t;//char ch;if((i=sopen(name))==-1){printf("文件没有打开或不存在\n");return (false);}if(openfile.file[i].flag==1){printf("文件以写方式打开,不能读\n");return 0;}t=0;fseek(fc,openfile.file[i].read.dnum*64L,SEEK_SET);fread(buffer1,64,1,fc);while(t<length&&buffer1[openfile.file[i].read.bnum]!='#'){putchar(buffer1[openfile.file[i].read.bnum]);/*读出一个字符(这里是在屏幕上显示)*/if((t+1)%64==0)putchar('\n');/*修改读指针*/openfile.file[i].read.bnum++;if(openfile.file[i].read.bnum>=64)/*一块读完,读取下一个盘块*/{fseek(fc,openfile.file[i].read.dnum/64*64, SEEK_SET);fread(buffer1,64,1,fc);openfile.file[i].read.dnum=buffer1[openfile.file[i].read.dnum%64];/*修改读指针*/openfile.file[i].read.bnum=0;fseek(fc,openfile.file[i].read.dnum*64L,SEEK_SET);fread(buffer1,64,1,fc);/*读取下一个*/}t++;}}/*读函数结束*/int write_file(char *name,char *buff,int length) //P174/*写文件函数*///char *name;/*文件路径名*///char *buff;/*存放准备写入磁盘的内容*///int length;/*写入内容的长度*/{int i,t,dd;if((i=sopen(name))==-1)/*文件不存在,无法写*/{printf("文件没有打开或不存在\n");return (false);}if(openfile.file[i].flag==0){printf("文件以读方式打开,不能写\n");return (false);}t=0;fseek(fc,openfile.file[i].write.dnum*64L, SEEK_SET);fread(buffer1,64,1,fc);while(t<length){buffer1[openfile.file[i].write.bnum]=buff[t];openfile.file[i].write.bnum++;openfile.file[i].length++;if(openfile.file[i].write.bnum>=64){fseek(fc, openfile.file[i].write.dnum*64L, SEEK_SET);fwrite(buffer1,64,1,fc);/*一块写完,写回磁盘*/if((dd=allocate())==false){openfile.file[i].write.bnum--;openfile.file[i].length--;printf("无磁盘空间,部分信息丢失,写失败\n");return (false);}/*if*/fseek(fc,openfile.file[i].write.dnum/64*64L, SEEK_SET);fread(buffer1,64,1,fc);buffer1[openfile.file[i].write.dnum%64]=dd;fseek(fc,openfile.file[i].write.dnum/64*64L, SEEK_SET);fwrite(buffer1,64,1,fc);openfile.file[i].write.dnum=dd;openfile.file[i].write.bnum=0;}/*if*/t++;}/*while*/fseek(fc, openfile.file[i].write.dnum*64L, SEEK_SET);fwrite(buffer1,64,1,fc);/*一块写完,写回磁盘*/}/*写函数结束*/int search(char *name,int flag,int *dnum,int *bnum)/*查找路径名为name的文件或目录,返回该目录的起始盘块号 *///char *name;//int flag; /*flag=8表示查找目录,否则为文件*///int *dnum,*bnum;/*返回找到文件或目录的目录项的位置:盘块dnum中第bnum项*/{int k,i,s,j,last=0;char pna[3],type[2];if((strcmp(name,"")==0)||(strcmp(name,"/")==0))/*根目录*/ //P175return(2);k=0;if(name[0]=='/')k=1;i=2; /*i=根目录的起始盘块号*/while(last!=1){/*pna=从name中分离出"/"后一个目录名(或文件名)*/for(s=0;name[k]!='.'&&name[k]!='/'&&s<3&&name[k]!='\0';s++,k++)pna[s]=name[k];for(;s<3;s++)/*用空格补全名字长度*/pna[s]=' ';while(name[k]!='.'&&name[k]!='\0'&&name[k]!='/')/*除去多余字符*/k++;type[0]=type[1]=' ';if(name[k]=='.')/*取文件类型名type*/if(flag==8){printf("目录不应该有有类型名,查找失败\n");return(false);}else{/*文件遇到类型名认为结束,后面的字符作废*/k++;if(name[k]!='\0')type[0]=name[k];k++;if(name[k]!='\0')type[1]=name[k];if(name[k]!='\0'&&name[k+1]!='\0'){printf("文件名错误\n");return(false);}last=1;}elseif(name[k]!='\0')k++;if(name[k]=='\0')last=1;/*查找目录且名字等于pna的目录项*/fseek(fc,i*64L,SEEK_SET);fread(buffer2,64L,1,fc);j=0;if(last==1&&flag!=8)while(j<8&&!(buffer2[j].attribute!=8&&buffer2[j].name[0]==pna[0]& &buffer2[j].name[1]==pna[1]&&buffer2[j].name[2]==pna[2]&&buffer2[j].type[0]==type[0]&&buffer2[j].type[1]==type[1]))j++;elsewhile(j<8&&!(buffer2[j].attribute==8&&buffer2[j].name[0]==pna[0]&&buffer2[j].name[1]==pna[1]&&buffer2[j].name[2]==pna[2]))j++;if(j<8)/*找到该目录或文件*/if(last==1)/*查找结束*/{*dnum=i;*bnum=j;return(buffer2[j].address);} //P176else/*查找还未结束*/i=buffer2[j].address;/*读取下一个盘块*/elsereturn(false);}/*while 查找结束*/}/*search()结束*/int create_file(char *name,int attribute)/*建立文件函数,路径名name,文件属性attribute*///char *name;//int attribute;{int i,j,k,s,d,t,b,dd,dn,bn;char dname[3],tname[2],pathname[20];OFILE x;if(attribute%2==1){printf("只读文件,无法写,不能建立\n");return(false);}if(openfile.length==n){printf("已打开表已满,不能建立\n");return(false);}/* 将name分成两部分,目录路径pathname和目录名dname*/for(j=0;name[j]!='\0';j++)/*查找最后一个“/”*/if(name[j]=='/')s=j;/*分离目录路径*/for(j=0;j<s;j++)pathname[j]=name[j];pathname[j]='\0';/*分离文件名*/for(k=0,j=s+1;name[j]!='\0'&&k<3&&name[j]!='.';j++,k++) dname[k]=name[j];if(k==0){printf("错误文件名或目录名\n");return(false);}for(;k<3;k++)dname[k]=' ';k=0;if(name[j++]=='.')/*分离类型名*/{for(;name[j]!='\0'&&k<2&&name[j]!='.';j++,k++)tname[k]=name[j];}for(;k<2;k++)tname[k]=' ';if((d=search(pathname,8,&dn,&bn))==false)/*找到目录路径,返回该目录所在块号dn和项数bn*/{printf("目录不存在,不能建立");return(false);}/*确认该目录不存在的同时查找空目录项*/ b=-1; //P177fseek(fc,d*64L,SEEK_SET);fread(buffer2,64L,1,fc); /*读出dnum盘块的内容*/for(t=0;t<8;t++){if(buffer2[t].name[0]==dname[0]&&buffer2[t].name[1]==dname[1]&&buffer2[t].name[2]==dname[2]&&buffer2[t].type[0]==tname[0]&&buffer2[t].type[1]==tname[1]){/*找到名字dname的文件,建立失败*/printf("文件已经存在,不能建立\n");return(false);}if(buffer2[t].name[0]=='$'&&b==-1)b=t;}/*for*/if(b==-1)/*没有空目录项,建立失败*/{printf("目录无空间\n");return(false);}if((dd=allocate( ))==false)/*分配给建立目录的磁盘盘块dd*/{printf("建立文件失败\n");return(false);}/*填写目录项*/for(i=0;i<3;i++)buffer2[b].name[i]=dname[i];for(i=0;i<2;i++)buffer2[b].type[i]=tname[i];buffer2[b].attribute=attribute;buffer2[b].address=dd;buffer2[b].length=0;fseek(fc,d*64L,SEEK_SET);fwrite(buffer2,64L,1,fc);/*填写已打开文件表*/strcpy(,name);x.attribute=attribute;x.number=dd;x.length=0;x.flag=1;x.read.dnum=x.write.dnum=dd;x.read.bnum=x.write.bnum=0;//iopen(&x);}/*建立文件结束*/int open_file(char *name,int attribute)/*打开文件函数*///char *name;//int attribute;{OFILE x;int dnum,bnum,last,i,d;if((d=search(name,4,&dnum,&bnum))==false) {printf("文件不存在,打开操作失败\n");return(false);}fseek(fc,dnum*64L,SEEK_SET);/*读出对应目录项*/ //P178fread(buffer2,64,1,fc);if((buffer2[bnum].attribute%2==1)&& attribute==1)/*对只读文件要求写*/{printf("文件不能写,打开失败");return(false);}strcpy(,name);x.attribute=buffer2[bnum].attribute;x.number=buffer2[bnum].address;x.read.dnum=x.write.dnum=buffer2[bnum].address;x.read.bnum=x.write.bnum=0;x.flag=attribute;if(attribute==1){while(d!='\xff')/*寻找文件末尾*/{fseek(fc, d/64*64L, SEEK_SET);fread(buffer1,64L,1,fc);/*读出dnum项所在FAT*/last=d;d=buffer1[d%64];/*读出dnum块下一块内容赋给dnum*/}/*while*/x.write.dnum=last;/*填写写指针*/fseek(fc, last*64L, SEEK_SET);fread(buffer1,64L,1,fc);for(i=0;i<64&&buffer1[i]!='#';i++);x.write.bnum=i;x.length=(buffer2[bnum].length-1)*64+i;}iopen(&x);/*填写已打开文件表*/}int close_file(char *name)/*关闭文件函数*///char *name;{int i,dnum,bnum;if((i=sopen(name))==-1){printf("打开的文件中没有该文件,关闭失败\n");return(false);}if(openfile.file[i].flag==1)/*写文件的追加文件结束符*/{fseek(fc,openfile.file[i].write.dnum*64L, SEEK_SET);fread(buffer1,64,1,fc);buffer1[openfile.file[i].write.bnum]='#';fseek(fc,openfile.file[i].write.dnum*64L, SEEK_SET);fwrite(buffer1,64,1,fc);fputc('#',fc);search(name,4,&dnum,&bnum);/*查找该文件目录位置*//*修改目录中的文件长度*/fseek(fc,dnum*64L, SEEK_SET);fread(buffer2,64,1,fc);buffer2[bnum].length=openfile.file[i].length/64+1;fseek(fc, dnum*64L, SEEK_SET);fwrite(buffer2,64,1,fc);}/*在已打开文件表中删除该文件的登记项*/if(openfile.length>1) //P179copen(&openfile.file[i],&openfile.file[openfile.length-1]);openfile.length--;}int Delete(char *name)/*删除文件*///char *name;{int dnum,bnum,t;if((t=search(name,4,&dnum,&bnum))==false){printf("文件不存在\n");return(false);}if(sopen(name)!=-1){printf("该文件打开,不能删除\n");return(false);}fseek(fc,dnum*64L, SEEK_SET);fread(buffer2,64,1,fc);buffer2[bnum].name[0]='$';/*将该文件的目录置成空目录*/ fseek(fc,dnum*64L, SEEK_SET);fwrite(buffer2,64,1,fc);while(t!='\xff')/*通过FAT查找每一个盘块号,并依次删除*/ {dnum=t;fseek(fc, dnum/64*64, SEEK_SET);fread(buffer1,64,1,fc);t=buffer1[dnum%64];buffer1[dnum%64]=0;fseek(fc, dnum/64*64L, SEEK_SET);fwrite(buffer1,64,1,fc);}}/*文件删除结束*/int md(char *name)/*建立目录函数,目录路径名name*///char *name;{int i,j,k,s,d,t,b,dd,dn,bn;char dname[3],pathname[20];i=2;/* i=根目录的起始盘块号*//* 将name分成两部分,目录路径pathname和目录名dname*/for(j=0;name[j]!='\0';j++)/*查找最后一个“/”*/if(name[j]=='/')s=j;/*分离目录路径*/for(j=0;j<s;j++)pathname[j]=name[j];pathname[j]='\0';/*分离目录名*/for(k=0,j=s+1;name[j]!='\0'&&k<3&&name[j]!='.';j++,k++)dname[k]=name[j];if(k==0){printf("错误文件名或目录名\n");return(false); //P180}for(;k<3;k++)dname[k]=' ';if((d=search(pathname,8,&dn,&bn))==false)/*找到目录路径*/{printf("目录不存在,不能建立\n");return(false);}b=-1;/*确认该目录不存在的同时查找空目录项*/fseek(fc,d*64L,SEEK_SET);fread(buffer2,64L,1,fc);/*读出d盘块的内容*/for(t=0;t<8;t++){if(buffer2[t].name[0]==dname[0]&&buffer2[t].name[1]==dname[1]&&buffer2[t].name[2]==dname[2]&&buffer2[t].attribute==8){/*找到名字dname的目录,建立失败*/printf("目录已经存在,不能建立\n");return(false);}if(buffer2[t].name[0]=='$'&&b==-1)b=t;}/*for*/if(b==-1)/*没有空目录项,不能建立*/{printf("目录无空间\n");return(false);}if((dd=allocate( ))==false)/*分配给建立目录的磁盘盘块dd*/{printf("目录不能建立\n");return(false);}/*填写目录项*/for(i=0;i<3;i++)buffer2[b].name[i]=dname[i];buffer2[b].type[0]=buffer2[b].type[1]=' ';buffer2[b].attribute=8;buffer2[b].address=dd;buffer2[b].length=0;fseek(fc,d*64L,SEEK_SET);fwrite(buffer2,64L,1,fc);/*分给新建目录的盘块初始化*/for(t=0;t<8;t++)buffer2[t].name[0]='$';fseek(fc, dd*64L, SEEK_SET);fwrite(buffer2,64L,1,fc);}/*建立目录结束*/int dir(char *name)/*显示目录内容*///char *name;{int t,dnum,dn,bn;if((dnum=search(name,8,&dn,&bn))==false)/*找到目录路径,返回该目录所在块号dn和盘块内项数bn*/{printf("目录不存在\n");return(false);}printf("名称扩展名起始盘块长度\n"); //P181/*显示目录内容*/fseek(fc,dnum*64L, SEEK_SET);fread(buffer2,64L,1,fc);for(t=0;t<8;t++)/*显示该盘块中目录项的内容*/if(buffer2[t].name[0]!='$')printf(" %c%c%c %c%c %4d%7d\n", buffer2[t].name[0],buffer2[t].name[1],buffer2[t].name[2], buffer2[t].type[0],buffer2[t].type[1],buffer2[t].address, buffer2[t].length);}/*显示目录函数结束*/char typefile(char *name)/*显示文件内容*///char *name;{int dnum,dn,bn,t;if((dnum=search(name,1,&dn,&bn))==false){printf("文件不存在\n");return(false);}if(sopen(name)!=-1){printf("该文件打开,不能显示\n");return(false);}while(dnum!='\xff'){fseek(fc,dnum*64L,SEEK_SET);fread(buffer1,64,1,fc);/*读一个盘块到缓冲*/for(t=0;t<64&&buffer1[t]!='#';t++)/*显示缓冲中内容*/putchar(buffer1[t]);printf("\n");/*获得下一个盘块*/fseek(fc, dnum/64*64L, SEEK_SET);fread(buffer1,64,1,fc);dnum=buffer1[dnum%64];}}/*显示文件函数结束*/int change(char *name,int attribute)/*改变文件name的属性为attribute*///char *name;//int attribute;{int dnum,bnum;if(search(name,1,&dnum,&bnum)==false)/*查找文件目录*/{printf("文件不存在\n");return(false);}if(sopen(name)!=-1) //P182{printf("该文件打开,不能改变文件属性\n");return(false);}fseek(fc,dnum*64L,SEEK_SET);fread(buffer2,64,1,fc);/*读出该目录所在盘块*/buffer2[bnum].attribute=attribute;/*修改属性*/fseek(fc,dnum*64L,SEEK_SET);fwrite(buffer2,64,1,fc);/*写回磁盘*/}/*改变文件属性函数结束*/int main( ){char name[20];//FILE*x1,*x2;//errno_t err;//char err;int attribute,type,length,i,a,j;char buffer[64];/*建立文件,模拟磁盘*/if((fc=fopen("c:\c","w+"))==NULL)//{printf("无法打开文件\n");exit(0);}/*初始化已打开文件表*/openfile.length=0;/*初始化磁盘*//*初始化文件分配表*/buffer1[0]=buffer1[1]=buffer1[2]=255;/*磁盘第0、1块存放FAT表,第2块存放跟目录*/for(i=3;i<64;i++)buffer1[i]=0;buffer1[13]=buffer1[49]=254;/*假定模拟磁盘中有两个坏盘块:第13块和49块*/ //P183fwrite(buffer1,64L,1,fc);for(i=0;i<64;i++)buffer1[i]=0;fwrite(buffer1,64L,1,fc);/*初始化根目录*/for(i=0;i<8;i++)buffer2[i].name[0]='$';/*若目录项的第一个字符为“$”表示该目录项为空*/fwrite(buffer2,64L,1,fc);/*初始化已打开文件表*/while(1){printf("\n 0 - 结束\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~9):");scanf("%d",&a);switch(a){case 0: /*a=0程序结束*/fclose(fc);exit(0);case 1: /*a=1建立文件*/printf("输入文件路径名和文件属性(1-只读文件,3-只读系统文件,4-普通文件):");scanf("%s%d",name,&attribute);create_file(name,attribute); /*建立文件*/break;case 2: /*a=2打开文件*/printf("输入文件路径名和操作类型(0-读文件,1-写文件):");scanf("%s%d",name,&type);open_file(name,type); /*打开文件*/break;case 3: /*a=3读文件*/printf("输入文件路径名和读长度");scanf("%s%d",name,&length);read_file(name,length); /*读文件*/break;case 4: /*a=4写文件*/printf("输入文件路径名:");scanf("%s",name);printf("输入写的内容和和写长度");scanf("%s%d",buffer,&length);write_file(name,buffer,length); /*写文件*/break;case 5: /*a=5关闭文件*/ //P184printf("输入文件路径名");scanf("%s",name);close_file(name); /*关闭文件*/break;case 6: /*a=6删除文件*/printf("输入文件路径名");scanf("%s",name);Delete(name); /*删除文件*/break;case 7: /*a=7建立目录*/printf("输入目录路径名");scanf("%s",name);md(name); /*建立目录*/break;case 8: /*a=8显示目录*/printf("输入目录路径名");scanf("%s",name);dir(name); /*显示目录*/break;case 9: /*a=9显示文件*/printf("输入文件路径名");scanf("%s",name);typefile(name); /*显示文件*/break;case 10:/* a=10改变文件属性 */printf("输入文件路径名和文件属性(1-只读文件,3-只读系统文件,4-普通文件):");scanf("%s%d",name,&attribute);change(name,attribute);}/* switch */}/* while */}/*main( )结束*/ //P185六、结束语:通过对磁盘文件操作,使我了解了基本的磁盘文件的知识,再加上对程序流程的理解,更加明白了Windows对磁盘管理的方式,首先程序查找绝对路径名name,然后从name中分离出“/”后下一个目录(或文件名);若是文件,分离出类型名type,再进行之后的判断操作。
一、实训背景随着信息技术的飞速发展,数据存储需求日益增长,磁盘管理作为维护计算机系统稳定运行的重要环节,显得尤为重要。
为了提高我对磁盘管理的实际操作能力,我参加了本次磁盘管理实训,通过实际操作掌握了磁盘的基本管理方法。
二、实训目标1. 熟悉磁盘分区的基本概念和操作方法。
2. 掌握磁盘格式化、挂载、卸载等基本操作。
3. 了解磁盘性能优化方法。
4. 能够解决磁盘故障。
三、实训内容1. 磁盘分区(1)使用fdisk工具进行磁盘分区:首先,通过lsblk命令查看当前磁盘及分区表类型,确定分区管理工具。
然后,使用fdisk命令对系统当前磁盘进行分区。
进入fdisk交互工作模式,依次完成以下操作:查看当前磁盘的分区情况、创建新分区、设置分区大小、设置分区类型、写入分区表、退出fdisk。
(2)使用parted工具进行磁盘分区:通过parted命令查看磁盘分区表类型(MBR 或GPT),根据需要选择相应的分区工具。
进入parted交互工作模式,依次完成以下操作:查看磁盘分区表、创建新分区、设置分区大小、设置分区类型、写入分区表、退出parted。
2. 磁盘格式化使用mkfs命令对磁盘分区进行格式化。
根据需要选择相应的文件系统类型,如ext4、xfs等。
3. 磁盘挂载与卸载使用mount命令将磁盘分区挂载到文件系统中,使用umount命令卸载磁盘分区。
4. 磁盘性能优化(1)使用swap分区:在内存不足的情况下,使用swap分区可以释放内存,提高系统性能。
(2)调整文件系统参数:根据实际情况调整文件系统参数,如inode数量、块大小等。
(3)使用磁盘缓存:通过调整缓存参数,提高磁盘访问速度。
5. 磁盘故障处理(1)使用fsck命令检查文件系统错误:当文件系统出现问题时,使用fsck命令检查并修复错误。
(2)备份磁盘数据:定期备份磁盘数据,以防数据丢失。
(3)使用磁盘克隆工具:在磁盘出现故障时,使用磁盘克隆工具恢复数据。
实验一:磁盘管理和文件系统管理一、实验目的:掌握Windows Server 2003系统中的磁盘管理和文件系统管理,包括基本磁盘中分区的创建,动态磁盘中各种动态卷的创建及DFS的配置。
二、实验属性:验证型三、实验环境Pentium 550Hz以上的CPU;建议至少256MB的内存;建议硬盘至少2GB,并有1GB空闲空间。
四、实验内容磁盘的管理文件系统的管理五、实验步骤(一)、磁盘管理1、在虚拟机中再添加两块磁盘(问题1:在虚拟机中如何添加新的磁盘?)。
在server2003中,选择管理工具,计算机管理命令,展开存储,单击磁盘管理2、使用磁盘管理控制台,在基本磁盘中新建主磁盘分区、扩展磁盘分区和逻辑驱动器,并对已经创建好的分区做格式化、更改磁盘驱动器号及路径等几个操作。
(问题2:在一台基本磁盘中,最多可以创建几个主磁盘分区?问题3:将FAT32格式的分区转换为NTFS格式的完整命令是什么?)一台基本磁盘内最多可以有4个主磁盘分区。
将FAT32转换NTFS格式命令convert.exe.创建主磁盘分区:扩展磁盘分区:步骤类似主磁盘分区的创建。
逻辑驱动器:其余步骤基本类似主磁盘分区的创建。
3、将三块基本磁盘转换为动态磁盘。
(问题4:如何将基本磁盘转换为动态磁盘?问题5:什么样的磁盘由基本磁盘转换为动态磁盘后系统需要重新启动?)基本磁盘转换动态磁盘:首先关闭所有正在运行的应用程序,右击要升级的基本磁盘,在弹出的快捷菜单中选择转换到动态磁盘。
如果升级的基本磁盘中包括有系统磁盘分区或引导磁盘分区,则升级后需要重启计算机。
4、在动态磁盘中创建简单卷、扩展简单卷、创建跨区卷、扩展跨区卷、创建带区卷、镜像卷和RAID5卷,并对具有容错能力的卷尝试数据恢复操作,掌握各个卷的特点和工作原理。
(问题6:哪些卷可以扩展?问题7:哪些卷具有容错功能?问题8:哪个卷可以包含系统卷?问题9:哪些卷需要跨越多个磁盘?问题10:哪个卷至少需要3块磁盘?)简单卷、NTFS格式的跨区卷,可以扩展。
一、实验目的本次实验旨在使学生掌握磁盘管理的基本原理和方法,熟悉Linux操作系统中磁盘管理的常用命令和工具,了解磁盘分区、格式化、挂载等操作,提高学生在实际工作中处理磁盘问题的能力。
二、实验环境1. 操作系统:Linux Ubuntu 20.042. 硬件环境:虚拟机环境,至少一块硬盘3. 软件环境:fdisk、parted、mkfs、mount、df、du等磁盘管理工具三、实验内容1. 磁盘分区(1)使用fdisk命令创建磁盘分区首先,通过fdisk命令进入磁盘分区编辑模式,然后输入n创建新分区,选择分区类型(主分区或扩展分区),指定分区大小,最后输入t修改分区类型。
(2)使用parted命令创建磁盘分区parted命令可以用于创建、删除、修改磁盘分区。
首先,通过parted命令进入磁盘分区编辑模式,然后输入mkpart创建新分区,指定分区类型、大小和文件系统。
2. 磁盘格式化使用mkfs命令对磁盘分区进行格式化,指定分区类型(如ext4、ext3、ext2、fat32等)。
3. 磁盘挂载使用mount命令将磁盘分区挂载到文件系统,指定挂载点。
4. 磁盘使用情况查看使用df命令查看磁盘使用情况,包括总空间、已用空间、可用空间等信息。
5. 磁盘空间占用情况查看使用du命令查看文件或目录占用空间大小。
6. 磁盘配额设置使用quota命令设置磁盘配额,限制用户或用户组在磁盘上的使用量。
7. 逻辑盘配置使用lvm(逻辑卷管理)工具配置逻辑盘,包括创建物理卷、卷组、逻辑卷,以及拓展和缩小逻辑卷的大小。
四、实验步骤1. 创建磁盘分区首先,使用fdisk命令创建磁盘分区,然后使用parted命令创建磁盘分区。
2. 格式化磁盘分区使用mkfs命令对磁盘分区进行格式化,指定分区类型。
3. 挂载磁盘分区使用mount命令将磁盘分区挂载到文件系统,指定挂载点。
4. 查看磁盘使用情况使用df命令查看磁盘使用情况。
5. 查看磁盘空间占用情况使用du命令查看文件或目录占用空间大小。
Linux磁盘和⽂件系统管理⽂件实验1、添加 10G 硬盘,为硬盘分三个分区:分区1:1G ext4 挂载⾄ /part-ext4分区2:2G xfs 挂载⾄ /part-xfs分区3:2G swap (代码82)分别设置分区1,分区2 可以开机⾃动挂载,启⽤swap分区3[root@localhost ~]# fdisk -lDisk /dev/sdb: 10.7 GB, 10737418240 bytes, 20971520 sectorsUnits = sectors of 1 * 512 = 512 bytesSector size (logical/physical): 512 bytes / 512 bytesI/O size (minimum/optimal): 512 bytes / 512 bytes[root@localhost ~]# mkdir /part-ext4[root@localhost ~]# mkdir /part-xfs[root@localhost ~]# mkfs.ext4 /dev/sdb1[root@localhost ~]# mkfs.xfs /dev/sdb2[root@localhost ~]# vim /etc/fstab[root@localhost ~]# mkswap /dev/sdb32、创建⼀个逻辑分区 /dev/sdb5 分区5:2G配置 autofs ⾃动挂载⾄⽬录 /autodir/test 并设置⽬录20秒不被使⽤时⾃动卸载[root@localhost ~]# mkfs.xfs /dev/sdb5[root@localhost ~]# vim /etc/auto.master/autodir /etc/auto.misc --timeout=20[root@localhost ~]# vim /etc/auto.misctest -fstype=xfs :/dev/sdb5[root@localhost ~]# systemctl start autofs[root@localhost ~]# systemctl enable autofs3、将 Centos 7 光盘制作成 iso 镜像⽂件,并将镜像⽂件挂载⾄ /dvd ⽬录[root@localhost ~]# useradd li[root@localhost ~]# dd if=/dev/cdrom of=/root/centos7.iso[root@localhost ~]# mkdir /dvd[root@localhost ~]# mount -o loop centos7.iso /dvd4、为 /part-ext4 ⽬录配置磁盘配额,设置⽤户 li 的磁盘软配额为 8M 硬配额为 10Mi节点软配额 2 硬配额 3 ,并经过验证[root@localhost ~]# cd /part-ext4[root@localhost part-ext4]# quotacheck -avug[root@localhost part-ext4]# lsaquota.group er lost+found[root@localhost part-xfs]# cd /part-ext4[root@localhost part-ext4]# edquota -u li[root@localhost part-ext4]# chmod 1777 /part-ext4/[root@localhost part-ext4]# quotaon /part-ext4/5、为 /part-xfs ⽬录配置磁盘配额,设置⽤户 li 的磁盘软配额为 20M 硬配额为 30Mi节点软配额 2 硬配额 3,并经过验证[root@localhost ~]# xfs_quota -x -c 'limit bsoft=20M bhard=30M isoft=2 ihard=3 li' /part-xfs/[root@localhost ~]# xfs_quota -x -c report /part-xfs/[root@localhost ~]# chmod 1777 /part-xfs/测试[root@localhost ~]# su - li[li@localhost part-ext4]$ dd if=/dev/zero of=/part-ext4/kk bs=1M count=9sdb1: warning, user block quota exceeded.9+0 records in9+0 records out9437184 bytes (9.4 MB) copied, 0.13922 s, 67.8 MB/s[li@localhost part-ext4]$ dd if=/dev/zero of=/part-ext4/kk2 bs=1M count=2 sdb1: write failed, user block limit reached.dd: error writing ‘/part-ext4/kk2’: Disk quota exceeded2+0 records in1+0 records out1048576 bytes (1.0 MB) copied, 0.0142495 s, 73.6 MB/s[li@localhost part-ext4]$ lltotal 10272-rw-------. 1 root root 7168 Oct 29 15:03 aquota.group-rw-------. 1 root root 7168 Oct 29 15:14 er-rw-rw-r--. 1 li li 9437184 Oct 29 15:25 kk-rw-rw-r--. 1 li li 1048576 Oct 29 15:26 kk2drwx------. 2 root root 16384 Oct 29 14:19 lost+found[li@localhost ~]$ cd /part-xfs[li@localhost part-xfs]$ dd if=/dev/zero of=/part-xfs/aa bs=1M count=29 29+0 records in29+0 records out30408704 bytes (30 MB) copied, 0.313577 s, 97.0 MB/s[li@localhost part-xfs]$ dd if=/dev/zero of=/part-xfs/aa1 bs=1M count=2 dd: error writing ‘/part-xfs/aa1’: Disk quota exceeded2+0 records in1+0 records out1048576 bytes (1.0 MB) copied, 0.0120921 s, 86.7 MB/s[li@localhost part-xfs]$ dd if=/dev/zero of=/part-xfs/aa2 bs=1M count=2 dd: failed to open ‘/part-xfs/aa2’: Disk quota exceeded[li@localhost part-xfs]$ lltotal 30720-rw-rw-r--. 1 li li 30408704 Oct 29 15:27 aa-rw-rw-r--. 1 li li 1048576 Oct 29 15:27 aa1。
磁盘管理实验报告磁盘管理实验报告一、引言磁盘管理是计算机操作系统中的重要组成部分,它负责管理磁盘上的文件存储和访问。
在本次实验中,我们将通过模拟磁盘管理的过程,探索不同的磁盘调度算法对系统性能的影响。
本报告将介绍实验的背景和目的,并详细讨论实验过程和结果。
二、实验背景和目的磁盘是计算机中常用的存储设备之一,它将数据以磁场的形式存储在磁道上。
磁盘的读写速度较慢,而且在多个进程同时访问磁盘时容易出现冲突。
因此,磁盘管理的优化对于提高系统的性能至关重要。
本次实验的目的是通过模拟不同的磁盘调度算法,比较它们在不同场景下的性能差异。
我们将使用C语言编写模拟程序,通过生成随机的磁盘请求序列,并使用不同的磁盘调度算法进行处理。
通过比较不同算法的平均寻道时间、平均旋转延迟和平均传输时间等指标,评估算法的优劣。
三、实验过程实验的第一步是编写模拟程序,我们使用C语言实现了一个简单的磁盘调度模拟器。
该模拟器可以生成指定数量的磁盘请求,并使用不同的磁盘调度算法进行处理。
我们实现了以下几种磁盘调度算法:1. 先来先服务(FCFS):按照请求的到达顺序进行处理。
2. 最短寻道时间优先(SSTF):选择离当前磁道最近的请求进行处理。
3. 扫描算法(SCAN):按照一个方向进行扫描,直到最边缘,然后改变方向继4. 循环扫描算法(C-SCAN):类似于SCAN算法,但是当到达最边缘时,直接返回到最开始的磁道。
5. 电梯算法(LOOK):类似于SCAN算法,但是当到达最边缘时,改变方向继续扫描。
在模拟程序中,我们使用随机数生成器生成了1000个磁盘请求,并分别使用以上算法进行处理。
在每次处理完一个请求后,我们记录下当前的磁道位置,并计算出寻道时间、旋转延迟和传输时间。
最后,我们计算出每种算法的平均寻道时间、平均旋转延迟和平均传输时间,并进行对比分析。
四、实验结果和分析根据实验结果,我们得到了每种算法的平均寻道时间、平均旋转延迟和平均传输时间。
制作LVM卷的步骤:
裸设备---分区---PV---VG---LV---格式化---挂载使用
[root@localhost ~]# pvcreate /dev/sdb1 /dev/sdc1 建立pv物理卷
Physical volume "/dev/sdb1" successfully created
Physical volume "/dev/sdc1" successfully created
[root@localhost ~]# vgcreate hehe /dev/sdb1 /dev/sdc1 建立vg卷组
Volume group "hehe" successfully created
[root@localhost ~]# lvcreate -L 30G -n xixi hehe 建立lv逻辑卷
Logical volume "xixi" created
[root@localhost ~]# mkfs.ext3 /dev/hehe/xixi 格式化为ext3的文件系统mke2fs 1.39 (29-May-2006)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
[root@localhost ~]# mkdir /lvm 创建lvm文件夹
[root@localhost ~]# mount /dev/hehe/xixi /lvm 挂载lvm逻辑卷到lvm文件夹下使用[root@localhost ~]# cd /lvm 切换
[root@localhost lvm]# ls 查看
lost+found
[root@localhost lvm]# df -hT 查看磁盘使用情况
文件系统类型容量已用可用已用% 挂载点
/dev/mapper/VolGroup00-LogVol00
ext3 38G 3.1G 33G 9% /
/dev/sda1 ext3 99M 11M 83M 12% /boot
tmpfs tmpfs 177M 0 177M 0% /dev/shm
/dev/mapper/hehe-xixi
ext3 30G 173M 28G 1% /lvm
[root@localhost lvm]# lvextend -L +3G /dev/hehe/xixi 扩展lvm卷的空间Extending logical volume xixi to 33.00 GB
Logical volume xixi successfully resized
[root@localhost lvm]# resize2fs /dev/hehe/xixi 重新识别文件系统的大小
resize2fs 1.39 (29-May-2006)
Filesystem at /dev/hehe/xixi is mounted on /lvm; on-line resizing required
Performing an on-line resize of /dev/hehe/xixi to 8650752 (4k) blocks.
The filesystem on /dev/hehe/xixi is now 8650752 blocks long.
制作磁盘配额的步骤:
分区(LVM逻辑卷)---添加配额功能----生成配额文件---编辑配额设置---启动配额功能---验证配额功能---查看使用情况
[root@localhost lvm]# mount -o remount,usrquota,grpquota /dev/hehe/xixi /lvm 重新挂载以增加支持配额功能
[root@localhost lvm]# mount
/dev/mapper/VolGroup00-LogVol00 on / type ext3 (rw)
proc on /proc type proc (rw)
sysfs on /sys type sysfs (rw)
devpts on /dev/pts type devpts (rw,gid=5,mode=620)
/dev/sda1 on /boot type ext3 (rw)
tmpfs on /dev/shm type tmpfs (rw)
none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)
none on /proc/fs/vmblock/mountPoint type vmblock (rw)
sunrpc on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw)
/dev/mapper/hehe-xixi on /lvm type ext3 (rw,usrquota,grpquota)
[root@localhost lvm]# vi /etc/fstab 编辑该文件开机自挂载
/dev/hehe/xixi /lvm etx3 defaults,ursquota,grpquota 0 0
[root@localhost lvm]# quotacheck -augcv 生成配额文件
quotacheck: Scanning /dev/mapper/hehe-xixi [/lvm] quotacheck: Cannot stat old user quota file: 没有那个文件或目录
quotacheck: Cannot stat old group quota file: 没有那个文件或目录
quotacheck: Cannot s
[root@localhost lvm]# cd /lvm 切换
[root@localhost lvm]# ls 查看
aquota.group er lost+found
[root@localhost lvm]# edquota -u gege 为用户gege设置配额
/dev/mapper/hehe-xixi 0 80000 10000 0 0 0
[root@localhost lvm]# quotaon -ugv /lvm 启用lvm文件系统的磁盘配额功能,并显示命令的执行过程信息
/dev/mapper/hehe-xixi [/lvm]: group quotas turned on
/dev/mapper/hehe-xixi [/lvm]: user quotas turned on
[root@localhost ~]# chmod 777 /lvm 修改lvm文件夹权限
[root@localhost ~]# su gege 切换为用户gege
[gege@localhost root]$ dd if=/dev/zero of=/lvm/2.txt bs=1M count=8 创建大小为8M的2.txt文件验证是否提示警告
dm-2: write failed, user block limit reached.
dd: 写入“/lvm/2.txt”: 超出磁盘限额
2+0 records in
1+0 records out
1835008 bytes (1.8 MB) copied, 0.0390995
[gege@localhost root]$ quota -u gege 查看用户gege的配额使用情况
Disk quotas for user gege (uid 500):
Filesystem blocks quota limit grace files quota limit grace
/dev/mapper/hehe-xixi
10000* 80000 10000 2 0 0。