预计阅读本页时间:-
4.5 文件系统实例
在这一节,我们将讨论文件系统的几个实例,包括从相对简单的文件系统到十分复杂的文件系统。现代流行的UNIX文件系统和Windows Vista自带文件系统在本书的第10章和第11章有详细介绍,在此就不再讨论了。但是我们有必要来看看这些文件系统的前身。
4.5.1 CD-ROM文件系统
作为第一个文件系统实例,让我们来看看用于CD-ROM的文件系统。因为这些文件系统是为一次性写介质设计的,所以非常简单。例如,该文件系统不需要记录空闲块,这是因为一旦光盘生产出来后,CD-ROM上的文件就不能被删除或者创建了。下面我们来看看主要的CD-ROM文件系统类型以及对这个文件系统的两种扩展。
在CD-ROM出现一些年后,引进了CD-R(可记录CD)。不像CD-ROM,CD-R可以在初次刻录之后加文件,但只能简单地加在CD-R的最后面。文件不能删除(尽管可以更新目录来隐藏已存在的文件)。因而对于这种“只能添加”的文件系统,其基本的性质不会改变。特别地,所有的空闲空间放在了CD末端连续的一大块内。
广告:个人专属 VPN,独立 IP,无限流量,多机房切换,还可以屏蔽广告和恶意软件,每月最低仅 5 美元
1.ISO 9660文件系统
最普遍的一种CD-ROM文件系统的标准是1988年被采纳的名为ISO 9660的国际标准。实际上现在市场上的所有CD-ROM都支持这个标准,有的则带有一些扩展(下面会对此进行讨论)。这个标准的一个目标就是使CD-ROM独立于机器所采用的字节顺序和使用的操作系统,即在所有的机器上都是可读的。因此,在该文件系统上加上了一些限制,使得最弱的操作系统(如MS-DOS)也能读取该文件系统。
CD-ROM没有和磁盘一样的同心柱面,而是沿一个连续的螺旋线来顺序存储信息(当然,跨越螺旋线查找也是可能的)。螺旋上的位序列被划分成大小为2352字节的逻辑块(也称为逻辑扇区)。这些块有的用来进行引导,有的用来进行错误纠正或者其他一些用途。每个逻辑块的有效部分是2048字节。当用于存放音乐时,CD中有导入部分、导出部分以及轨道间的间隙,但是用于存储数据的CD-ROM则没有这些。通常,螺旋上的逻辑块是按分钟或者秒进行分配的。通过转换系数1秒=75块,则可以转换得到相应的线性块号。
ISO 9660支持的CD-ROM集可以有多达216 -1个CD。每个单独的CD-ROM还可分为多个逻辑卷(分区)。下面我们重点考虑单个没有分区CD-ROM时的ISO 9660。
每个CD-ROM有16块作为开始,这16块的用途在ISO 9660标准中没有定义。CD-ROM制造商可以在这一区域里放入引导程序,使计算机能够从CD-ROM引导,或者用于其他目的。接下来的一块存放基本卷描述符(primary volume descriptor),基本卷描述符包含了CD-ROM的一些基本信息。这些信息包括系统标识符(32字节)、卷标识符(32字节)、发布标识符(128字节)和数据预备标识符(128字节)。制造商可以在上面的几个域中填入需要的信息,但是为了跨平台的兼容性,不能使用大写字母、数字以及很少一部分标点符号。
基本卷描述符还包含了三个文件的名字,这三个文件分别用来存储概述、版权声明和文献信息。除此之外,还包含有一些关键数字信息,例如逻辑块的大小(通常为2048,但是在某些情况下可以是4096、8192或者更大)、CD-ROM所包含的块数目以及CD-ROM的创建日期和过期日期。基本卷描述符也包含了根目录的目录表项,说明根目录在CD-ROM的位置(即从哪一块开始)。从这个根目录,系统就能找到其他文件所在的位置。
除基本卷描述符之外,CD-ROM还包含有一个补充卷描述符(supplementary volume descriptor)。它和基本卷描述符包含类似的信息,在这里不再详细讨论。
根目录和所有的其他目录包含可变数目的目录项,目录中的最后一个目录项有一位用于标记该目录项是目录中的最后一个。目录项本身也是长度可变的。每一个目录项由10到12个域构成,其中一些域是ASCII域,另外一些是二进制数字域。二进制域被编码两次,一个用于低地址结尾格式(例如在Pentium上所用的),一个用于高地址结尾格式(例如在SPARC上所用的)。因此,一个16位的数字需要4个字节,一个32位的数字需要8个字节。
这样冗余编码的目的主要是为了能在标准发展的同时照顾到各个方面的利益。如果该标准仅规定低地址结尾,那么在产品中使用高地址结尾的厂家就会觉得自己受到歧视,就不会接受这个标准。所以我们可以准确地用冗余的字节/小时数来衡量一张CD-ROM的情感因素。
ISO 9660目录项的格式如图4-30所示。因为目录项是长度可变的,所以,第一个域就说明这一项的长度。这一字节被定义为高位在左,以避免混淆。

