linux的软链接和硬链接

  在linux的文件存储系统中,文件主要被分为两个部分,用户数据(文件中存的真实内容,就是我们cat时看到的内容,此处为个人理解可能会有偏差)以及元数据(metadata)。而元数据记录的则是文件的附加属性,如文件大小、创建时间、所有者信息、inode等,inode就是linux文件系统中的索引节点号,是文件在系统中的唯一标识,文件名只是给人看的。系统通过文件名打开文件的方式为:filename -> inode -> data blocks,其中data blocks就是用户数据。
  对于系统中的文件,为了解决共享问题,Linux引入了硬链接(hard link)和软链接(软链接soft link又称为符号链接)。
  如何区分软链接和硬链接呢?对于文件而言,其实filename -> inode这个链接可以理解为一个硬链接,即本身文件名和inode之间的关联就是一种硬链接,由于inode才是文件的唯一标识,所以没新增一个硬链接,就是新增了一个filename->inode的关联,例如对~/local/core.log新增一个硬链接:

ln ~/local/core.log ~/hard/link/core.log

此时查看文件的信息:

ll -i core.log
2492555 -rw-r--r-- 2 root root 0 Aug  9 20:21 core.log

以上的第三列2就是硬链接数量,这里为2说明出了文件本身以外还有一个硬链接!而第一列内容就是inode的值,对比发现这两个硬链接的inode应该是一样的,说明他们指向的是同一个文件!
  对于某一个文件的硬链接数,只要文件的硬连接数不为0,则即便删除任意的硬连接数对真正的文件数据都不会有影响,只有这个文件inode的硬连接数变为0才会导致这个文件真正的被删除,所以就有可能会出现某些同学说的:我特么明明删除了文件啊,为啥空间没有释放???遇到空间未释放也许就是这个文件在别的地方还有硬链接!
  那么有人肯定会问,我文件删除后,如何判断是否是因为这个文件还有硬链接而导致空间未释放的呢?方法如下:
a> 查询这个已删除文件的inode:

$ lsof|grep deleted|grep filename
java        685      root  258r      REG               8,48      60686  108266852 filename (deleted)
--More--

以上filename前面一列就是这个文件的inode,有了这个inode之后,就可以查询它的硬连接数了:

$ find / -inum inode

这样如果查询到没有说明不是因为硬连接数导致空间未释放,一般这种情况下就是因为有程序占用了文件而导致的。(由于本文引出来的原因就是因为这个,所以写着写着好像有点偏题了。。)
  以上说明了硬链接和inode的关系,而对于软链接可以理解为window下的快捷方式,软链接中其实记录的是对应文件的路径,通过硬链接找文件时,是直接hard link->inode,而通过软链接找文件则是soft link->filename(hard link)->inode。软链接删除不会对文件有任何影响,而且文件inode对应的文件删除会导致软链接失效,另外软链接还可以跨系统而硬链接只能在一个系统之下!

你可能感兴趣的:(Shell)