对Inode、Hard Link以及Soft Link的理解
一、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的理解的更多相关文章
- 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. ...
- 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 ...
- 转载: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 ...
- Symbolic link and hard link的区别(linux)
--Symbolic link and hard link的区别(linux) --------------------------------------------------2014/06/10 ...
- Windows中的硬链接和软链接(hard link 和 Symbolic link)
先来了解一下Linux中的硬链接和软链接: Linux中的硬链接和软链接 Windows中的硬链接和软链接: 硬链接 从Windows NT4开始,NTFS文件系统引入了HardLink这个概念,它让 ...
- 菜鸟学Linux - Hard Link与Symbolic Link
在学习Hard Link与Symbolic Link之前,需要大概了解一下inode与data block.在Linux的文件系统中,一个文件对应一个inode与若干个data block.inode ...
- Expo大作战(八)--expo中的publish以及expo中的link,对link这块东西没有详细看,大家可以来和我交流
简要:本系列文章讲会对expo进行全面的介绍,本人从2017年6月份接触expo以来,对expo的研究断断续续,一路走来将近10个月,废话不多说,接下来你看到内容,将全部来与官网 我猜去全部机翻+个人 ...
- linux shell symbolic link & soft link, symbol link, link
linux shell symbolic link symbolic link https://en.wikipedia.org/wiki/Ln_(Unix) https://stackoverflo ...
- Linux文件链接hard link与symbolic link
Linux中文件链接有两种方式,一种是hard link,又称为硬链接:另一种是symbolic link,又称为符号链接.要区分两者的不同要回顾Linux常用的ext2文件系统.这种文件系统使用in ...
随机推荐
- 经典面试题-python函数之默认参数
1.可变的默认参数----list 示例: def add(a, mylist=[]): # print(id(mylist)) mylist.append(a) return mylist pri ...
- Spring -bean的装配和注解的使用
一,bean的装配 bean是依赖注入的,通过spring容器取对象的. 装配方法有: 前面两种没什么好讲的,就改改参数就好了. 这里重要讲注解. 注解的主要类型见图,其中component是bean ...
- 第六周博客作业<西北师范大学|李晓婷>
1.助教博客链接:https://home.cnblogs.com/u/lxt-/ 2.作业要求链接:https://www.cnblogs.com/nwnu-daizh/p/10569690.htm ...
- Lending Club贷款数据分析
python信用评分卡(附代码,博主录制) https://study.163.com/course/introduction.htm?courseId=1005214003&utm_camp ...
- python小练习: 给定一个数组 按重复次数 降序排列输出 数组非空且为正整数
假设有个列表 a=[1,1,1,2,2,4,5,5,5,5] (非空且为正整数) 那么根据要求 最终输出的形式为 5,1,2,4 (按重复次数 降序排列输出) 代码实现及解释: a=[1,1,1 ...
- Kindle复活记
此前,2015年为了配合拆机堂的内容项目,我们将全新Kindle PaperWhite 3进行全球首拆,让网友们第一时间全面了解了Kindle PaperWhite 3的内部构造.但由于进行深度拆解, ...
- vue keep-alive内置缓存组件
1.当组件在keep-alive被切换时将会执行activeted和deactiveted两个生命周期 2.inlude 正则表达式或字符串 ,只有符合条件的组件会被缓存 exclude正则表达式或字 ...
- easyui datagrid使用按钮
$('#datagrid').datagrid({ border:false, fitColumns:true, singleSelect: true, url:url, columns:[[ {fi ...
- Maven - <Profile>详解
转载自:https://www.cnblogs.com/wxgblogs/p/6696229.html Profile能让你为一个特殊的环境自定义一个特殊的构建:profile使得不同环境间构建的可移 ...
- mysql GTID
之前一直通过binlog主从同步,现在发现GTID这种方式,记录一下,具体可参考网上教程.感觉配置使用更为简单方便,不知实际效果如何.