一、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. centos7服务器配置nuxt部署环境

    一.安装node(默认安装在根目录下) 1.首先安装wget yum install -y wget 2.下载最新nodejs安装包 wget https://nodejs.org/dist/v10. ...

  2. [SDOI2013]森林 主席树+启发式合并

    这题的想法真的很妙啊. 看到题的第一眼,我先想到树链剖分,并把\(DFS\)序当成一段区间上主席树.但是会发现在询问的时候,可能会非常复杂,因为你需要把路径拆成很多条轻链和重链,它们还不一定连续,很难 ...

  3. 你不得不用的MAC软件开发工具软件,个个万里挑一

    作为软件行业,尤其是程序员,Mac上都不得不安装一些必备的MAC软件开发工具软件,下面给大家分享一些必装的MAC软件开发工具软件,以备日后之需,有备无患. 其中,包含各种语言的主流 IDE.开发辅助. ...

  4. kubernetes之监控Operator部署Prometheus(三)

    第一章和第二章中我们配置Prometheus的成本非常高,而且也非常麻烦.但是我们要考虑Prometheus.AlertManager 这些组件服务本身的高可用的话,成本就更高了,当然我们也完全可以用 ...

  5. CMake快速入门

    参考: https://www.hahack.com/codes/cmake/ 1. 单目标文件 main.c #include <stdio.h> #include <stdlib ...

  6. Java JPS找不到正在执行的java进程 jps cannot see running java process

    最近磁盘进展,把临时目录/tmp给全删了,结果发现jps的输出为空,找不到正在运行的jvm进程. 但是新建的进程没有问题,能够正常查看: [root@node-master ~]# ps -e|gre ...

  7. javascript浏览器事件

    1.  Js浏览器对象层级结构:Window 窗口对象(location地址对象.document文档对象(Form表单对象(表单控件))) 2.  Window对象属性: 名称 描述 documen ...

  8. Linux-ubuntu16.04安装 mysql5.7-PHP7.0+Swoole

    步骤1 – 安装MySQL 在 Ubuntu 16.04 中,默认情况下,只有最新版本的 MySQL 包含在 APT 软件包存储库中.只需更新服务器上的包索引并安装默认包 apt-get. sudo ...

  9. [转] 图解Seq2Seq模型、RNN结构、Encoder-Decoder模型 到 Attention

    from : https://caicai.science/2018/10/06/attention%E6%80%BB%E8%A7%88/ 一.Seq2Seq 模型 1. 简介 Sequence-to ...

  10. JAVA_Sprint学习(一)

    保存用户信息的编程思维 传统的思想,就是建立一个类之后,然后将用户的姓名和密码,以及添加用户等操作都放在一个main中, 按照抽象编程的思想而言, 首先建立一个类User,用来是表示用户的具体信息Us ...