分类: 系统运维
2012-03-28 13:37:55
为了理解一个文件的链接的概念,我们需要UNIX文件系统结构的概念上的理解。理解i-node和指向一个i-node的目录项(directory entry)也是很有用的。
当今有各种UNIX文件系统的实现。比如,Solaris,支持几咱不同的磁盘文件系统类型:传统的基于BSD的UNIX文件系统(称为UFS)、一个
(称为PCFS的)读写DOS格式磁盘的文件系统、一个(称为HSFS的)读取CD文件系统的文件系统。我们在第2章已经看过一个文件系统类型之间的区
别。UFS是基于Berkely快速文件系统,我们将在本节介绍它。
我们可以认为一个磁盘驱动器分为一个或多个分区。每个分区可以包含一个文件系统,如下图所示:
i-nodes是一堆固定长度的项,包含一个文件的大多数信息。
如果我们更深入的检查磁道组(cylinder group)的i-node和数据块部分,我们可以得到下图:
我们研究下上图:
1、我们展示了两个目录项,它们指向同一个i-node项。每个i-node有一个链接数来包含指向该i-node的目录项的数量。只有当链接数减为0时
文件才会被删除(也就是说,文件关联的数据块可以被释放。)这是为什么操作“解链接一个文件”并不总是意味着“删除文件相关的块”。这是为什么删除目录项
的函数被称为“unlink”,而不是delete。在stat结构体里,链接数包含在st_nlink成员里。它的原始系统数据类型是nlink_t。
这些链接的类型被称为硬链接。回想下2.5.2节的POSIX.1常量LINK_MAX表示一个文件链接数的最大值。
2、另一种类型的链接被称为符号链接。通过符号链接,文件的真实内容--数据块--存储着符号链接指向的文件的名字。在下面的例子里,在目录项里的文件名是3个字符的lib而在文件的数据里的7个字节是/usr/lib:
lrwxrwxrwx 1 tommy tommy 7 2012-02-22 13:54 lib -> usr/lib
i-node里的文件类型应该是S_IFLNK,以使系统知道这是个符号链接。
3、i-node包含文件的所有信息:文件类型、文件访问权限位、文件尺寸、指向文件数据块的指针、等等。stat结构体的多数信息都是从i-node里
得到。只有两个有关的项是存储在目录项里:文件名和i-node号。其它项--文件名的长度和目录记录的长度--不在这里讨论。i-node数的数据类型
为ino_t。
4、因为目录项指向的i-node号指向在同一文件系统的一个i-node,我们不能有一个指向另一个文件系统的i-node的目录项。这也是为什么ln命令(创建一个指向已存在文件的新的目录项)不能跨越文件系统。我们在下节讲述link函数。
5、当重命名一个文件而不改变文件系统时,文件的真实内容不需要被移动--所有需要做的就是加上一个指向已存在的i-node的新的目录项,然后解链接旧 的目录项。链接数会保持不变。比如,为了重命名文件/usr/lib/foo为/usr/foo,如果目录/usr/lib和/usr在同一个文件系统 上,文件foo的内容不必移动。这时mv命令通常如何执行的。
我们已经讨论过一个普通文件的链接数,但一个目录的链接数域是怎么样的呢?假设我们在工作目录创建一个新的目录,如:
$ mkdir testdir
下图显示了结果。注意这张图里我们显式地展示了.和..的项:
号为2549的i-node有一个“direcotry”的类型域,和等于2的链接数。任何叶目录(一个不包含任何其它目录的目录)总是有值为2的链接
数。这个2值是从以这个目录为名(testdir)的目录项和该目录的.项而来。号为1267的i-node有一个“directory”类型域和一个大
于等于3的链接数。我们知道链接数大于等于3的原因是,最低程度下,它被以目录为名的目录(图中没有展示)、点目录、和在testdir的点点目录。注意
父目录里的每个子目录都导致父目录的链接数增一。
这个格式与UNIX文件系统的经典格式相似。