Linux inode

article/2025/10/2 23:02:05

                                          

        之前写了一篇Linux的文件描述符博客,是针对打开的文件来说的。那么如果一个文件没有被打开呢?存在哪里呢?又怎么存储?今天让我们一起来坐上"贼船"到知识的海洋中学习吧~

目录

磁盘

什么是磁盘?

磁盘vs线性结构

磁盘管理

Data block

inode Table 

inode Table和Data block关系 

inode Bitmap 

Block Bitmap

补充&总结 

软连接

创建软连接

删除软链接

硬链接

创建硬链接

删除硬链接 

软链接和硬链接区别 

补充

彩蛋&问题


磁盘

       一个被打开的文件是要被加载到内存中,进而创建进程的。那么没有被打开的文件是要被存储到磁盘上。

文件 = 文件内容 + 文件属性。也就是说,一个空文件,也是有属性数据的,在磁盘上存储,也是要占空间的。

什么是磁盘?

磁盘是我们计算机中的一个机械设备(例如:SSD、FLASH卡、u盘)。

在这里,我们以机械硬盘为例:

                         

 盘面的正反面都可以写数据,同时盘面这里是一摞的,有很多个盘面,实物图没展现出来。

 我们再来找个图形象化一点:

       我们就可以通过找到具体的盘面,在盘面上找到特定的磁道, 在磁道上找到对应的扇区,我们就可以定位一个存储数据的位置。就像三维坐标系的(x,y,z)一样。

我们可不可以把盘片想象成线性的结构?

磁盘vs线性结构

不知道老铁们还记不记得小时候我们玩过的磁带:

                                 

       磁带里面有一卷磁条(盘面形状),上面是可以存储数据的,我们可以把它拉出来,发现它是线性结构的。就可好比磁盘,我们能不能也把它拉出来,也变成线性结构呢?

       我们可以看到,盘面可以被展成线性结构,LBA是对应的扇区地址,同时他可以被转换成对应的实际物理地址,找到硬件上对应扇区存储数据的位置。 

所以到这里,基本的硬件知识大概了解一下就好。接下来才是我们的重点。

磁盘管理

       我们知道一个磁盘的空间是很大的,管理成本也就变得非常高了。磁盘是怎么应对这种情况呢?分区!

由上图我们可以看到,我们把大磁盘分为若干个区,然后给区内写入文件系统,进行管理。

Block Group:ext2文件系统会根据分区的大小划分为数个Block Group。而每个Block Group都有着相同的结构组成。政府管理各区的例子
超级块(Super Block):存放文件系统本身的结构信息。记录的信息主要有:bolck 和 inode的总量,未使用的block和inode的数量,一个block和inode的大小,最近一次挂载的时间,最近一次写入数据的时间,最近一次检验磁盘的时间等其他文件系统的相关信息。Super Block的信息被破坏,可以说整个文件系统结构就被破坏了
GDT,Group Descriptor Table:块组描述符,描述块组属性信息。
块位图(Block Bitmap):Block Bitmap中记录着Data Block中哪个数据块已经被占用,哪个数据块没有被占用
inode位图(inode Bitmap):每个bit表示一个inode是否空闲可用。
inode Table: 存放文件属性 如 文件大小,所有者,最近修改时间等
Data block:存放文件内容。

Data block

存放文件内容。

比如下面结构:

inode Table 

存放文件属性如文件大小,所有者,最近修改时间等。

        inode Table我们也可以看成数组,每个数组里面存放了一个结构体,是用来描述文件属性信息的。我们知道文件 = 文件属性 + 文件内容。

inode Table和Data block关系 

       inode Table的每一个table里面的结构体,一定存储能找到Data block对应文件内容的那一块空间。就好比是int block[3],那么通过它,可以找到该文件在Data block存储的文件内容信息。

inode Bitmap 

每个bit表示一个inode是否空闲可用。

        我们知道了文件属性和文件内容存储位置,那么当我们新创建文件时,怎么确定哪些inode table块被使用了,哪些没有被使用?如果直接遍历inode table的话,效率太低了,于是就设计出位图的形式,通过判断0和1来确定当前空间是否被使用。

我们使用一个inode编号时,把对应的比特位由0置1,就可以了。 

Block Bitmap

Block Bitmap中记录着Data Block中哪个数据块已经被占用,哪个数据块没有被占用。

这个和inode Bitmap很类似,也是用比特位来标记的,本质上也是为了提高效率。

当我们要存储数据时,我们就需要通过Block Bitmap判断是否找到可存储数据的空间。

补充&总结 

目录是文件吗??答案是,是的!目录里面也有数据,但是目录的数据块里面放什么呢?

文件名:inode编号。

所以说,我们创建的所有文件,全部都是在一个特定的目录下!!!

上面讲的都是在Linux系统下,特有的EXT系列的文件系统。

Linux:

文件名在系统层面是没有意义的!这是给用户看的。

