一、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. (十一)QPainter绘图, QPixmap,QImage,QPicture,QBitmap

    #include "widget.h" #include "ui_widget.h" #include <QPainter> #include &l ...

  2. iis7设置ftp

    目前是所有网站一个域下.ftp登录后可看到所有网站,目前想ftp一个网站,查看了下服务器,貌似只有serv-u这么个东西,还不能再创建第二个域.不得其解.百度发现两篇文章正好: http://blog ...

  3. Docker-CentOS7-安装

    yum install -y docker 可以看到,已经安装上docker了,并且没有报什么错误 启动docker,并查看运行状态 停止docker,并查看运行状态 启动完 docker后,可以查看 ...

  4. web故障排查常用命令

    整理总结了一些常用分析网站的命令方便大家快速定位故障所在排除故障,最小化的减少故障给业务带来的影响. 端口连接类 1.查看TCP连接状态 netstat -nat |awk '{print $6}'| ...

  5. SpringCloud笔记七:Zuul

    目录 什么是Zull 为什么需要Zuul 新建Zuul项目 运行Zuul Zuul的基本配置 忽略微服务的真实名称 设置统一公共前缀 总结 什么是Zull Zuul就是一个网关,实现的功能:代理.路由 ...

  6. PHP数组函数详解大全

    一.数组操作的基本函数 数组的键名和值 array_values($arr);获得数组的值 array_keys($arr);获得数组的键名 array_flip($arr);数组中的值与键名互换(如 ...

  7. 使用Sales_data类

    写一段程序程序实现求两次交易相加结果的功能.程序的输入是下面这两条交易记录: 0-201-783456-X 3 20.00 0-201-783456-X 3 25.00 程序的结构如下: #inclu ...

  8. app接口中Http请求头示例

    POST /v5/simProduct/getProductDetails HTTP/1.1 Accept:image/jsonHost: netroam.mihome.xiaomi.netUser- ...

  9. [转]在static代码块或static变量的初始化过程中使用ServiceManager提供的api的陷阱

    一. 案例 1.源码: /** @hide */ private TelephonyManager(int slotId) { mContext = null; mSlotId = slotId; i ...

  10. spring cloud--zuul网关和zuul请求过滤

    这里仍然以Windows和jdk为运行环境,按照下面的步骤打包-运行-访问就能看到效果.启动项目jar包: java -jar F:\jars-zuul\register-0.0.1-SNAPSHOT ...