Linux中link分为两种,一种是Symbolic link,另一种是HardLink。
Synbolic link: ln -s f1 f2
Hard link: ln f1 f2
要区分他们,首先要理解inode index这个概念。
在linux的文件系统中,保存在磁盘分区中的文件不管是什么类型的都会给他分配一个编号,称为Inode index。通过这个编号来找到对应的文件。
当创建一个文件时,新生成的文件名就回自动指向inode index。
[aiwang@localhost test]$ touch f1
[aiwang@localhost test]$ echo aaa > f1
[aiwang@localhost test]$ cat f1
aaa
[aiwang@localhost test]$ ll -i
total 0
393446 -rw-rw-r--. 1 aiwang aiwang 0 Dec 412:01 f1
f1就会自动指向这个inode index,此处为393446。这个Inode index所指向的文件中的内容为aaa。
Hard link
[aiwang@localhost test]$ ln f1 f2
[aiwang@localhost test]$ ll -i
total 0
393446 -rw-rw-r--. 2 aiwang aiwang 0 Dec 4 12:01 f1
393446 -rw-rw-r--. 2 aiwang aiwang 0 Dec 4 12:01 f2
通过hard link生成的f2文件名与原先的f1文件名指向的是同一个Inode index。不过有两条限制,一是不能跨filesystems,二是不能链接到目录:
一,不能跨filesystems,可以理解,假设可以跨filesystems,如果hardlink所在的filesystem已挂载,而实际数据的filesystem没有挂载,想象一下会怎样
二,不能链接到目录,假设有一目录C,如果可以链接到目录,在当前目录的block中增加一条目录档案C的inode和该目录在当前目录下的文件名,我们 可以通过目录C的inode去读取C目录档案的block,从而得到目录档案中记载的下一级目录档案和文件的inode和文件名,进而读取该目录下的档案 和文件
Synbolic link
[aiwang@localhost test]$ ln -s f1 f3
[aiwang@localhost test]$ ll -i
total 0
393446 -rw-rw-r--. 2 aiwang aiwang 0 Dec 4 12:01 f1
393446 -rw-rw-r--. 2 aiwang aiwang 0 Dec 4 12:01 f2
393455 lrwxrwxrwx. 1 aiwang aiwang 2 Dec 4 12:06 f3 -> f1
可以看出,通过Synbolic link生成的f3文件名并没有指向原先的393446(aaa),而是连接到了一个新的index,这个新的inode index所指向的文件是一个文本文件,其中保存的是被连接文件f1的位置信息。然后在对照f1的文件名,得到f1的inode,进而读取f1.