Linux中真正标识一个文件是通过inode编号!!一个文件一个inode!

       另外,我们把存储文件属性和文件内容的空间想象成数组,这是为了更加好理解。如果我们存储的数据超过了当前空间块大小,OS会再找一块空间接着储存,同时在上一个空间末尾处加一个指针来指向附加的空间的地址,这样就不会出现我们担心的空间不够情况了,实际上这个细节我们不用去关注。

软连接

创建软连接

ln -s 某路径下的文件 要形成软连接的名字

比如说我们在一个递归比较深的路径下有一个可执行程序test:

我们在当前目录下形成该可执行程序的软连接:

[cyq@VM-0-7-centos test]$ ln -s dir1/dir2/dir3/dir4/test myexe

 我们再来查看一下:

我们来运行一下:

 

我们发现运行成功了,这就好比我们在windows环境下在桌面创建qq的快捷方式。 

删除软链接

我们在这里最好不要使用rm去删除,而是使用unlink:

[cyq@VM-0-7-centos test]$ unlink myexe 

硬链接

创建硬链接

ln + 某路径下的文件 + 创建硬链接的文件名

[cyq@VM-0-7-centos test]$ ln file.txt file_hard

演示:

删除硬链接 

rm就可以直接删除

软链接和硬链接区别 

我们来看2组软链接的inode编号

 我们这时候可以发现,生成的软连接和原来的文件inode不一样,说明生成的软连接是有自己的inode的!

我们来看一组硬链接inode的关系: 

我们发现生成的硬链接和原来的文件的inode一样,说明file_hard就不是一个独立的文件!

总结

软连接是有自己独立的inode的,软链接是一个独立文件!!有自己的inode属性,也有自己的数据块(保存的是指向文件的所在路径+文件名)。

硬链接没有自己独立的inode,硬链接根本就不是一个独立的文件,而是一个文件名和inode编号的映射关系,创建硬链接,本质就是在特定的目录下,填写一对文件名和inode的映射关系。

补充

我们在在命令行上有一串数字,我们今天就可以来了解了:

实际上这个数字也是文件属性,会被保存到该文件对应的inode Table里对应的结构体里面。

也就是我们在上面写的int ref;

 

注意:

这里的删除并不是清空数据,而是把对应的比特位由1置0。这种方法,效率还是很高的~ 

 我们用一个目录为例,看看硬链接数怎么计算的:

我们发现dir目录硬链接数为3,那其余两个呢? 

       我们发现在dir1目录下还有一个.目录,在dir2目录中还有一个..目录 ,他们三个的inode编号都是一样的。

我们就在这里清楚了,创建一个目录,它的硬链接数至少为2。

彩蛋&问题

我们cat test.c就打印出了该文件里面的内容,结合上面知识,这一个指令底层都做了什么? 

        cat test.c后,OS先查看test.c的inode编号,比如1234,然后通过inode编号找到inode Table表里对应的空间,空间里有一个结构体,找到该结构体里面映射的Data Blocks对应的空间的位置block[],该数据块里面存储该文件的内容,然后打印文件内容。

看到这里,支持博主一下吧~


http://chatgpt.dhexx.cn/article/QA4ldjQn.shtml

相关文章

inode结点

一、 机械硬盘 1.1 工作原理 写入时,磁头线圈加电,在周围产生磁场,磁化其下的磁性材料;电流的方向不同,所以磁场的方向也不同,可以表示 0 和 1 的区别。——“电生磁”。 读取时,磁头线圈&am…

什么是inode?

理解inode,要从文件储存说起。文件储存在硬盘上,硬盘的最小存储单位叫扇区(Sector)。每个扇区储存512字节(相当于0.5KB)。操作系统读取硬盘的时候,不会一个个扇区地读取,这样效率太低,而是一次性连续读取多个扇区&…

inode详解

文章目录 什么是inode?inode的内容(inode是一个结构体)block区和inode区的理解inode编号硬链接软连接 什么是inode? 理解inode,要从文件储存说起。 文件储存在硬盘上,硬盘的最小存储单位叫做"扇区&quo…

代码编写流程

文章目录 代码编写步骤好的代码满足条件:注意事项 代码编写步骤 1、分析任务目标,根据目标选择合适的代码设计模式   1.1、创建模式选择   1.2、结构模式选择   1.3、行为模式选择 2、整理思路、画出思维导图、或代码流程图 3、找到其中的关键对象…

代码详解设计模式--模板模式

模板模式 一个抽象类公开定义了执行方法的模板,它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。 优点: 封装不变部分,扩展可变部分。提取公共代码,便于维护。行为由父类控制,子类实现…

GRID-FORM 基于 VUE3 可视化低代码表单设计器

本文开源代码在 GRID-FORM,如能帮到您麻烦给个星哈 楔子 大概 4 年前,我做了一个简单的动态表单功能,开发人员通过 UI 界面配置表单(其实就是添加常用的控件,如文本框、下拉框等)就能向用户提供数据查询&a…

