软连接 VS 硬链接

软连接

软连接(也称作符号链接——symbolic link, symlink or soft link), 是一类特殊的文件, 其包含有一条以绝对路径或者相对路径的形式指向其它文件或者目录的引用。 符号链接最早在4.2BSD版本中出现(1983年)。今天POSIX操作系统标准、大多数类Unix系统、Windows Vista、Windows 7都支持符号链接。Windows 2000与Windows XP在某种程度上也支持符号链接。

符号链接的操作是透明的:对符号链接文件进行读写的程序会表现得直接对目标文件进行操作。某些需要特别处理符号链接的程序(如备份程序)可能会识别并直接对其进行操作。

一个符号链接文件仅包含有一个文本字符串,其被操作系统解释为一条指向另一个文件或者目录的路径。它是一个独立文件,其存在并不依赖于目标文件。如果删除一个符号链接,它指向的目标文件不受影响。如果目标文件被移动、重命名或者删除,任何指向它的符号链接仍然存在,但是它们将会指向一个不复存在的文件。这种情况被有时被称为被遗弃。

在Linux中,创建软连接的方法是使用ln -s:

$ ln -s /etc/bashrc /tmp/bashrc
$ ln -s /etc/bashrc .            # 目标可以不是完整的文件名
$ ln -s /etc/ dir                # 源和目标名可以不一样, 目标也可以是相对路径

查看软连接的指向可以用ls -l

删除软连接就如同删除普通文件一样,使用rm symlink即可。

inode

inode是指在许多“类Unix文件系统”中的一种数据结构。每个inode保存了文件系统中的一个文件系统对象(包括文件、目录、设备文件、socket、管道, 等等)的元信息数据,但不包括数据内容或者文件名。

文件系统中每个“文件系统对象”对应一个“inode”数据,并用一个整数值来辨识。这个整数常被称为inode号码(“i-number”或“inode number”)。由于文件系统的inode表的存储位置、总条目数量都是固定的,因此可以用inode号码去索引查找inode表。

简而言之:

  • inode存储的是文件的元数据
  • inode是文件在磁盘上的索引编号
  • inode是文件的唯一标示符(主键), 而非文件名

Linux系统中,显示文件的inode使用ls -i,使用df -i可以显示当前挂载列表中inode使用情况

硬链接

硬连接, 指通过索引节点来进行连接。在Linux的文件系统中,保存在磁盘分区中的文件不管是什么类型都给它分配一个编号,称为索引节点号(Inode Index)。在Linux中,多个文件名指向同一索引节点是存在的。一般这种连接就是硬连接。硬连接的作用是允许一个文件拥有多个有效路径名,这样用户就可以建立硬连接到重要文件,以防止“误删”的功能。其原因如上所述,因为对应该目录的索引节点有一个以上的连接。只删除一个连接并不影响索引节点本身和其它的连接,只有当最后一个连接被删除后,文件的数据块及目录的连接才会被释放。也就是说,文件真正删除的条件是与之相关的所有硬连接文件均被删除。

在Linux中,创建硬链接的方法是ln:

$ ln file1 file2

创建硬链接之后,源文件和目标文件将拥有完全相同的inode编号,权限,内容等。

硬链接的几个限制:

  • 硬链接创建时要求源文件必须存在
  • 不允许给目录创建硬链接(注意是不能通过ln的方式)
  • 只有在同一文件系统才能创建硬链接

关于软连接和硬链接详细说明,参考IBM的文章: 理解 Linux 的硬链接与软链接