UNIX文件系统基础

个人觉得蛮给力的资料~怕遗失所以干脆转过来,废话不多说,正文开始!

原文地址:http://blog.163.com/qj_l12@126/blog/static/359308262008111851848314/

unix文件系统基础

2008-12-18 17:18:48| 分类: linux相关 | 标签: |字号 订阅

12.5.1 文件类型

UNIX系统中, 文件分为三类: 即普通文件、目录文件和特殊文件.

1. 普通文件

也称正文文件,可以用来保存程序、数据等任何信息. 这是一种无结构的, 以512个字节为一块, 顺序存取的流式文件.

2. 目录文件

用于检索文件的文件. 目录文件可能是系统文件, 也可能是用户文件.

3. 特殊文件

即设备. 在UNIX系统中将设备也作为文件来处理, 对于设备的所有操作都需要经过文件系统,

这有如下两个优点:

(1) 设备与文件界面统一:使用设备与使用文件没有差别. 具体地说, 打开一个设备文件相当于申请该设备, 关闭一个设备文件相当于释放该设备, 读写设备文件相当于对设备进行I/O操作.

(2) 设备可采用与文件相同的保护机制:文件可以访问权限等手段加以保护, 设备作为文件处理也可如同文件一样得到保护. 如对于打印机设备可规定为只“写”型设备, 对其实行“读”操作将被视为非法而加以拒绝.

将设备作为特殊文件管理是UNIX系统的成功特点之一,并被后来其它一些操作系统所借鉴.

12.5.2 文件体系

UNIX文件系统呈树形结构, 树的根结点为根目录root, 树的叶结点可以为普通文件、特殊文件、或者目录文件. 其它既非根结点也非叶结点的结点为目录文件. 如图 12-8 所示.

unix文件系统基础 - qj_l12@126 - lan_vivian的博客

  图中虚线代表链接(link),通过链接可以给一个文件赋予多个符号名(路径名),这是共享文件的一种方法.

12.5.3 文件结构

1. 文件的逻辑结构

UNIX普通文件的逻辑结构为流式的. 在用户看来, 一个文件是一个字节序列. 文件的读写操作命令包含传输字节的个数.这种结构实现简单, 系统开销小.当然, 如果需要, 用户可以利用流式文件来构造记录式文件, 因为对于文件内容的解释权完全留给了用户. 

2. 文件的物理结构

UNIX文件的物理结构为链接结构与索引结构的结合, 也可看成是多级索引结构.

其实现如图12-9所示.

unix文件系统基础 - qj_l12@126 - lan_vivian的博客

12.5.4 文件目录与连接

1. 目录项

相当于FCB次部,包括两个内容: 即文件名inode编号, 不同的文件名可能对应同一个inode编号, 这样便对应同一个FCB主部, 即一个文件可以有多个名字.

2. inode

相当于FCB主部, 包括文件主、共享说明、地址信息等, 称为inode, inode与文件具有一对一的关系. 在UNIX文件系统中, 有一个固定的区域, 用于保存所有文件的inode. 如图 12-10 所示. 每inode有一个唯一的编号,称为i_number.

unix文件系统基础 - qj_l12@126 - lan_vivian的博客

FCB分为两部分的目的之一是实现文件的连接,所谓连接实际是使多个目录项与同一个inode建立联系,从而可以通过不同的路径名查找到同一个文件,即使一个文件有多个符号名称. 例如对于图12-11(a)所示的目录树,经过连接后文件f增加了路径名/usr/Xu/d2/g,如图12-11(b)所示.二者具有相同的i_number(15),因而对应同一个inode.

unix文件系统基础 - qj_l12@126 - lan_vivian的博客

12.5.5 文件系统映射

文件打开时,控制信息被移入内存相关表目中,并通过文件描述符建立与文件内容之间的联系.

12-12给出了进程空间与u_ofile表、file表、inode表之间的连接关系,其中文件描述符4,6对应两个不同的文件,描述符10,2对应同一文件但不共享读写指针,描述符8,9对应同一文件且共享读写指针.

unix文件系统基础 - qj_l12@126 - lan_vivian的博客

完整的file结构定义如下:

5507 struct file

