最近在做Docker镜像的时候,又遇到了软链接和硬链接的问题,百度很多资料写的都够全,或者都不够直白。看完之后云里雾里,甚至还有说错说反的。所以就需要来正确的认识一下Linux下的这两种链接方式。
要想理解软链接和硬链接的区别,就要先了解一下Linux下的文件保存方式。
在Linux下,每一个文件的数据内容,都有一个对应的唯一的inode信息,可以理解为数据的身份证,即使你复制了一份文件数据,他们的inode信息也是不同的,保证每个数据都是独立的。在inode信息里,有一个独立的编号,用来识别,同时也有一个链接数,用来记录被链接的次数。如果,inode里的链接数为0,表示这份数据不再被需要,系统就会把这个数据清除。
inode相关只说到这,足够我们继续后面的理解。
理解inode的概念之后,我们来看文件的保存方式就很好理解了。文件在数据层是文件的数据内容,而用户看到的只是一个文件的标识,可以是个一份数据的指针文件。这里为了好理解,我们统称为“文件牌”。
软链接就和Windows里的快捷方式一样,他会新建一个索引文件,来指向原有的“文件牌”而非数据。所以当我们查看软链接的大小的时候就会发现,非常小。只是一个快捷方式的大小。
所以软链接,就只是新建了一个快捷方式文件来指向源文件的“文件牌”而已。
当我们删除源文件的时候,源文件的“文件牌”会删除,同时原始数据inode的引用数减为0,触发系统删除了原始数据释放空间。
但是由于我们的软链接是单独的一个文件,所以并不会被删除。但是由于他指向的源文件已经没有了,所以也无法打开,变成了垃圾文件。
理解了软链接之后再来理解硬链接就变的很容易了。先来看一张图。
可以看到,硬链接的链接方式,不再是指向“文件牌”,而是直接指向了数据。此时数据的inode引用数量变为2。表示有2个文件指向了这份数据。
如果我们删除了一个硬链接,那么原始数据引用数会减少1,但只要不为0,就不会被删除。所以文件2还是可以使用。
理解完软链接和硬链接之后我们就能很清楚的知道他们的一些相同点和区别
相同点:
1.都不会复制原始数据,不会创造出2份原始数据保存。
2.单独调用使用的时候基本一致,没太大区别。
3.原始数据发生变化,都会被改变。
区别:
1.软链接新建了一个索引文件,而硬链接没有,所以软链接多了一个索引文件大小。
2.软链接无法直接观察到原始数据的状态,因为他只是个索引文件。
3.硬链接不论多少份都同时反应原始数据变化,大小,修改等都同步。因为都指向源数据。
4.软链接可以跨分区使用,只要指向正确。硬链接不能跨分区使用,因为找不到原始数据。
5.软链接当源文件被删除之后就会处于“失联”无法继续使用。硬链接只要有一个存在都保持存在。
6.软链接因为只是索引,所以可以指向目录或文件。硬链接因为指向数据,所以只能指向文件。
1.如果怕不小心删除一些文件,可以给文件创建硬链接。比如给数据库文件创建硬链接并藏起来,这样如果有人直接删除了数据库文件,只要另一个硬链接存在,数据层就不会被删除,空间也不会被施放。格式化除外。等于,给文件上保险。
2.多人协同。给一个文件做多个硬链接分给每个人,同时编辑,所有人操作都生效。因为都是在改原始数据。