版权归原作者所有,如有侵权,请联系我们

[科普中国]-UNIX文件系统

科学百科
原创
科学百科为用户提供权威科普内容,打造知识科普阵地
收藏

简介

Unix系统的产生和流行推动了操作系统的革命,它的设计思想和在发展过程中积累的丰富经验及教训仍可为人们借鉴。文件系统负责系统内文件信息的管理,在整个系统中起着至关重要的作用,文件系统是Unix成功的关键。Unix系统采用树形文件结构、内核与外核的结合、设备与文件一样的管理机制和使用方法等技术和措施,使得Unix文件系统成为当代非常优秀的系统1。

文件系统管理结构Unix文件系统是通过“磁盘索引i节点”、“目录项”来进行管理的,在文件被打开或被引用后还需要“内存索引i节点”、“用户文件描述表”、“文件表”。文件系统磁盘结构如图。管理块主要管理磁盘结构中各部分区域的大小及资源(i节点,磁盘块)的使用情况与管理方式。i节点区用于存放该文件系统全部磁盘i节点结构,磁盘索引节点包含文件的重要信息如下:文件所有者标识符;文件类型;文件存取许可权;文件联结数目;文件存取时间;文件长度;文件地址索引表。

Unix的每个目录项只存放文件名和i节点号,共16个字节,而文件中除名字以外的信息都存放到i节点中,优点是系统各级目录的规模大大减少。在Unix文件系统中,为了提高系统效率,减少内存空间的占用,当打开一个文件时,只是将与该文件相联系的目录项和磁盘i节点拷贝到主存中,为了对打开的文件进行管理,因此又设置了打开文件管理机构,它又由下列三部分组成:

1、活动i节点(内存i节点)。作用是反映文件当前活动的情况,因此它添加了一些项目:内存索引节点状态、设备号、索引节点号、内存索引节点的访问计数。

2、打开文件表。i节点中只包含有文件的静态信息,但当一个文件被同一进程或不同进程、用同一或不同路径名、相同的或互异操作同时打开时,仅靠i节点就不能满足要求,因此,打开文件表记录了打开文件所需的一些附加信息:读写状态、引用计数、指向内存索引点的指针、读/写位置指针。

3、用户文件描述符表。每个用户进程有一个用户文件描述符表,每一个表项就是一个指针,并指向打开文件表的一个表项,这个表的作用就是保证每个进程能够打开多个文件,或者对同一个文件以不同形式操作打开。假定一个进程执行下列代码:

fd1= open(”/etc/pad”,O- RDONLY);

fd1= open(”/etc/pad”,O- RDWD);

则这三个表的作用和关系如图所示

文件的物理结构Unix文件系统采用的是索引文件结构,在索引节点中建立有13个地址项,如图

对于长度不超过10个物理块的小型文件,可直接找到该文件所在的盘块号;对于中、大型文件采用一次或两次间接寻址;对超大型文件采用三次间接寻址。索引节点的优点是:索引节点占用的空间小,对小文件的索引速度快,同时又允许组织大型和超大型文件。文件最多可占用的物理块数可达到10+ 256+256^2+ 256^3个。

Unix的统计数据表明,80%为小文件,20%为大文件(其中1%为超大文件),这组数据就更加说明了Unix文件系统设计的精妙和科学。为了提高磁盘空间的利用率,允许文件在磁盘上不连续存放,且其寻址方式最多可达到三次。它的缺点是造成访问文件的寻道时间延长和多次访问磁盘。在非实时场合是可行的,但在实时场合,它的这一缺点就很突出。例如:假设磁盘的平均寻道时间为15ms,每个磁盘块的大小为512字节,某文件大小为3kB,如果连续存放,寻道时间只需15ms;如果不连续存放,它要占用6个分散的磁盘块,可能位于不同的磁道,因此寻道时间需90ms,比连续存放多浪费75ms。

空闲磁盘块的管理Unix文件系统通过管理块来实现空闲块管理。管理块的数据结构如下:

