文件系统基本结构

    一个磁盘可以分成多个分区,每个分区可以包含一个文件系统。下图展示了它们之间的关系:

    图中的 i 节点是固定长度的记录项,它包含有关文件的大部分信息。如果深入观察一个柱面组的 i 节点和数据块部分,则可看到如下的情况:

    关于此图需要注意下面几点:
    1、图中有两个目录项指向同一个 i 节点。每个 i 节点中都有一个链接计数,其值是指向该节点的目录项数。只有当链接计数减至 0 时,才可删除该文件(即释放该文件占用的数据块)。这就是为什么“解除对一个文件的链接”操作并不总是意味着“释放该文件占用的数据块”的原因。这也是删除一个目录项的函数被称为 unlink 而非 delete 的原因。在 stat 结构中,链接计数包含在 st_nlink 成员中,其基本系统数据类型是 nlink_t。这种链接类型称为硬链接。POSIX.1 常量 LINK_MAX 指定了一个文件链接数的最大值。
    2、另一种链接类型称为符号链接。符号链接文件的实际内容(在数据块中)包含了该符号链接所指向的文件的名字。符号链接的文件类型是 S_IFLNK。
    3、i 节点包含了文件有关的所有信息:文件类型、文件访问权限位、文件长度和指向文件数据块的指针等。stat 结构中的大多数信息都取自 i 节点。只有两项重要数据存放在目录项中:文件名和 i 节点编号。i 节点编号的数据类型是 ino_t。
    4、因为目录项中的 i 节点编号指向同一文件系统中的相应 i 节点,一个目录项不能指向另一个文件系统的 i 节点。这就是 ln 命令(构造一个指向一个现有文件的新目录项)不能跨越文件系统的原因。
    5、当在不更换文件系统的情况下为一个文件系统重命名时,该文件的实际内容并未移动,只需构造一个指向现有 i 节点的新目录项,并删除老的目录项,链接计数不会改变。这就是 mv 命令的通常操作方式。
    上面讨论的是普通文件的链接计数,那对于目录文件的链接计数字段又如何呢?假定在当前的工作目录中创建了一个新目录:
        $ mkdir testdir
    下图显示了其结果(注意:该图显示地显示了“.”和“..”目录项):

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

猜你喜欢

转载自aisxyz.iteye.com/blog/2383957
今日推荐