Linux中的文件有两种数据:
用户数据
元数据(metadata)
用户数据就是数据block。
元数据包含inode、用户名、时间,大小等信息。
其中inode是文件的唯一标识。
//创建一个硬链接
ln 葵司.avi Java学习第一课.avi
//查看一下文件的信息
1048578 -rw-r--r-- 2 root root 0 Feb 24 03:04 Java学习第一课.avi
1048578 -rw-r--r-- 2 root root 0 Feb 24 03:04 葵司.avi
//这两个文件的inode号一样,根据上面的定义,实际上是一个文件
//这里我们举个例子来说明一样
//孙悟空有很多名字,比如说,孙行者,齐天大圣,弼马温
//当年如来把孙悟空压在了五指山下时候
//孙行者,齐天大圣,弼马温都在五指山下
//因为它们都是孙猴子的名字
//所以,这里我们对葵司.avi写入一些东西,那么看Java学习第一课.avi也应该会出现一样的内容
vi 葵司.avi #写入1234
more Java学习第一课.avi
#1234
//现在菩提老祖说,你弃道从佛,孙悟空这个名字你就不要用了。
//那么现在。孙猴子是不是死了,从世界消失了。
//显然没有,只是名字少了一个而已。
rm 葵司.avi
ls -il
#1048578 -rw-r--r-- 1 root root 5 Feb 24 03:13 Java学习第一课.avi
1048578这个还在,说明文件还在。
//Linux删除具体的机制是什么呢?
//文件接删除的时候,系统调用会检查inode link count的数值,
//如果他大于等于1,那么inode不会被回收。因此文件的内容不会被删除。
//原来inode link count是2
//删掉一个还剩1,所以文件内容不会被删除,数据块还在
上图是通过文件名查看文件内容的方式,先文件名,然后是其inode,然后找到inode索引的数据块。
//创建一个软链接
ln -s 葵司.avi 葵司quick.avi
ls -li
#1048578 -rw-r--r-- 2 root root 5 Feb 24 03:13 Java学习第一课.avi
#1048578 -rw-r--r-- 2 root root 5 Feb 24 03:13 葵司.avi
#1048589 lrwxrwxrwx 1 root root 10 Feb 24 03:30 葵司quick.avi -> 葵司.avi
发现inode号变了,我们知道inode号是文件的唯一标识。
inode号一变,就说明是一个全新的文件
软链接文件找到inode,然后找到数据块
数据块里面存的是原文件的信息
再通过原文件找到原文件的inode号。
所以如果删了原文件,那么根据这个文件建立的软链接也将会失效了。
rm 葵司.avi
more 葵司quick.avi
#more: stat of 葵司quick.avi failed: No such file or directory
最后是一些总结:
硬链接:
文件有相同的 inode 及 data block;
只能对已存在的文件进行创建;
不能交叉文件系统进行硬链接的创建;
不能对目录进行创建,只可对文件创建;
删除一个硬链接文件并不影响其他有相同 inode 号的文件。
软链接:
软链接有自己的文件属性及权限等;
可对不存在的文件或目录创建软链接;
软链接可交叉文件系统;
软链接可对文件或目录创建;
创建软链接时,链接计数 i_nlink 不会增加;
删除软链接并不影响被指向的文件,但若被指向的原文件被删除,则相关软连接被称为死链接(即 dangling link,若被指向路径文件被重新创建,死链接可恢复为正常的软链接)。
硬链接由于不生成新文件,不现实原文件路径(只能通过inode去找),所以安全,节省空间。
但是我们一般使用的时候,还是软链接多。