链接的概念:stat、ls -i
当Unix创建文件时,Unix完成两件事情:
- Unix在存储设备上保留一块空间用来存储数据。
- Unix创建一个称为索引节点(index node)或i节点(”i-node“)的结构,来存放文件的基本信息。
i节点包含使用文件所需的全部文件系统信息。
典型Unix文件系统中i节点所包含的内容:
以字节为单位的文件长度包含该文件的设备名称属主的用户标识组id文件权限上一次修改时间上一次访问时间指向该文件的链接数文件的类型(普通、目录、特殊、符号链接...)分配给该文件的块数
普通用户不必了解i节点的内容,因为文件系统会自动处理细节问题。
在Linux系统中,可以使用stat命令,方便地查看某个特定文件的i节点的内容:
stat filename
文件系统将所以的i节点存放在一个大表中,这个表称为i节点表。在i节点表中,每个i节点由所谓的索引号或i节点号表示。例如假设一个特定的文件由i节点#478515描述,那么我们称这个文件的i节点号为478515。为了显示文件的i节点号,可以使用ls -i命令,输出的第一列即为节点号。
我们说一个目录中包含文件,但实际上,该目录只包含文件的名称及文件的i节点号。因此目录的内容相当小:只有一列名称和每个名称对应的一个i节点号。
当在bin目录中创建文件war3时:
- 首先Unix在硬盘上保留存放该文件的存储空间。
- 接下来Unix查看i节点表,查找一个空闲的i节点。假设查找到的i节点时是#478515。然后Unix信息填充到属于该新文件的i节点中。
- 最后Unix在bin目录中放入一个条目,该条目包含名称war3以及一个为478515的节点号。
每当程序需要使用文件时,程序在目录中查找文件名将是一件简单的事:只需使用相应的i节点号查找i节点,然后使用i节点中的信息访问文件即可。文件名与i节点之间的连接称为链接,链接将文件名和文件本身连接起来。这就是为什么i节点不包含文件名的原因。实际上,一个i节点可以由不止一个文件名引用。
多重链接
多重链接是Unix文件系统最出色的特征之一。换句话说,就是一个文件可以有不止一个名称。文件的唯一标识符是其i节点号,而不是它的名称,多个文件名可以引用同一个i节点号。
- /home/harley/bin/spacewar
- /home/harley/bin/funky
- /home/harley/extra
- /home/weedly/myfile
以上四个文件spacewar、funky、extra和myfile可以拥有同一个i节点号。链接的基本想法就是同一个文件可能拥有不同的含义,例如可以使不同的用户以不同的名称访问同一个文件。
链接背后还有更多的含义,我们需要理解链接的原理其原因在于,它是基本文件命令操作cp、mv、rm以及ln的基础。如果只是记住如何使用命令,那么你永远不能真正理解发生的事情,而且也永远不会理解文件系统的使用规则。
创建新链接:ln
每当创建文件时,文件系统就会自动在文件名和文件之间创建一个链接。但是有时候,我们希望为已有文件创建一个新链接。当需要这样做时可以使用ln命令,该命令有两种方式:
- 为单个文件创建新链接,语法为
ln file newname。例如已有文件spacewar,希望在spacewar和funky之间创建一个新链接:ln spacewar funky。此时你拥有了两个文件名,它们都指向同一个文件(同一个i节点号)。 - 为一个或多个普通文件创建新链接,并将新链接放在指定的目录中,语法为
ln file... directory。
符号链接:ln -s
上面讨论的链接类型允许我们为同一个文件指定不止一个名称。但是这样的链接有两个限制:
- 不能为目录创建链接
- 不能为不同文件系统中的文件创建链接
在创建不同文件系统中的目录或文件的链接时,需要创建所谓的符号链接(ln -s)。符号链接包含的不是文件的i节点号,而是原文件的路径名。使用ls -l显示符号链接文件的长列表时,文件类型指示符是l(link),意为链接。实际的符号链接在输出行的右边显示。
为了区分两种类型的链接,一般将常规的链接称为硬链接,而将符号链接称为软链接。只使用“链接”字样时指的是硬链接。