在Linux系统中,有两个容易混淆的概念,就是软链接(Soft Link)和硬链接(Hard Link)。这个也经常在面试过程中问到,在实际的工作中,可能你并不经常创建链接文件,但是在很多配置文件中你都可以看到它。了解了他们的区别和共性,才能更好的去使用它,提高效率,减少困惑。在这篇文章中,我用图书馆来类比说明,可能有差异,各位看官需要自己理解消化下。
首先,在Linux系统中,每一个保存的文件,文件系统都会自动分配一个索引节点来帮助文件系统查找文件所在的位置,也就是inode index。使用ls命令加-i参数就可以看到,例如:
[root@localhost ~]# ls
anaconda-ks.cfg
[root@localhost ~]# touch test
[root@localhost ~]# ls -li
total 4
67157570 -rw-------. 1 root root 1259 May 26 05:34 anaconda-ks.cfg
67157597 -rw-r--r-- 1 root root 0 Nov 14 06:35 test
我刚刚在/root目录下新建了一个名为test的文件,他的inode号为:67157597,我们可以把文件系统想象成一个图书馆,test想象成书名,而inode号就可以想象成是图书编号,在图书管理系统中通过查找图书编号就可以找到对应书的物理位置和名字,同理在Linux系统中,通过inode号就可以找到文件在磁盘中的位置和文件名。
硬链接就相当于给一个文件做个备份,给源文件的内容都拉过来,包括inode号;类比图书馆,就是给名为test的图书做个备份,这个备份可以是其他名字,但是他们编号是相同的。
所以,在我看来inode号没变,就是因为他们说到底是真实存在的相同的两份内容,存在某种同步的逻辑。
[root@localhost ~]# ls -il
total 4
67157570 -rw-------. 1 root root 1259 May 26 05:34 anaconda-ks.cfg
67195584 -rw-r--r-- 1 root root 0 Nov 14 06:44 test
[root@localhost ~]# ln test /root/hard
[root@localhost ~]# ls -il
total 4
67157570 -rw-------. 1 root root 1259 May 26 05:34 anaconda-ks.cfg
67195584 -rw-r--r-- 2 root root 0 Nov 14 06:44 hard
67195584 -rw-r--r-- 2 root root 0 Nov 14 06:44 test
[root@localhost ~]# echo "this is a test file" >> test
[root@localhost ~]# cat test
this is a test file
[root@localhost ~]# cat hard
this is a test file
如上测试,我修改了源文件的内容,硬链接的内容也发生了变化,那反过来,我修改硬链接文件,源文件会发生改变吗?
[root@localhost ~]# echo "i love moyu" >> hard
[root@localhost ~]# cat hard
this is a test file
i love moyu
[root@localhost ~]# cat test
this is a test file
i love moyu
答案就是会变!不知道各位猜对了没有。
所以说,修改Linux中的硬链接文件,就等同于是在修改源文件。
那不知道各位有没有思考一个问题,删除了硬链接,源文件还存在吗?反过来,删除了源文件,硬链接还存在吗?
这个我不做实验,我从图书馆的角度告诉你答案。我们之前说到,硬链接,就是图书的备份,原本没有了,但是备份还在;同理,备份没了,原本也不会被影响。
所以答案就是删除了硬链接,源文件不会被影响;同样,删除了源文件,硬链接文件也不会被影响。inode号也不会发生变化。
软链接就是给文件新建一个inode号,两个inode号都指向同一个文件,软链接又叫做符号链接,从名字来理解,那就是给文件新建一个标识符,也就是inode号。
还是用图书馆来类比说明。这就是给名为test的图书再编一个号,现在test这本书就有了两个编号。
[root@localhost ~]# ln -s test /root/soft
[root@localhost ~]# ls -il
total 12
67157570 -rw-------. 1 root root 1259 May 26 05:34 anaconda-ks.cfg
67195584 -rw-r--r-- 2 root root 32 Nov 14 06:59 hard
67157597 lrwxrwxrwx 1 root root 4 Nov 14 07:21 soft -> test
67195584 -rw-r--r-- 2 root root 32 Nov 14 06:59 test
这里我给test文件建立了一个软链接,可以直观的看到inode号发生了改变,还是一样的套路,我们对源文件进行修改,看看软链接文件会不会发生变化。
[root@localhost ~]# cat test
this is a test file
i love moyu
[root@localhost ~]# cat soft
this is a test file
i love moyu
[root@localhost ~]# echo "i for in love with moyu" >> test
[root@localhost ~]# cat test
this is a test file
i love moyu
i for in love with moyu
[root@localhost ~]# cat soft
this is a test file
i love moyu
i for in love with moyu
结果还是很显而易见的,修改了源文件,软链接文件的内容也发生了变化,反之,修改软连接文件,源文件内容会发生变化吗?我们继续测试。
[root@localhost ~]# echo "moyu is my favourite bloger" >> soft
[root@localhost ~]# cat soft
this is a test file
i love moyu
i for in love with moyu
moyu is my favourite bloger
[root@localhost ~]# cat test
this is a test file
i love moyu
i for in love with moyu
moyu is my favourite bloger
结果显而易见,当然会改变。
还是一样的问题,删除了源文件,软链接文件会不会被影响?反过来,删除了软链接文件,源文件会不会被影响?
类比图书馆,刚刚说到,软链接就是给图书添加额外的编号,原本没了,找到编号也找不到书了,那这个编号也就没有了存在的意义;反过来,删除了一个编号,怎么会对书本身有影响呢?
所以删除了源文件,软连接就会失效;删除了软连接,并不会使源文件产生变化。
删除了硬链接,源文件不会被影响;同样,删除了源文件,硬链接文件也不会被影响。删除了源文件,软连接就会失效;删除了软连接,并不会使源文件产生变化。
在建立方式上,他们也有所不同,软链接的建立需要加-n参数,还必须使用绝对路径;硬链接不需要额外的参数,但是不能链接到不同分区。
(为什么不能跨分区建立硬链接?这个需要解释一下,在linux系统中,inode号是按照每个分区来建立的,在不同的分区中,如果文件系统是同一类型,那inode号的分配方式是相同的,就好比是新华书店的两个分店,店里摆放东西的风格是一样的,但是同一个编号在两个店里可能是不同的两本书。在Linux系统中也一样,同一个inode号标识两个文件这是一定不允许的,系统会报错)
硬链接不能链接目录,目录在Linux文件系统中目录是一个存有inode号和文件名的特殊文件,每个文件系统都有它的目录,所以硬链接不能链接目录,这是系统不允许的;软链接可以理解为快捷方式,它最终还是指向源文件,所以它可以链接目录。(这里解释的比较模糊,这个概念比较抽象,可能还需要各位深入理解一下)
他们都是链接文件,不论是修改软连接还是硬链接都会使源文件发生变化。