目录项可能包含有扩展属性。如果使用了这个特性,则第二个字节就说明扩展属性的长度。
接下来是文件本身的起始块。文件是以连续块的方式存储的,所以一个文件的位置完全可以由起始块的位置和大小来确定。起始块的下一个域就是文件大小。
CD-ROM的日期和时间被记录在下一个域中,其中分隔的字节分别表示年、月、日、小时、分钟、秒和时区。年份是从1900年开始计数的,这意味着CD-ROM将会遇到2156年问题,因为在2155年之后将会是1900年。如果定义初始的日期为1988年(标准通过的那一年)的话,那么这个问题就可以推迟88年产生,也就是2244年。
标志位域包含一些其他的位,包括一个用来在打开目录时隐藏目录项(来自MS-DOS的特性)的标志位,一个用以区分该项是文件还是目录的标志位,一个用以标志是否使用扩展属性的标志位,以及一个用来标志该项是否为目录中最后一项的标志位。其他一些标志位也在这个域中,但是在此我们不再讨论。下一个域说明了在ISO 9660的最简版本中是否使用文件分隔块,我们也不做讨论。
再下一个域标明了该文件放在哪一个CD-ROM上。一个CD-ROM的目录项可以引用在同一CD-ROM集中的另外一个CD-ROM上的文件。用这样的方法就可以在第一张CD-ROM上建立一个主目录,该主目录列出了在这个CD-ROM集合中的其他所有CD-ROM上的文件。
图4-30中标有L的域给出了文件名的大小(以字节为单位)。之后的域就是文件名本身。一个文件名由基本名、一个点、扩展名、分号和二进制版本号(1或2个字节)构成。基本名和扩展名可以使用大写字母、数字0~9和下划线。禁止使用其他字符以保证所有的机器都能处理这个文件名。基本名最多可以为8个字符,而扩展名最多可以为3个字符。这样做是为了保证能和MS-DOS兼容。只要文件的版本号不同,则相同的文件名可以在同一个目录中出现多次。
最后两个域不是必需的。填充域用来保证每一个目录项都是偶数个字节,以2字节为边界对齐下一项的数字域。如果需要填充的话,就用0代替。最后一个域是系统使用域,该域的功能和大小没有定义,仅仅只要求该域为偶数个字节。不同的系统对该域有不同的用途。例如,Macintosh系统就把此域用来保存Finder标志。
一个目录中的项除了前两项之外,其余的都按字母顺序排列。第一项表示当前目录本身,第二项表示当前目录的父目录。这和UNIX的.目录和..目录相似。而文件本身不需要按其目录项在目录中的顺序来排列。
对于目录中目录项的数目没有特定的限制;但是对于目录的嵌套深度有限制,最大的目录嵌套深度为8。为了使得有关的实现简化一些,这个限制是任意设置的。
ISO 9660定义了三个级别。级别1的限制最多,限制文件名使用上面提到的8+3个字符的表示法,而且所有的文件必须是连续的(这些我们在前面介绍过)。进而,目录名被限制在8个字符而且不能有扩展名。这个级别的使用,使得CD-ROM可以在所有的机器上读出。
级别2放宽了对长度的限制。它允许文件和目录名多达31个字符,但是字符集还是一样的。
级别3使用和级别2同样的限制,但是文件不需要是连续的。在这个级别上,一个文件可以由几个段(extents)构成,每一个段可以由若干连续分块构成。同一个分块可以在一个文件中出现多次,也可以出现在两个或者更多的文件中。如果相当大的一部分数据在几个文件中重复,级别3则通过要求数据不能出现多次来进行空间上的优化。
2.Rock Ridge扩展
正如我们上面所看到的,ISO 9660在很多方面有限制。在这个标准公布不久,UNIX工作者开始在这个标准上进行扩展,使得在CD-ROM上能实现UNIX文件系统。这个扩展被命名为Rock Ridge,这个名字来源于Gene Wilder的电影《Blazing Saddles》中一个小镇,也许委员会的成员之一喜欢这个电影,便以此命名。
该扩展使用了系统使用域,使得Rock Ridge CD-ROM可以在所有计算机上可读。其他所有的域仍然保持ISO 9660标准中的定义。所有其他不识别Rock Ridge扩展的系统只需要忽略这个域,把盘当作普通的CD-ROM来识别即可。
该扩展分为下面几个域:
1)PX——POSIX属性。
2)PN——主设备号和次设备号。
3)SL——符号链接。
4)NM——替代名。
5)CL——子位置。
6)PL——父位置。
7)RE——重定位。
8)TF——时间戳。
PX域包含了标准UNIX的rwxrwxrwx所有者、同组用户和其他用户权限位。也包含了包含在模式字中的其他位,如SETUID位和SETGID位等。
为了能在CD-ROM上表示原始设备,需要PN域来表示。该域包含了和文件相关的主设备号和次设备号。这样,/dev目录的内容就可以在写到CD-ROM上之后在目标系统上重新正确地构造。
SL域是符号链接,它允许在一个文件系统上的文件可以引用另一个文件系统上的文件。
最重要的域是NM域。它允许同一个文件可以关联第二个名字。这个名字不受ISO 9660字符集和长度的限制,这样使得在CD-ROM上可以表示任意的UNIX文件。
接下来的三个域一起用来消除ISO 9660中的对目录嵌套深度为8的限制。使用这几个域可以指明一个目录被重定位了,而且可以标明其层次结构。这对于消除深度限制非常有用。
最后,TF域包含了每个UNIX的i节点中的三个时间戳:文件创建时间、文件修改时间和文件最后访问的时间。有了这些扩展,就可以将一个UNIX文件系统复制到CD-ROM上,并且能够在不同的系统上正确恢复。
3.Joliet扩展
UNIX委员会不是惟一对ISO 9660进行扩展的小组,微软也发现了这个标准有太多的限制(尽管这些限制最初都是由于微软自己的MS-DOS引起的)。所以微软也做了一些扩展,名为Joliet。这个扩展设计的目的是,为了能够将Windows文件系统复制到CD-ROM上,并且能够恢复(与为UNIX设计Rock Ridge的思路一样)。实际上所有能在Windows上运行的、使用CD-ROM的程序都支持Joliet,包括可写CD的刻录程序。通常这些程序都让用户选择是使用ISO 9660标准还是Joliet标准。
Joliet提供的主要扩展为:
1)长文件名。
2)Unicode字符集。
3)比8层更深的目录嵌套深度。
4)带扩展名的目录。
第一个扩展允许文件名多达64字符。第二个扩展允许文件名使用Unicode字符集,这个扩展对那些不使用拉丁字符集的国家非常重要,如日本、以色列和希腊。因为Unicode字符是2个字节的,所以Joliet最长的文件名可以达到128字节。
和Rock Ridge一样,Joliet同样消除了对目录嵌套深度的限制。目录可以根据需要达到一定的嵌套深度。最后,目录名也可以有扩展名。目前还不清楚为什么有这个扩展,因为大多数的Windows目录从来没有扩展名,但或许有一天会用到。