链接的命令:ln - make links between files  #在文件之间创建一个链接

创建硬链接会增加额外的记录项以引用文件

硬链接和链接(符号链接)_软链接

图中的1为链接数=文件的名字数量


将/mnt/f1做一个硬链接到/opt/f1 取名还叫f1

硬链接和链接(符号链接)_ln_02

图中,俩个文件的元数据一样说明是同一个文件


硬链接和链接(符号链接)_软链接_03

链接次数都是2



然后把源文件改名并添加内容

硬链接和链接(符号链接)_硬链接_04

这里可以看到,它们的元数据还是一样的,说明还是同一个文件,然后我们

查看它们的内容是不是一样硬链接和链接(符号链接)_ln_05

结果显而易见



那么,当我们删除源文件时,链接文件会不会也无效或被删呢?硬链接和链接(符号链接)_软链接_06


链接文件还在,内容也没有丢失。但链接数量减1

当链接数量为0时。文件被删除

对应于同一文件系统上一个物理文件

每个目录引用相同的inode号

创建时链接数递增


硬链接不能跨驱动器或分区

演示

下图,/testdir目录是sda5分区与/opt不是同一个分区硬链接和链接(符号链接)_硬链接_07


然后我们将f1链接到/testdir目录下硬链接和链接(符号链接)_硬链接_08

提示不能跨分区链接。为什么?

硬链接的本质是同一个文件,给它增加一个新的名字,若不在一个分区里,即使元数据一样也不是同一个文件,所以这个违反了硬链接的定义,所以系统不会让你创建


硬链接不能给目录创建链接硬链接和链接(符号链接)_ln_09



符号(或软)链接

一个符号链接指向另一个文件

ls- l的 显示链接的名称和引用的文件

一个符号链接的内容是它引用文件的名

可以对目录进行

可以跨分区

不增加或减少目标文件inode的引用计数;

语法: ln   -s  filename [linkname]


硬链接和链接(符号链接)_软链接_10

软连接f1起名f11查看属性。元数据不一样;读写权限不一样;链接数也没有增加;数据大小也不一样。2这个数据是怎么来的呢?是从路径,路径有几个字符就是几

所以软连接与原始文件不是同一个文件。



当我们把原始文件删除以后,链接文件就会报错

硬链接和链接(符号链接)_ln_11



硬链接和链接(符号链接)_硬链接_12

链接文件里存放的是路径数据,当我们访问链接文件时,它会自动的转到原始文件那里,所以当我们把原始文件删除以后,它过去一找,哎!没有了?所以它就会告诉我们:我找不到!


这里有个很有意思的事:我们在原目录下用vi编辑器创建一个全新的f1,看看它能不能区别出来。

硬链接和链接(符号链接)_硬链接_13

OK,这个f1是以前f1的弟弟!



硬链接和链接(符号链接)_硬链接_14 

系统果然没有认出来,它只是机械式的给我们一个链接,才不会care到底以前的f1还是不是f1。只要名字一样,是它知道的那个地方就行。


接下来就是验证跨分区、跨设备操作

硬链接和链接(符号链接)_硬链接_15

报错了。为什么呢?

因为它找不到。路径不对,

命令:ln –s f1 /testdir/f2

f1的路径应该是相对于/testdir/f2

所以路径应该写:/opt/f1



这里的f22就对了。没有报错硬链接和链接(符号链接)_ln_16



还有一种情况当软连接在它的子目录下时可以用另一种方式写

硬链接和链接(符号链接)_软链接_17

上图:pig1和dog1都在testdir目录下


我们将/testdir/dog/dog1/a文件软连接到/testdir/pig/pig1/a1起名叫a1(实在不知道起什么文件名好,大家别贱笑)

硬链接和链接(符号链接)_硬链接_18

这里,软连接a1必须写绝对路径,而源文件可以写相对路径,这里的相对路径是相对软连接a1来说的