4.14 文件系统

    为了说明文件链接的概念,先要介绍UNIX文件系统的基本结构。同时,了解i节点和指向i节点的目录项之间的区别也是很有益的。

    目前,正在使用的UNIX文件系统有多种实现。例如,Solaris支持多种不同类型的磁盘文件系统:传统的基于BSD的UNIX文件系统(称为UFS),读、写DOS格式软盘的文件系统(称为PCFS),以及读CD的文件系统(称为HSFS)。在图2-20中,我们已经看到了不同类型文件系统的一个区别。UFS是以Berkeley快速文件系统为基础的。本节讨论该文件系统。

    我们可以把一个磁盘分成一个或多个分区。每个分区可以包含一个文件系统(见图4-13)。i节点是固定长度的记录项,它包含有关文件的大部分信息。

    如果更仔细地观察一个柱面组的i节点和数据块部分,则可以看到图4-14中所示的情况。

    注意图4-14中的下列各点。

  •     在图中有两个目录项指向同一个i节点。每个i节点都有一个链接计数,其值是指向该i节点的目录项数。只有当链接计数减少至0时,才可删除该文件(也就是可以释放该文件占用的数据块)。这就是为什么“解除对一个文件的链接”操作并不总是意味着“释放该文件占用的磁盘块”的原因。这也是为什么删除一个目录项的函数被称为unlink而不是delete的原因。在stat结构中,链接计数包含在st_nlink成员中,其基本系统数据类型是n_link_t。这种链接类型称为硬链接。回忆2.5.2节,其中,POSIX.1常量LINK_MAX指定了一个文件链接数的最大值。
  • 另外一种链接类型称为符号链接(symbolic link)。符号链接文件的实际内容(在数据块中)包含了该符号链接所指向的文件的名字。在下面的例子中,目录项中的文件名是3个字符的字符串lib,而在该文件中包含了7个字节的数据usr/lib:
  • i节点包含了文件有关的所有信息:文件类型、文件访问权限位、文件长度和指向文件数据块的指针等。stat结构中的大多数信息都取自i节点。只有两项重要数据存放在目录项中:文件名和i节点编号。其他的数据项(如文件名长度和目录记录长度)并不是本书所关心的。i节点编号的数据类型是ino_t。
  • 因为目录项中的i节点编号指向同一个文件系统中的相应i节点,一个目录项不能指向另一个文件系统的i节点。这就是为什么ln命令(构造一个指向一个现有文件的新目录项)不能跨越文件系统的原因。我们将在下一节说明link函数。
  • 当在不更换文件系统的情况下为一个文件重命名时,该文件的实际内容并未移动,只需构造一个指向i节点的新目录项,并删除老的目录项。链接计数不会改变。例如,为将文件/usr/lib/foo重命名为/usr/foo,如果目录/usr/lib和/usr在同一个系统中,则文件foo的内容无需移动。这就是mv命令的通常操作方式。

    我们说明了普通文件的链接计数概念,但是对于目录文件的链接计数字段又如何呢?假定我们在工作目录中构造一个新目录:

    $ mkdir  teestdir

    图4-15显示了其结果。注意,该图显示地显示了.和..目录项。

    编号为2549的i节点,其类型字段表示它是一个目录,链接计数为2。任何一个叶目录(不包含任何其他目录的目录)的链接计数总是2,数值2来自于命名该目录(testdir)的目录项以及在该目录中的.项。编号为1267的i节点,其类型字段表示它是一个目录,链接计数大于或等于3。它大于或等于3的原因是,至少有3个目录项指向它:一个是命名它的目录项(在图4-15中没有表示出来),第二个是在该目录中的.项,第三个是在其子目录testdir中..项。注意,在父目录中的每一个子目录都使该父目录的链接计数增加1。

    这种格式与UNIX文件系统的经典格式类似,在Bach的第4章中对此进行了详细说明。关于伯克利快速文件系统对此所做的更改请参阅McKusick等的第7章。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值