5508 {

5509 char f_flag; /* FREAD=01, FWRITE=02, FPIPE=04 */

5510 char f_count; /* reference count */

5511 int f_inode; /* pointer to inode structure */

5512 char *f_offset; /* read/write character pointer */

5513 }

12.5.6 文件卷的安装

用一个文件卷的根目录取代文件的一个普通文件. 这样一个文件卷可以动态地联结到文件系统中, 也可以动态地由文件系统中卸下. 文件卷的组织形式如图 12-13 所示. 其中块#0为引导块, 负责操作系统的装入; 块#1为特殊块, 记载磁盘块的分配状况; 由块#2到块#k+1为inode区域, 保存文FCB主部, 其k值在文件卷初始化时确定; 由块#k+2到块#n-1为一般块, 保存普通文件及目录文件的内容.

unix文件系统基础 - qj_l12@126 - lan_vivian的博客

其中引导块只对系统根文件卷才是有意义的,它负责在系统启动时在磁盘上找UNIX系统并将其装入内存. 超级块(super block)是一个文件卷中最重要的数据结构,它记录本卷上inode块和一般块的分配状况,以及锁等标志信息

文件的变化(建立、撤销、写入等)一般都需要访问超级块以实现对inode块和一般块的管理. 文件卷卸下(unmount)时,若超级块在内存期间被修改,则需要写回外存. 实际上,这种回写每隔一段时间都需要执行一次,以防止意外,保证缓冲区内容与文件卷内容的一致性.

12.5.7 磁盘空间管理

UNIX空闲磁盘空间的管理采用了成组连接方式,它可看成是空闲块链与空闲块表的结合,涉及超级块(块号#1)中s_nfrees_free[100]和s_flock三个数据结构. s_free可记录多达100个空闲块号以及一个由连接块构成的成组连接链之链头, 而每个连接块中登记有多达100个空闲块号以及一个指向下一个连接块的指针;s_nfree是当前超级块中所记录的空闲块的个数;s_flock是互斥操作空闲块数据结构的锁标志. 如图 12-14 所示.

unix文件系统基础 - qj_l12@126 - lan_vivian的博客

12.5.8 inode区域管理

inode区中保持文件控制块的主部,对于第六版UNIX,一个inode32个字节,一个磁盘块长度为512字节,这样一块中可以保存16inode. 将inode区中所有inode0开始依次编号,称为i_numberi_numberinode的唯一标识,也是文件的唯一标识. 在inode中包含i_nlinki_nlink=0者为空inode.

filesys中与inode管理相关数据结构包括s_ninode, s_inodes_ilock. 其中s_inode可记录多达100个空inode的编号. 申请时,取s_inode[--s_ninode],当s_ninode=0时缓冲区中记录的空闲inode已经全部用完,此时顺序扫描inode区寻找100个空闲inode(i_nlink==0),并将其编号记录到s_inode. 释放时,执行s_inode[s_ninode++]=释放inode编号,当s_ninode==100时,丢弃该inode编号.

文件的inode长期保存在磁盘上,当文件被打开时,inode被缓冲到内存以提高存取速度. 内存中的inode与外存中的inode应当保持一致,当内存中inode 发生变化时应及时将其写回外存,具体回写时刻有三种情况:(1)文件关闭;(2)定时更新;(3)执行

其中i_mode为各种标志信息,低9位为访问权限,其它各位含义如图12-15所示,其中置uid位若为1且该文件为可执行文件,则执行该程序的进程其uid暂时改为文件主的uid.

unix文件系统基础 - qj_l12@126 - lan_vivian的博客

其中i_flag为标志位,内容包括互斥锁、修改位、访问位、安装标识、等待标志等,如图12-16所示.

unix文件系统基础 - qj_l12@126 - lan_vivian的博客

12.5.9 快速文件系统(Fast File System)

经典UNIX文件系统在设计方面是非常成功的,然而随着磁盘容量和文件长度的增加也显现出一些问题.

(1)首先UNIX文件卷将inode区与内容存储区相互分离,当查找一个较长的路径名时需要由inode区到内容存储区,再由内容存储区到inode区几次往复,对应磁头引臂在内外磁道的频繁运动.

(2)其次长度为512字节的磁盘块尺寸过小,对于稍长的文件就意味着I/O块间址,I/O效率低.

(3)另外长度为14字节的文件名分量也是一个苛刻的限制.

为克服经典UNIX文件系统的局限性,UC Berkeley提出了一种成为快速文件系统(Fast File System)的改进策略,这种改进使其效率提高一个数量级,目前已被用于大多数UNIX版本中,其中包括4.2BSD.

首先, FFS将磁盘卷划分为若干个柱面组(cylinder group),每个柱面组占若干连续的柱面,作为相对独立的文件卷管理,其中包含各自独立的超级块、inode区和数据块,如图12-16所示. 文件路径名中所涉及的分量,以及一个文件的所有磁盘块都局部在同一柱面组内,大大减小了inode区与数据块区之间的物理距离. 其中数据块被分散在柱面组的两端,进一步减小inode区到数据块区的磁头移动量. 在核心级别,系统通过二元组<逻辑设备号,inode>来识别一个文件.

unix文件系统基础 - qj_l12@126 - lan_vivian的博客

其次,FFS采用较大的磁盘块以减少I/O间址并提高I/O效率. 磁盘块的尺寸可达8k,这样对于长度为80k的文件不需间址,10次I/O传输即可全部读入内存. 对于没有间接块的文件,4.2BSD采用大小两种块尺寸:除最后一块外,一个文件所有其它块均为大块(如8k),而最后一块为1k的整数倍,称为片(fragment).

12.5.10 NFS网络文件系统

包括SunOSUNIX 4.2BSD),NFS已被所有现代UNIX系统所采用,成为目前最有影响的远程文件访问系统. 在逻辑结构上位NFS之上的虚拟文件系统VFS(Virtual File System)最初只是针对NFS而设置的,用于识别本地与远程文件访问,但现在VFS已支持多种不同的本地文件系统,成为UNIX文件系统的统一界面.

