一、EXT2/EXT3等文件系统的分区格式

  Linux的文件系统从EXT2开始将文件的属性和文件的实际内容分开存储,文件的属性由inode存储,文件的内容由block存储。

  系统在对磁盘进行分区格式化的时候,分区被以block大小为单位分割成多个块,block的大小可以为1KB、2KB或4KB;分区里的各个块被统一编号,然后被划分成各个区域,图1描述了一个分区的划分情况:

图1 分区划分情况

  各区域解释:

  Boot Sector:启动扇区,利用这个多个分区的启动扇区可以实现多系统。

  Block Group:区块群组,由于文件系统可能很大,达到上百GB,将所有的inode和block放在一起管理是不明智的;因此ext2/ext3等文件系统将分区内的inode和block分成多个区块群组(Block Group),分开管理;区块群组内包含Super Block、Partition Description、Block Bitmap、Inode BitMap、Inode Table、Data Block;其中Super Block在第一个区块群组内一定存在,在后续的区块群组内则可能存在也可能不存在,如果存在,则是作为第一个区块群组内的Super Block的备份。

  Filesystem Description:分区文件系统的描述区块,用于描述各个Block Group开始与结束的block块号,以及描述每个Block Group内各个区段的开始与结束的block块号。

  Block BitMap:block位图,用于判断Data Block内哪些Block已经被使用,哪些Block处于空闲状态可以使用。

  Inode BitMap:inode位图,用于判断Inode Table内哪些inode已经被使用,哪些inode处于空闲状态可以使用。

  Inode Table:inode表,用于存放inode,inode是一个数据结构,其中存储了目录或文件的各种属性以及block块号;各个inode也被统一编号。

  Data Block:用于保存文件以及目录实际内容的block所在的区域。

二、EXT2/EXT3等文件系统中目录与文件的存储

  在ext2/ext3等文件系统中,目录的存储和文件的存储形式差别不大:每一个目录和文件都对应一个inode,每个inode都指向一个或多个block;目录的inode指向的block内存储的是目录下的子目录名或文件名与相应的inode的对应关系,如图2中2号和65531号等inode;文件的inode指向的block存储文件的实际内容,如图2中787883号和788042号等inode。

  图2是根据一个实际的Linux系统作出的一个示意图,图中的淡绿色区域代表图1中的Inode Table区域,淡蓝色区域代表图1中的Data Block区域,图中块的大小和块的数量不代表实际情况。这个文件系统挂载到了“/”目录上,一般一个文件系统最顶层的inode编号为2,这里2号inode指向的block区域中存储了“/”目录下的子目录名以及文件名和它们对应的inode编号,其中的“vmlinuz.old”是一个软链接文件,它对应的inode指向的block存储了所链接的文件的相对的路径。

图2 文件系统存储方式示意图

三、软链接与硬链接

  如上所述,每个目录或文件都对应一个inode,但是它们对应的Inode也有可能为同一个inode;在同一个文件系统中,如果两个或多个文件的Inode相同,则可以称它们互为彼此的“硬链接”。

  硬链接是某个目录的inode指向的block区域中的一条记录,这个记录的inode部分的值与相同文件系统内的某个目录下的一条或多条记录的inode部分的值相同。因而,创建一个硬链接就是在某个表中增加一条记录,不会消耗inode,一般也不会消耗block的数量,除非当前存储记录的block满了,重新找一块block来记录这条记录。

  对于硬链接有两个地方值得注意:

  1.硬链接不能跨文件系统:一般情况下,Linux系统不能区分来自不同文件系统的相同的Inode编号,一个文件的Inode号码只能是自己所在的文件系统内的Inode的编号。例外的情况是挂载点的Inode,当一个文件系统挂载到某个挂载点时,系统会屏蔽其原有的Inode,然后记录这个挂载点和文件系统的对应关系,当使用到这个挂载点时,系统能根据记录找到正确的文件系统。

  2.不能创建目录的硬链接:从图2中看,在某一个目录的Block块中增加一条记录,该记录的Inode编号为某个目录的Inode编号是可行的,但是这样有可能在文件树中形成环,导致很多依赖遍历文件树的程序无限循环下去,因此目前为止,不能创建目录的硬链接。

  图2中,“/home/”目录下的.bashrc文件和hard_bashrc文件指向同一个Inode:788041,hard_bashrc是在“/home”目录下通过命令:”ln .bashrc hard_bashrc“建立的。

  软链接是一个新的文件,该文件中记录了一个文件或目录的路径。如果查看软链接文件的大小,会发现为它记录的路径字符串的大小。创建一个软链接会生成一个新的文件,因此会消耗inode和block的数量。

  软链接文件会被标记为“链接文件”,程序使用它时,会根据它记录的路径去找到真正的文件;因此既可以创建目录的软链接也可以跨文件系统创建软链接。

  图2中“/home/“目录下的”soft_bin“文件为“/bin”这个目录的软链接,这个文件是在“/home/”目录下通过命令:“ln -s /bin ./soft_bin"创建的。

