linux软链接和硬链接

来源:互联网 发布:安卓摄像机软件 编辑:程序博客网 时间:2024/05/18 02:24

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 09797648 -rw-r--r--  2 oracle oinstall 0 Apr 21 08:11 f19797648 -rw-r--r--  2 oracle oinstall 0 Apr 21 08:11 f29797649 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 f1I am f1 file[oracle@Linux]$ cat f2I am f1 file[oracle@Linux]$ cat f3I am f1 file[oracle@Linux]$ rm -f f1[oracle@Linux]$ cat f2I am f1 file[oracle@Linux]$ cat f3cat: 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页。创建一个构成循环的硬链接很难消除。


参考

理解 Linux 的硬链接与软链接

Linux软连接和硬链接

Linux文件系统剖析

学习 Linux,101: 创建和更改硬链接和符号链接








0 0