zoukankan      html  css  js  c++  java
  • 硬连接和软连接的区别

    简述

    我们都知道,在linux系统中,本质上是通过inode(index node)来对文件进行访问(或者说数据控制)的。linux的人性化设置,使得平时我们可以通过文件名来访问文件。其实吧,不是一般性的说,文件名,就是inode的别名。


    认识目录项,inode以及block

    这里有几个简单的知识点:

    1. 一个文件可以被存储在一个或者多个block中;
    2. 每个文件都会并且只能占用一个inode,inode可以指向该文件所在的block,inode中还存储该文件的各种属性,如rwx...;
    3. 想读取该文件,必须经过目录项的文件名来指向到正确的inode号码才能读取。

    看到这里,该提出两个问题了:

    1. 什么是目录项?当新建一个目录时,文件系统会分配一个inode和至少一块block给该目录。其中,inode记录该目录的相关权限和属性,并记录分配到的那块block号码。而block则是记录在这个目录下的文件名和这些文件名所对应的inode号码数据,这就是我们所说的数据项
    2. 当几个不同文件名,指向同一个inode号码时,会发生什么事?这就引出了我们要说的内容了,硬连接(hard link)和软连接(symbolic link).
      这幅图可以完美说明这一切:

      为了应题,我把目录项的内容用红色框框出来了。其余那些文件属性是在文件inode中读取出来的。

    过程我简单描述一下(这是我个人理解,还有很多细节没写)
    系统通过挂载信息找到"/" --> 目录项inode --> 目录项block(block中存有文件名和文件对用的inode,如上图中的python对应inode号码1165874) --> 找到文件inode,验证文件权限和属性 --> 访问文件block(block里存有文件数据)。


    硬连接和软连接

    其实,硬连接和软连接的区别很简单的,下图可以清晰说明了:

    可以很清楚看到,文件名pythonpython2.4的inode是一样的,而且,在蓝色框那里,它们对应的数字都是2(这个2就是连接数)。没错,这就是硬连接
    剩下的便是python2 -> python了,它的连接数为1,同时它的inode不同于其他的,但它指向了python,也就是说,inode号码1156324指向了一个block,这个block内存有找到inode号码1165874的信息,这便是软连接,有很多人都说它就像windows上的快捷方式。


    硬连接的限制

    其他关于硬连接和软连接的,网上一大把了。这里我再说一下硬连接的两个主要限制:

    1. 不能跨文件系统。由于指向的是同一个inode,不同文件系统对inode的定义也不同。
    2. 不能连接到目录。如果你为/etc创建一个硬连接/etc_hard,那么,/etc文件下的所有文件名也要同/etc_hard创建硬连接。每次修改/etc,系统也要修改/etc_hard.这样,会造成很大的系统开销。所以,目前还没实现对目录进行硬连接。

    版权声明:保留所有权,转载需声明出处。


  • 相关阅读:
    删除系统盘符
    响应式设计 @media
    精通CSS 学习笔记
    兼容性
    css border-collapse
    angular.js学习 ui-router 0.2.15
    javascript的简易发布/订阅模式
    javascript 切换上下文,事件绑定中改变this指向
    SpringMVC:提交日期类型报400错误解决方法
    解决Spring Mvc中接受参数绑定重名的方法
  • 原文地址:https://www.cnblogs.com/busui/p/7201815.html
Copyright © 2011-2022 走看看