本文更新地址:http://www.cnblogs.com/0x4863/p/7257507.html

对Inode、Hard Link以及Soft Link的理解的更多相关文章

  1. Difference between a Hard Link and Soft (Symbolic) Link

    Within the Unix/Linux file system, linking lets you create file shortcuts to link one or more files. ...

  2. Linux / UNIX create soft link with ln command

    How to: Linux / UNIX create soft link with ln command by NIXCRAFT on SEPTEMBER 25, 2007 · 42 COMMENT ...

  3. 转载:Linux: What’s the difference between a soft link and a hard link?

    Link:https://www.moreofless.co.uk/linux-difference-soft-symbolic-link-and-hard-link/ This example sh ...

  4. Symbolic link and hard link的区别(linux)

    --Symbolic link and hard link的区别(linux) --------------------------------------------------2014/06/10 ...

  5. Windows中的硬链接和软链接(hard link 和 Symbolic link)

    先来了解一下Linux中的硬链接和软链接: Linux中的硬链接和软链接 Windows中的硬链接和软链接: 硬链接 从Windows NT4开始,NTFS文件系统引入了HardLink这个概念,它让 ...

  6. 菜鸟学Linux - Hard Link与Symbolic Link

    在学习Hard Link与Symbolic Link之前,需要大概了解一下inode与data block.在Linux的文件系统中,一个文件对应一个inode与若干个data block.inode ...

  7. Expo大作战(八)--expo中的publish以及expo中的link,对link这块东西没有详细看,大家可以来和我交流

    简要:本系列文章讲会对expo进行全面的介绍,本人从2017年6月份接触expo以来,对expo的研究断断续续,一路走来将近10个月,废话不多说,接下来你看到内容,将全部来与官网 我猜去全部机翻+个人 ...

  8. linux shell symbolic link & soft link, symbol link, link

    linux shell symbolic link symbolic link https://en.wikipedia.org/wiki/Ln_(Unix) https://stackoverflo ...

  9. Linux文件链接hard link与symbolic link

    Linux中文件链接有两种方式,一种是hard link,又称为硬链接:另一种是symbolic link,又称为符号链接.要区分两者的不同要回顾Linux常用的ext2文件系统.这种文件系统使用in ...

随机推荐

  1. 自定义滚动条样式-transition无效

    问题 需求是自定义滚动条样式,然后2秒内无操作隐藏滚动条. 2s内隐藏比较麻烦,不能用css实现,只能监听容器的touch事件,然后给滚动条加个opacity: 0的class. .class::-w ...

  2. Java:IO流-流的操作规律和转换流

    首先我们先来了解一些IO流基本知识. 一,基本知识概括 具体的IO流有很多种,针对不同的应用场景应该使用相应的流对象.但怎么确定应该使用哪个IO流对象呢? 一般要有四个明确: 1)明确源和目的 源:I ...

  3. 异常值处理outlier

    python信用评分卡(附代码,博主录制) https://study.163.com/course/introduction.htm?courseId=1005214003&utm_camp ...

  4. Jenkins Sonar

    sonar简介 SonarQube是 一个开源的代码质量分析平台,便于管理代码的质量,可检查出项目代码的漏洞和潜在的逻辑问题.同时,它提供了丰富的插件,支持多种语言的检测, 如 Java.Python ...

  5. mysql之binlog

    binlog 基本认识 MySQL的二进制日志可以说是MySQL最重要的日志了,它记录了所有的DDL和DML(除了数据查询语句)语句,以事件形式记录,还包含语句所执行的消耗的时间,MySQL的二进制日 ...

  6. 移动开发day4_京东移动页面

    复习 父项身上有哪些属性 可以设置 主轴方向 fd flex-direction : row; column; 主轴子项的排列方式 j justify-content: flex-start;flex ...

  7. J.U.C-volatile

      禁止指令重排  

  8. luasocket编译安装遇到的坑

    由于需要获得本机的IP地址,所以需要 : local socket = require('socket') local server_hostname = socket.dns.gethostname ...

  9. k-means cluster images

    说明 慕课网上例子,使用k-means算法分类图片, 此处调试运行通过, 并添加包管理内容, 使得其他同学容易运行. 例子地址: https://github.com/fanqingsong/clus ...

  10. 错误: ‘shared_ptr’ in namespace ‘std’ does not name a type的解决方法。

    这是因为要使用C++11的标准编译,而catkin_make时无法识别出来. 修改方法是在CMakeLists.txt文件里面添加: set(CMAKE_CXX_FLAGS "${CMAKE ...