文件共享
在现代计算机系统中,必须提供文件共享手段,即指系统应允许多个用户(进程)共享同一份文件。这样,在系统中只需保留该共享文件的一份副本。如果系统不能提供文件共享功能,就意味着凡是需要该文件的用户,都须各自备有此文件的副本,显然这会造成对存储空间的极大浪费。
随着计算机技术的发展,文件共享的范围也在不断扩大,从单机系统中的共享,扩展为多机系统的共享,进而又扩展为计算机网络范围的共享,甚至实现全世界的文件共享。
早在20世纪的60和70年代,已经出现了不少实现文件共享的方法,如绕弯路法、连访法,以及利用基本文件实现文件共享的方法;而现代的一些文件共享方法,也是在早期这些方法的基础上发展起来的。下面我们仅介绍当前常用的两种文件共享方法,它们是在树形结构目录的基础上经适当修改形成的。
基于有向无循环图实现文件共享(硬链接)
有向无循环图DAG(Directed Acyclic Graph)
在严格的树形结构目录中,每个文件只允许有一个父目录,父目录可以有效地拥有该文件,其它用户要想访问它,必须经过其属主目录来访问该文件。这就是说,对文件的共享是不对称的,或者说,树形结构目录是不适合文件共享的。如果允许一个文件可以有多个父目录,即有多个属于不同用户的多个目录,同时指向同一个文件,这样虽会破坏树的特性,但这些用户可用对称的方式实现文件共享,而不必再通过其属主目录来访问。
上图展示出了一个有向无循环图,它允许每一个文件都可以有多个父目录。如图中的
文件F8有三个父目录,它们分别是D5、D6和D3,其中D5和D3还使用了相同的名字p,目录D6有两个父目录D2和D1。
由上所述得知,当有多个用户要共享一个子目录或文件时,必须将共享文件或子目录链接到多个用户的父目录中,才能方便地找到该文件。现在的问题是,如何建立父目录D5
与共享文件F8之间的链接呢?
如果在文件目录中所包含的是文件的物理地址,即文件所在盘块的盘块号,则在链接时,必须将文件的物理地址拷贝到D5目录中去。但如果以后D5或D6还要继续向该文件中添加新内容,也必然要相应地再增加新的盘块,这些是由附加操作Append 来完成的。而这些新增加的盘块也只会出现在执行了操作的目录中。
可见, 这种变化对其他用户而言,是不可见的,因而新增加的这部分内容已不能被共享。
利用索引结点
为了解决这个问题,可以引用索引结点,即诸如文件的物理地址及其它的文件属性等信息,不再是放在目录项中,而是放在索引结点中。在文件目录中只设置文件名及指向相应索引结点的指针,如下图所示。
图中的用户Wang和Lee的文件目录中,都设置有指向共享文件的索引结点指针。此时,由任何用户对共享文件所进
行的Append操作或修改,都将引起其相应结点内容的改变(例如,增加了新的盘块号和文件长度等),这些改变是其他用户可见的,从而也就能提供给其他用户来共享。
在索引结点中还应有一个链接计数count,用于表示链接到本索引结点(亦即文件)上的用户目录项的数目。当count=3 时,表示有三个用户目录项连接到本文件上,或者说是有
三个用户共享此文件。
当用户C创建一个新文件时,他便是该文件的所有者,此时将count置1。当有用户B要共享此文件时,在用户B的目录中增加一目录项,并设置一指针指向该文件的索引结点,
此时,文件主仍然是C,count=2。如果用户C不再需要此文件,是否能将此文件删除呢?回答是否定的。因为,若删除了该文件,也必然删除了该文件的索引结点,这样便会使B的指针悬空,而B则可能正在此文件上执行写操作,此时将因此半途而废。但如果C不删除此文件而等待B继续使用,这样,由于文件主是C,如果系统要记账收费,则C必须为B
使用此共享文件而付账,直至B不再需要。下图展示出了B链接到文件前后的情况。
ln命令可以创建硬链接:
ln 源文件 目标文件
这里顺便说一下目录文件的”链接数”。创建目录时,默认会生成两个目录项:”.”和”..”。前者的inode号码就是当前目录的inode号码,等同于当前目录的”硬链接”;后者的inode号码就是当前目录的父目录的inode号码,等同于父目录的”硬链接”。所以,任何一个目录的”硬链接”总数,总是等于2加上它的子目录总数(含隐藏目录)。
基于符号链的共享方式(软链接)
符号链接基本思想
利用符号链接实现文件共享的基本思想,是允许一个文件或子目录有多个父目录,但其中仅有一个作为主(属主)父目录,其它的几个父目录都是通过符号链接方式与之相链接的(简称链接父目录)。
当访问“c”时,操作系统判断文件“c”属于Link 类型文件,于是会根据其中记录的路径层层查找目录,最终找到目录表1中的“a”表项,于是就找到了文件1的索引结点。
符号链接实现共享的优点
在利用符号链方式实现文件共享时,只是文件主才拥有指向其索引结点的指针;而共享该文件的其他用户则只有该文件的路径名,并不拥有指向其索引结点的指针。这样,也就不会发生在文件主删除一共享文件后留下一悬空指针的情况。当文件的拥有者把一个共享文件删除后,如果其他用户又试图通过符号链去访问一个已被删除的共享文件,则会因系统找不到该文件而使访问失败,于是再将符号链删除,此时不会产生任何影响。
值得一提的是,在计算机网络中,Web浏览器在进行浏览时所使用的文件是HTML类型的文件。在HTML文件中有着许多链接符,通过这些链接符能够链接(通过计算机网络)
世界上任何地方的机器中的文件。在利用符号链实现共享时,同样可以通过网络链接到分布在世界各地的计算机系统中的文件。
< a href=”url”>链接文本</ a>
ln -s命令可以创建软链接:
ln -s 源文文件或目录 目标文件或目录
小结
文件系统的安全性
安全性两个方面
确保未经授权的用户不能存取某些文件。涉及到技术、管理、法律、道德和政治等问题。
安全性的两个重要方面:
- 数据丢失。
- 灾难
- 硬件或软件故障
- 人的失误。可通过磁盘容错技术和备份(存放在另一处)来解决。
- 入侵者。(积极的或消极的)
- 非技术人员的偶然窥视
- 入侵者的窥视
- 明确的偷窃企图
- 商业或军事间谍活动
设计安全时要考虑是那一类入侵者.
文件的保护机制
(1) 文件保护
用于提供安全性的特定的操作系统机制。
(有权限的用户, 应让其进行相应操作, 否则, 应禁止)
实现:用户验证、存取控制
(2) 用户验证
用户登录, 检验其身份
口令
物理鉴定
磁卡,指纹,签名分析,手指长度分析
(3) 存取控制
审查用户的权限
审查本次操作的合法性
为了确保文件系统的安全性,可针对上述原因而采取以
下措施:
(1)通过存取控制机制来防止由人为因素所造成的文件
不安全性。
(2)通过磁盘容错技术来防止由磁盘部分的故障所造成
的文件不安全性。
(3)通过“后备系统”来防止由自然因素所造成的不安
全性。
接下来我们主要看一下第二方面磁盘容错技术。
第一级 磁盘容错技术SFT-1
第一级容错技术(SFT- I )是最基本的一种磁盘容错技术,主要用于防止因磁盘表面缺陷所造成的数据丢失。它包含双份目录、双份文件分配表及写后读校验等措施。
双份目录和双份文件分配表
在磁盘上存放的文件目录和文件分配表FAT,是文件管
理所用的重要数据结构。
为了防止这些表格被破坏,可在不
同的磁盘上或在磁盘的不同区域中,分别建立(双份)目录表
和FAT。
其中一份为主目录及主FAT;另一份为备份目录及备
份FAT。一但由于磁盘表面缺陷而造成主文件目录或主FAT的
损坏时,系统便自动启用备份文件目录及备份FAT,从而可
以保证磁盘上的数据仍是可访问的。
热修复重定向和写后读校验
由于磁盘价格昂贵,当磁盘表面有少量缺陷时,则可采取某种补救措施后继续使用磁盘。一般主要采取以下两个补救措施:
热修复重定向:系统将磁盘容量的一部分(例如
2%~ 3%)作为热修复重定向区,用于存放当发现磁盘有缺
陷时的待写数据,并对写入该区的所有数据进行登记,以
便于以后对数据进行访问。写后读校验方式。
为了保证所有写入磁盘的数据都能写入到完好的盘块中,应该在每次从内存缓冲区向磁盘中写入一个数据块后,又立即从磁盘上读出该数据块,并送至另缓冲区中,再将该缓冲区内容与内存缓冲区中在写后仍保留的数据进行比较。若两者一致,便认为此次写入成功, 可继续写下一一个盘块;否则,再重写。若重写后两者仍不一致,
则认为该盘块有缺陷,此时,便将应写入该盘块的数据,写
入到热修复重定向区中。
第二级磁盘容错技术SFT-2
磁盘镜像-两个磁盘驱动器互为备份
为了避免磁盘驱动器发生故障而丢失数据,便增设了磁盘镜像功能。为实现该功能,须在同一磁盘控制器下再增设一个完全相同的磁盘驱动器,如图所示。当采用磁盘镜像方式时,在每次向主磁盘写入数据后,都需要将数据再写到备份磁盘上,使两个磁盘上具有完全相同的位像图。
把备份磁盘看作是主磁盘的一面镜子,当主磁盘驱动器发生故障
时,由于有备份磁盘的存在,在进行切换后,使主机仍能正常工作。磁盘镜像虽然实现了容错功能,但未能使服务器的磁盘I/O速度得到提高,却使磁盘的利用率降至仅为50%。
磁盘双工(Disk Duplexing)
如果控制这两台磁盘驱动器的磁盘控制器发生故障,或主机到磁盘控制器之间的通道发生了故障,磁盘镜像功能便起不到数据保护的作用。
因此,在第二级容错技术中,又增加了磁盘双工功能,即将两台磁盘驱动器分别接到两个磁盘控制器上,同样使这两台磁盘机镜像成对,如图所示。在磁盘双工时,文件服务器同时将数据写到两个处于不同控制器下的磁盘上,使两者有完全相同的位像图。如果某个通道或控制器发生故障时,另一个通道上的磁盘仍能正常工作,不会造成数据的丢失。在磁盘双工时,由于每一个磁盘都有自己的独立通道,故可同时(并行)地将数据写入磁盘,或读出数据。
文件系统的数据一致性控制
同一数据存放在不同的文件中, 对它修改时应对不同的文件都统一修改, 才能保证数据的一致性。修改时数据的流向是, 磁盘块、内存、写回磁盘块。若在写回之前, 系统崩溃, 则文件系统数据出现不一致。
系统应配置保证数据一致性的软件和相应的硬件,硬件采取冗余技术配置一个高度可靠的存储系统, 称为稳定存储器; 目前广泛采用磁盘双工方式来实现稳定存储器。设计保证数据一致性的实用程序, 当系统再次启动时, 运行该程序, 检查磁盘块和目录系统。
事务定义
事务是用于访问和修改数据的一个程序单位, 由一系列相关的读写操作组成; 被访问的数据可以分散在不同位置, 只有一系列读写操作全部完成才能以托付操作(Commit Operation)终止操作; 而只要有一个操作失败就执行夭折操作(Abort Operation)。
为了保证数据的一致性, 对于夭折事务所操作过的数据必须恢复原来的状态, 使该事务退回(rolled back),保证一个事务对一批数据修改操作,要么全部完成要么 一个也不修改, 这种特性称事务的原子性。
事务记录
为了实现上述的原子修改,通常须借助于称为事务记录的数据结构来实现。这些数据结构被放在稳定存储器中,用来记录在事务运行时数据项修改的全部信息,故又称为运行记录(Log)。该记录中包括有下列字段:
事务名:用于标识该事务的惟一名字;
数据项名:指被修改数据项的惟一名字;
旧值:修改前数据项的值;
新值:修改后数据项将具有的值。
恢复算法
由于一组被事务Ti修改的数据以及它们被修改前和修改后的值都能在事务记录表中找到,因此,利用事务记录表, 系统能处理任何故障而不致使故障造成非易失性存储器中信 系统能处理任何故障而不致使故障造成非易失性存储器中信息的丢失。恢复算法可利用以下两个过程:
- undo〈Ti〉。
该过程把所有被事务Ti修改过的数据 恢复为修改前的值。 恢复为修改前的值。
- redo〈Ti〉。
该过程把所有被事务Ti修改过的数据设置为新值。
检查点
检查点的作用
使对为了对事务记录的清理工作经常化, 设置检查点记录; 每隔一定的时间做一次清理:
将内存中的当前事务记录表的所有记录, 和所有已修改的数据, 输出到稳定存储器中;
再将检查点记录输出到稳定存储器中;
每当出现一个检查点记录便执行恢复操作。
新的恢复算法
发生故障后,恢复算法只需对最后一个检查点之后的事务记录进行处理。
即从最后一个检查点之后的第一个事务记录开始,对所有的事务Tk , 在Log表中出现(Tk托付)记录则执行redo(Tk ), 未出现(Tk托付)记录则执行undo(Tk )。
并发控制
由于事务具有的原子性, 使得一个事务执行完后才允许另一事务执行, 即事务对数据项的修改是互斥的,事务的这种特性称为顺序性,将实现顺序性的技术称为并发控制。可以用互斥信号量来保证事务处理的顺序性,但用的最广的是“锁”。
利用互斥锁实现顺序性
设置一种用于实现互斥的锁, 简称互斥锁,为每一个共享对象设一把互斥锁, 如果事务 Ti 需要对一批对象进行访问,则为了保证事务操作的原子性, 应先获得这批对象的互斥锁, 将他们全部锁住, 如果成功便可以对这批对象执行读写操作,然后全部开锁, 若某对象已被其它事务锁住, 则Ti 要将已锁住的对象全部开锁。
重复数据的一致性问题
重复文件的一致性
以UNIX类型的文件系统为例,通常文件一个文件的目录项由一个文件名和一个索引结点号组成; 当有重复文件时, 一个文件的目录项由一个文件名和若干个索引结点号组成。保证重复文件的一致性用两种方法:
(1) 当一个文件被修改后,可查目录, 从各i结点找到各拷贝的物理位置, 对这些拷贝做同样修改。
(2) 为新修改的文件建立几个新拷贝取代原来的拷贝。
盘块号一致性的检查
两张表,每块对应一个表中的计数器,初值为0,正常情况下空闲块计数表与数据块计数表对应项的值应该是互补关系。
表一:记录了每块在空闲块表中出现的次数
表二:记录了每块在文件中出现的次数
链结数一致性的检查
在UNIX的文件目录中,索引结点中有一个链接计数 count, 它用来表示共享文件计数, 它应该和目录中指向该索引结点的数目一致。否则出错。
为检查不一致差错, 同样配置一张计数器表, 为每个文件建立一个表项, 检查时从根结点开始, 查找并计数,检查完后, 将计数器表的每个计数值与count 对比, 一致则正确, 否则发生链接数不一致差错。
count值大于计数表的计数值则该文件永远不会被删除;
count值小于计数表的计数值则该文件会被误删除;
这两种情况解决方法是将count值修改正确。