12.5.10.1 NFS体系结构

每个服务员可输出(export)一个或多个目录以供远程客户共享,被共享目录所属的子树亦被共享. 服务员输出的共享目录记载/etc/export文件中. 客户通过安装(mount)命令实现对目录的共享,被安装的目录成为其目录层次的组成部分.

unix文件系统基础 - qj_l12@126 - lan_vivian的博客

12.5.10.2 协议

由于NFS的目标是支持异构系统,客户和服务员可以处于不同操作系统平台和硬件环境中,定义两个协议,

(1)远程安装协议,不透明的;(2)远程存取协议,透明的.

远程安装协议用于建立客户与服务器之间的逻辑联系,服务器端export可以被远程安装的目录名以及允许安装的机器,需要给出:(a)远程待安装目录的路径命名;(b)远程机器名. 远程安装命令NFS映射到对应的RPC调用,经过网络传输到服务器,客户可以向服务器发送一个请求,将服务器上某一目录安装到顾客端指定目录.返回描述符.安装协议是不透明的,需要给出机器名称,这使NFS不是真正的分布式文件系统.

远程存取协议提供一套RPC调用,执行如下操作:

(1)查找目录下的文件;

(2)读取目录项目;

(3)操link与目录;

(4)存取文件属性;

(5)读写文件. 远程存取协议是透明的,与操作本地目录和文件相同.

NFS是无状态的(stateless):文件服务端并不在内存打开文件表中保持文件控制信息,为此每个文件操作命令必须是自包含的(self contained),即必须提供完整的参数集合.另外NFS不提供并发控制机制.

12.5.10.3 NFS实现

客户端VFS功能:

(1)识别本地文件与远程文件,对于远程文件,调NFS协议过程;

(2)对于本地文件,区分本地文件系统类型,并根据文件类型激活相应文件操作.

服务器端VFS功能:实现NFS协议,接受来自客户端的调用并将其传递给本地FS. 客户端与服务器端均由若干层次构成,如图12-19所示.

unix文件系统基础 - qj_l12@126 - lan_vivian的博客

对远程文件的操作映射过程如下:

(1)客户端通过系统调用发出访问请求;

(2)操作系统将其映射到对应vnode的一个VFS操作;

(3)VFS层鉴别为远程文件,调用NFS对应的过程;

(4)NFS向远程服务器发出RPC调用;

(5)远程服务器识别为本地文件,启用对应的文件操作;

(6)按相同路径将调用结果由服务器反向传给顾客.

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值