当前位置:  技术问答>linux和unix

关于硬链接的不能链接目录 的疑惑 。

    来源: 互联网  发布时间:2016-09-25

    本文导语:  书上是这样写的:inode 会链接到block块,而“目录”本身仅消耗inode,这样硬链接就不能链接目录 。 这里说的目录 本身消耗inode。意思是说目录 不占用存储空间?所以硬链接就不能链接目录 ? | ...

书上是这样写的:inode 会链接到block块,而“目录”本身仅消耗inode,这样硬链接就不能链接目录 。
这里说的目录 本身消耗inode。意思是说目录 不占用存储空间?所以硬链接就不能链接目录 ?

|
linux系统中的硬连接有两个限制:不能跨越文件系统和不允许普通用户对目录作硬连接。至于第一个限制,很好理解,而第二个就不那么好理解 了。 对任何一个目录用ls -l 命令都可以看到其连接数至少是2,这也说明了系统中是存在硬连接的,而且命令ln -d 也可以让超级用户对目录作硬连接,这些都说明了系统限制对目录进行硬连接只是一个硬性规定,并不是逻辑上不允许或技术上的不可行。那么操作系统为什么要进 行限制呢?答案可能有两个。

  先来说第一个,如果引入了对目录的硬连接就有可能在目录中引入循环,那么在目录遍历的时候系统就会陷入无限循环当中。也许您会说,符号连接不也可以引入循 环吗,那么为什么不限制目录的符号连接呢?原因就在于在linux系统中,每个文件(目录也是文件)都对应着一个inode结构,其中inode数据结构 中包含了文件类型(目录,普通文件,符号连接文件等等)的信息,也就是说操作系统在遍历目录时可以判断出符号连接,既然可以判断出符号连接当然就可以采取 一些措施来防范进入过大的循环了,系统在连续遇到8个符号连接后就停止遍历,这就是为什么对目录符号连接不会进入死循环的原因了。但是对于硬连接,由于操 作系统中采用的数据结构和算法限制,目前是不能防范这种死循环的。

  在说明第二个原因之前,先来看看文件的dentry结构在系统空间中长什么样子和它们是怎么存放在系统空间的。dentry结构主要包含了文件名,文 件的inode号,指向父目录dentry结构的指针和其他一些与本次讨论无关的指针,这里关键是那个指向父目录的指针;系统中所有的dentry结构都 是按杂凑值存放在杂凑表中的,这里的杂凑算法很重要,它是取文件名和文件的父目录dentry结构的地址一起杂凑运算出杂凑值的。现在假设有两个目录 /a和/b,其中/b是我们通过ln -d命令建立起来的对/a的硬连接。这个时候内核空间中就会存在一个/a的dentry结构和一个/b的dentry结构,由上面的知识可知,/a和/b 目录下面的每一个文件或目录都各自有对应的dentry结构(因为虽然/a目录下面的文件名没有改变,但是因为dentry结构有指向父目录dentry 的指针和计算杂凑值时考虑了父目录dentry结构的地址,这个时候dentry结构就分身乏术了),而且这种继承还会影响到所有子目录下面的文件,这样 下来就会浪费很多系统空间了,特别是如果被硬连接的目录中存在大量文件和子目录的时候就更加明显了。这也许是第二个原因。


|
一楼讲的比较详细,
我根据我学的再赘述几句
 文件分两种,普通文件和目录文件。文件的数据存放也分两种,inode和Block,Block是存储数据的真实区域,而inode是存储文件相关信息的区域,查找文件的时候,先查找inode,比如/etc/apt/sources.list ,根据inode找到相应的Block区块的位置,然后去读取数据。
  上面所述的查找过程仅适用于普通的文件,如文本文件,但是不适用于目录,因为目录只有inode区块,没有Block区块。
   硬链接是重复的建立一个inode区域,对应于原来的Block区块,但是目录是没有Block区块,所以不能链接。
  硬链接的限制:
  1.不能跨文件系统,因为不同的文件系统有不同的inode table
  2.不能链接文件目录
  
如有不对的地方,欢迎指出

|
目录用软链接。
ln -sf dir1 dir2

有多个链接,指一块文件体,可以有多个stat指引。硬链接实际是多stat都是真实的。软链接可能就是一个说明文件,象DOS的批处理文件或Linux的脚本。
我可能辞不达意,有些专业用词不知是否得当,希望各位能懂意思。

    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • HTML 5 <base> 标签-规定页面中所有链接的基准 url
  • 如何在一个静态链接库中链接另一个静态链接库?
  • HTML 5 <a>定义超链接标签
  • 未使用链接器输入文件,因为链接尚未完成
  • HTML 超链接详细介绍
  • 讨论一下UNIX中的硬链接与符号链接
  • HTML URL 链接 ( 统一资源定位器 )定义及用法详细介绍
  • linux中静态链接库调用了另一个静态链接库
  • 操作系统 iis7站长之家
  • 如何判断是否是硬链接 或者是软链接 还是源文件
  • 链接器链接目标文件和printf.o是怎么连接的
  • 编译静态链接库,其中使用了其它链接库,该如何写makefile
  • 动态库链接 变为 静态库链接问题
  • .a文件的动态链接和静态链接问题
  • linux中都有哪些链接方式,创建链接的命令是什么?
  • 什么是符号链接,什么是硬链接?他们的区别是什么?
  • 怎样在点击某个链接时弹出YES/NO对话框?只有yes时才进入此链接。
  • linux下静态库使用:"未使用链接器输入文件,因为链接尚未完成"
  • linux下什么函数是用来“创建软链接和硬链接的呢“有么,今天突然想到这个问题。。
  • jquery代码-在弹出窗口中打开链接和在选项卡中打开链接
  • 急:请问SSH2链接是什么意思?在windows终端怎样具体操作来通过SSH2链接管理linux服务器?


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3