Linux下的实体链接与符号链接

Linux 文件系统最重要的特点之一是它的文件链接。链接是对文件的引用,这样可以让文件在文件系统中多处被看到。在 Linux 中,链接可以如同原始文件一样来对待,即链接可以与普通的文件一样被执行、编辑和访问。对系统中的其他应用程序而言,链接就是它所对应的原始文件。当通过链接对文件进行编辑时,编辑的实际上是原始文件。链接不是副本。

在Linux中,有两种类型的链接:实体链接(hard link,硬链接)和符号链接(symbolic link软链接)。

实体链接

我们知道,在Linux中,文件名其实是存在文件所属目录的block里的,且该block里存放了文件的inode号。根据此inode号码,我们可以找到文件的block,从而读取文件内容。那么,如果我们在其它目录的block里添加一条记录,引用另一个文件名(或者同名),该文件对应的inode号和上一个文件的inode号码一致。这样的话,不同目录里的不同文件,其实对应的是同一个inode号码,对应的也就是同一个文件。这就是实体链接的概念。

clip_image002

从示意图可以看出,实体链接是不会建立新的inode的,它只是在某目录的block区增加了一条记录而已,也因此实体链接是不可以跨越文件系统的。也可以说,实体链接实际上是为文件建了一个别名,链接文件和原文件实际上是同一个文件。无论对哪个文件的操作,都是对同一个文件的操作。

实体链接的好处是安全。当移动或删除某文件时,实体链接不会被破坏,因为它所引用的是文件的物理数据而不是文件在文件结构中的位置。同时如果删除了某文件,而该文件有相应的实体链接,那么这个文件依然会保留,直到所有对它的引用都被删除。

符号链接

符号链接相当于Windows下的快捷方式。符号链接会产生的一个新的文件,但这个文件的作用就是专门指向某个文件的,当删除链接文件时,那就等于不需要这个链接,和原来的存在的实体原文件没有任何关系。但删除原来的文件,则相应的符号链接不可用。

由于会产生新的文件,所以当创建符号链接时,会占用新的inode编号。

ln命令

创建链接的命令是ln,默认情况下创建的实体链接,当加上-s选项时,则创建符号链接。

ln的用法如下:

clip_image004

创建一个实体链接:

clip_image005

上图中,对于新创建的文件file1,添加了一个在当前目录下的实体链接文件file1-hardlink,当使用ll命令查看时,会发现此两个文件完全一样。同时,由于创建了链接文件,所以,文件的链接数目都是2.

再针对file1创建一个符号链接:

clip_image007

上图中可以看到,创建的符号链接文件file1-symlink和原文件并不相同,并且当我们ll时,可以看到系统会标明符号链接所链接到的原文件。

当删除文件时:

clip_image008

上图可以看到,当删除原文件file1时,实体链接文件不会报错,而符号链接文件则会提示找不到文件。

关于目录

我们知道,当新建一个目录时,该目录下会有.和..两个目录,.代表当前目录,而..代表上层目录。所以,对于某个新创建的目录来说,.目录相当于是该目录的一个链接,故新建目录的链接数目是2。而..相当于是其上层目录的一个链接,故上层目录的链接数目会+1.

clip_image009

上图中,/tmp目录的原链接数目为10.当创建了新的子目录dir2后,可以看出,dir2的链接数目是2,而/tmp的链接数目变为了11.

你可能感兴趣的:(linux,应用程序)