struct filsys{ int s- isize; /*i节点区总块数*/ int s- fsize; /*文件卷总块数*/ int s- nfree; /*直接管理的空闲块数*/ int s- free[100] ; /*空闲块号栈*/ int s- ninode; /*直接管理的空闲i节点数*/ int s- inode[100] ;/*空闲i节点号栈*/… …} 空闲块的管理方法是:将空闲块从后向前,若干个空闲块(如100个)分为一组(最后一组为99块),每组最后一块作为索引表,用来登记下一组100的物理块号和块数,最前的一组物理块号和块数存放在管理块的s_free[100]和s_nfree中。这种对空闲块先分组,再把组与组进行链接的管理方法称为组链接法。对空闲块的分配和释放类似于栈,使用后进先出算法。但其管理机构分为两级,一级常驻内存(管理块的s-nfree和s-free[]),另一级则驻在各组的第一个盘块上。其优点是常驻内存的只有一个组,而不是将所有组的空闲表都调入内存,这样就大大的节省了内存空间,同时软件开销也小。缺点是可能导致物理块的利用率不均匀。例如:假设当前的s-nfree= 80,此时某进程释放一个文件块,其占用的物理块号为300,系统回收它后,s-nfree= 81,s-free[81]= 300。接着某用户又申请物理空间,文件系统总是从索引表中取最后一项的值,即s-free[81]出栈,将300号物理块又立即分配使用。可以想象,300号块还会面临再释放,再分配的可能。300号块多次被使用,而其它空闲块却未被分配使用,即有些物理块可能长期被使用,而有些物理块可能长期得不到使用,因此对外存储器的使用寿命不利。

文件的目录结构和共享Unix的文件系统采用多级树型目录结构,其优点是有效的解决了文件重名问题,又可以很方便地实现文件共享。基本文件系统和子文件系统是可安装和可拆卸的,但在多用户环境下,多用户间共享数据同样感到不方便,绝对路径名是文件的唯一符号名,用户难以用另外符号名使用共享文件,因此Uinx文件又提供了如下两种链接机制。

1、硬链接技术。如果想为文件1.c建立一个硬链接2.c,则只需将2.c的目录项指针指到文件1.c的i节点,同时将i节点链接数加1即可。这样用户似乎是增加了一个物理拷贝,可实际却只有一个文件实体,当删除链接时,只要删除一个目录项和将链接数减1。

2、符号链接技术。如果想为usr/sxk/1.c建立一个符合链接2.c,则Unix通过read link读出文件内容,即找到原文件路径名,再通过原文件路径名去打开文件。符号链接相当于给文件增加了一个别名。也可为目录建立符号链接,并且可以跨文件系统。Unix文件链接的优点是用很小的开销为多用户共享文件提供了有效方式,且能快速定位文件和目录;缺点是对多用户使用文件不能加以并发控制,易造成数据的不一致性。硬链接只适用于普通文件,而不适用于目录文件和不同文件系统。

文件系统的安全性Unix是多用户操作系统,且它的各种外围设备都由相应的文件表示,因此安全性就很重要,它的安全主要通过磁盘i节点的权限设置来实现,每个Unix文件和Unix目录,都有3个允许的比特位设置,分别定义文件所有者、分组和其他人的使用权限,如:允许读、允许写、允许执行、允许SUID、允许SGID等,系统对文件保护的支持是比较充分的,只要正确设置文件和目录的权限,文件安全是有保障的。但需要注意的是,权限为SGID和SUID的可执行文件。SGID(SUID)中的S指set,程序在运行时,其进程的EUID(Effective UserID)或EGID(Effective Group ID)会被设成文件拥有者的UID、GID,从而进程也具有了Owner或OwnerGroup的权限。因此,如果使用不当,SGID和SUID程序会给系统安全性带来极大的危害。另外,在Unix系统中还应当留意设备文件,谨防它成为不安全的后门。例如,如果某个用户拥有/dev/lmem的读写权限,他就可以使用debugger(或其它程序)修改优先级或其它属性,也可以读取系统缓冲区的数据。Unix中的日志文件能够记录操作系统的使用状况,通过分析日志文件可以发现攻击迹象。