领域驱动实践总结(基本理论总结与分析+架构分析与代码设计+具体应用设计分析V)

目录 领域驱动实践总结三:具体应用设计分析 一、应用项目的基本背景 二、针对项目进行领域驱动的战略设计阶段 (一)事件风暴确定产品愿景 (二)事件风暴进行业务场景分析 场景分析一:请假 用户:…

领域驱动实践总结(基本理论总结与分析+架构分析与代码设计V+具体应用设计分析)

目录 领域驱动实践总结二:架构分析与代码设计 一、微服务架构模型的对比与选择 (一)整洁架构 (二)六边形架构 (三)DDD 分层架构 1.用户接口层 2.应用层 3.领域层 4.基础层 5.从三层架构向 DDD 分…

十二种常见设计模式代码详解

零:设计模式分类 设计模式有创建型模式、结构型模式与行为型模式 创建型:单例模式、工厂模式(简单工厂,工厂方法,抽象工厂)结构型:适配器模式、门面模式、装饰器模式、注册树模式、代理模式、…

优雅代码的秘密,都藏在这6个设计原则中

优雅的代码,犹如亭亭玉立的美女,让人赏心悦目。而糟糕的代码,却犹如屎山,让人避而远之。 如何写出优雅的代码呢?那就要理解并熟悉应用这6个设计原则啦:开闭原则、单一职责原则、接口隔离原则 、迪米特法则…

低代码--低代码开发(LCDP)介绍

低代码开发(LCDP)介绍 1 介绍1.1 概述1.2 行业风向1.3 行业报告1.4 优点减少重复编程避免沟通隔阂提升效率 1.5 挑战完全抛弃代码的代价,就是平台能力与灵活性受限应用低代码平台阻力大技术局限老旧系统改造困难职业角色缺失应用者大多是技术…

网页设计个人主页代码

/ 01 / 前话 主题《周末の守候》采用Dreamweaver软件制作,主题包含了12页,页面能够相互跳转,运用了HTML5标签,DIVCSS布局,网站主题鲜明、内容丰富、健康、高雅且栏目设置合理,网站中页面色彩搭配合理&…

#低码系列#如何设计一个低代码平台?

低码系列文章 #低码系列#低代码来了,程序员会失业吗? 整体设计 用户群体 对于基础功能的实现,不需要开发人员介入。业务人员通过可视化页面,即可完成设计。从这个角度上看,低码平台面向的用户是业务人员、系统管理…

浅谈代码结构的设计

本文来自网易云社区 作者:陆秋炜 引言 :很久之前,在做中间件测试的时候,看到开发人员写的代码,有人的代码,看起来总是特别舒服,但有的开发代码,虽然逻辑上没有什么问题,但总给人感觉特别难受。后来成为了一位专职开发人员,渐渐发现,自己的代码也是属于“比较难受”…

领域驱动实践总结(基本理论总结与分析V+架构分析与代码设计+具体应用设计分析)

目录 领域驱动实践总结一:基本理论总结与分析 一、领域驱动设计两大设计:战略设计和战术设计 (一)战略设计 1.出发角度与目标 2.实现方式:事件风暴与模型确立(用例分析、场景分析和用户旅程分析) 3.用三步来划定…

如何设计一个低代码平台

编者按:近些年来,低代码发展火热,各种低代码平台如雨后春笋纷纷崛起,这些平台各定位不同,优劣不同,用户的选择空间很大。那么,如果用户想从零开始设计一个低代码平台,该如何做呢&…

QT纯代码设计UI界面Demo

目录 一、前言 二、界面 三、源码简析 四、Demo/源码 一、前言 UI的设计方法有几种: ①一种是使用Qt Designer,也就是可视化设计,这在小型项目中常见,优点就是可观简便; ②另一种就是纯代码设计UI,也…

Verilog RTL 代码设计新手上路

1. 做一个4选1的mux,并且进行波形仿真 和2选1的mux对比,观察资源消耗的变化: 实验分析:4选1的mux实际上就是在2选1的mux上进行拓展,选用2位的控制信号控制4位输入信号的选择输出 实验代码设计如下: …

代码设计流程

一、需求分析 1、需求分析的三层境界:实现者、分析者、引导者。 2、在需求中提取到合适的用例(以抽卡系统为例) 3、用例分析法 5W1H分析法 对上面的“抽卡”用例进行分析如下 5W内容What抽取卡牌Who玩家When游戏服务器开启期间Where抽卡…

代码设计的内功——代码设计原则

引言 好代码是设计出来的,也是重构出来的,更是不断迭代出来的。在我们接到需求,经过概要设计过后就要着手进行编码了。但是在实际编码之前,我们还需要进行领域分层设计以及代码结构设计。那么怎么样才能设计出来比较优雅的代码结构…