linux软链接和硬链接
2015-05-24 15:27
316 查看
1、概述
硬链接(hard link)与软链接(symbolic link)是 Linux 文件系统中的一个重要概念,其涉及文件系统中的索引节点 (index node 又称 inode),而索引节点对象是 Linux 虚拟文件系统 (VFS,参考文章Linux 文件系统剖析) 的四个基本概念之一。
2、硬链接和软链接
硬链接
硬链接是通过索引节点(i节点)进行链接的。每个i节点中都有一个链接计数,其值是指向该i节点的目录块数。只有当链接计数减少至0才会删除该文件(即释放该文件所占的数据块)。如果一个i节点号对应多个有效路径名,则称这些文件为硬链接。换言之,硬链接就是同一个文件使用了多个别名。由于硬链接是有着相同 inode 号仅文件名不同的文件,因此硬链接存在以下几点特性:
文件有相同的 inode 及 data block;
只能对已存在的文件进行创建;
不能跨文件系统进行硬链接的创建,因为每个文件系统各自对它们的i节点进行编号,因此目录项中i节点编号指向同一个文件系统中对应的i节点,不能使一个目录项指向另一个文件系统的i节点;
不能对目录进行创建,只可对文件创建;尽管POSIX.1允许支持跨文件系统的链接,但是大多数实现要求这两个路径名在同一个文件系统中。;
删除一个硬链接文件并不影响其他有相同 inode 号的文件。
软链接(符号链接)
软链接类似于windows快捷方式。它实际上是一个普通文件,只是其数据块内容有点特殊,该文件的实际内容(在数据块中)包含了该符号链接所指向的文件的路径。软链接有着自己的 inode 号以及用户数据块。因此软链接的创建与使用没有类似硬链接的诸多限制:
软链接有自己的文件属性及权限等;
可对不存在的文件或目录创建软链接;
软链接可跨文件系统,而硬链接要求链接和文件位于同一文件系统中;
软链接可对文件或目录创建,而只有超级用户才能创建指向目录的硬链接;
创建软链接时,链接计数 i_nlink 不会增加;
删除软链接并不影响被指向的文件,但若被指向的原文件被删除,则相关软连接被称为死链接(即 dangling link,若被指向路径文件被重新创建,死链接可恢复为正常的软链接)。而删除原文件硬链接并不会失效。
软链接文件长度是文件名中的实际字节数;而硬链接文件长度是所链接的文件的大小。例如,命令“ln a.out ./linktest”和“ln -s a.out ./linktest/symbol_link”分别创建了a.out文件的硬链接和软链接,然后ls -l 查看两个链接的情况,如下图所示,硬链接、软链接文件大小的差别,软链接文件长度是路径名“a.out”的长度。
创建链接小例子
[oracle@Linux]$ touch f1 #创建一个测试文件f1 [oracle@Linux]$ ln f1 f2 #创建f1的一个硬连接文件f2 [oracle@Linux]$ ln -s f1 f3 #创建f1的一个符号连接文件f3 [oracle@Linux]$ ls -li # -i参数显示文件的inode节点信息 total 0 9797648 -rw-r--r-- 2 oracle oinstall 0 Apr 21 08:11 f1 9797648 -rw-r--r-- 2 oracle oinstall 0 Apr 21 08:11 f2 9797649 lrwxrwxrwx 1 oracle oinstall 2 Apr 21 08:11 f3 -> f1 从上面的结果中可以看出,硬连接文件f2与原文件f1的inode节点相同,均为9797648,然而符号连接文件的inode节点不同。 [oracle@Linux]$ echo "I am f1 file" >>f1 [oracle@Linux]$ cat f1 I am f1 file [oracle@Linux]$ cat f2 I am f1 file [oracle@Linux]$ cat f3 I am f1 file [oracle@Linux]$ rm -f f1 [oracle@Linux]$ cat f2 I am f1 file [oracle@Linux]$ cat f3 cat: f3: No such file or directory 通过上面的测试可以看出:当删除原始文件f1后,硬连接f2不受影响,但是符号连接f1文件无效
几个问题
1、为什么“解除对一个文件的链接“操作并不总是意味着”释放“该文件占用的磁盘块”?为什么删除一个目录项的函数时unlink而不是delete?硬链接是通过索引节点(i节点)进行链接的。每个i节点中都有一个链接计数,其值是指向该i节点的目录块数。只有当链接计数减少至0才会删除该文件(即释放该文件所占的数据块)。如果一个i节点号对应多个有效路径名,则称这些文件为硬链接。换言之,硬链接就是同一个文件使用了多个别名。
2、为什么不能跨文件系统创建硬链接?
因为每个文件系统各自对它们的i节点进行编号,因此目录项中i节点编号指向同一个文件系统中对应的i节点,不能使一个目录项指向另一个文件系统的i节点。
3、关闭文件操作是如何进行的?
只有当硬链接计数为0才真正关闭文件。关闭一个文件时,内核首先检查打开该文件的进程数。如果进程数为0,然后检查其链接数,如果链接数也为0才删除该文件的内容。
4、为什么link函数不允许构造指向目录的硬链接的原因(除非进程具有超级用户权限)?
APUE第二版93页。创建一个构成循环的硬链接很难消除。