一、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. Java集合的总结

    参考博客: http://www.jianshu.com/p/63e76826e852 http://www.cnblogs.com/LittleHann/p/3690187.html https:/ ...

  2. HAOI2019+十二省联考 游记

    Day1 T1 考前还奶了一口不会考01Trie的,也就没有学,然后60分BOOM T2 不会SAM,告辞,30分滚粗 T3 传统实现题答?2p,2u,2g分别对应素数,莫比乌斯函数,原根?没看出来, ...

  3. DTW和DBA

    DTW(动态时间调整) 动态时间调整算法是大多用于检测两条语音的相似程度,由于每次发言,每个字母发音的长短不同,会导致两条语音不会完全的吻合,动态时间调整算法,会对语音进行拉伸或者压缩,使得它们竟可能 ...

  4. JS的去抖、节流

    去抖(debounce) 在事件被触发n秒后再执行回调,如果在这n秒内又被触发,则重新计时. //模拟一段ajax请求 function ajax(content) { console.log('aj ...

  5. ioctl函数

    一.函数原型 #include <unistd.h> int ioctl(int fd, int request, .../* void *arg */); 二.和网络相关的请求(requ ...

  6. Python——将高德坐标(GCJ02)转换为GPS(WGS84)坐标

    # 官方API: http://lbs.amap.com/api/webservice/guide/api/convert # 坐标体系说明:http://lbs.amap.com/faq/top/c ...

  7. Window7 定制 Explore中的右键菜单

    win+R 命令  运行 regedit ,打开注册表 在  HKEY_CLASSES_ROOT\*\shell\VisualCode下创建针对文件的新增命令 command 在HKEY_CLASSE ...

  8. important的妙用解决firefox和ie的css兼容问题

    设置css的min-height属性.min-height在Firefox里有效,但IE无法识别.下面有个不错的解决方案,大家可以参考下 对于某些内容可变的层(比如用户评论),我们希望它有个最小的高度 ...

  9. C# 学习之路--百度网盘爬虫设计与实现(一)

    百度网盘爬虫 现在市面上出现了很多网盘搜索引擎,写这系列博文及爬虫程序的初衷: 更方面的查找资源 学习C# 学习爬虫的设计与实现 记录学习历程 自我监督 能力有限,如有不妥之处,还请各位看官点评.同在 ...

  10. python序列化与反序列化(json与pickle)

    在python中,序列化可以理解为将python中对象的编码格式转换为json(pickle)格式的字符串,而反序列化可以 理解为将json(pickle)格式的字符串转换为python中对象的编码格 ...