Linux中inode

磁盘的空间管理

如何对磁盘空间进行管理?

假设在一块大小为500G的磁盘中,500*1024*1024=524288000KB。在磁盘中,扇区是磁盘的基本单位(一般大小为512byte),而文件系统访问磁盘的基本单位是4KB,因此500G就被分成了131072000个扇区,将这些扇区看作为数组。而如果对这500GB进行分盘(C盘50G,D盘100G等),因此对500G磁盘的管理也就是对分的C盘50G,D盘100G的管理,相同,对于C盘50G的管理又被分化成对C盘中5个10G的管理。因此只要管理好局部,就能管理好整体,将整体细化成小等份进行管理即可(如下图)。

在Linux中,文件由数据与属性组成,这里数据内容存储在block(一般是4KB)中,属性存放在inode(磁盘上的另一块空间,一般是128字节)中,因此一个扇区(512字节)可以存储4个inode。但是内容可以增多或减少,而属性是不变的。

  1. Date blocks:里面包含许多Data Block,并且占磁盘的绝大部分空间,每一个Data Block大小是4KB。Data Blocks的作用是以块(这里的块就是Data Block)为单位,对文件内容进行保存,OS将文件每4KB分为一块进行保存,不够4KB也按照4KB保存。
  2. inode table:里面包含大量的inode空间(每个inode大小为128字节),用于保存文件属性。这里的inode可以理解成一个结构体(struct inode,其中保存着对应文件的Data Block编号,这使得Data Blocks与inode进行相互关联),结构体内部包含文件属性(所有者,权限等),并且以二进制的形式将实例化对象(struct inode i)写到inode空间里面。一般而言,一个文件有一个inode编号,以保证文件的唯一性。
  3. Block Bitmap:意思是位图,用于判断Data Blocks上的空间是否被占用。通过比特位上的数据来判断数据块中哪些空间被使用,哪些空间没被使用(0000 0000表示空空间都没有被使用,0000 1010表示1号位和3号位空间被使用)。
  4. Inode Bitmap:用于判断inode哪些空间被占,哪些空间没有被使用。
  5. Group Descriptor Table:简称GDT,块组描述符,用于描述inode表和数据块的起始位置。
  6. Super Block:用于记录存放文件系统本身的信息,记录Data Block和inode Block中的使用量以及未使用量等。并不是每个Block Group都含有Super Block,Super Block存在的意义是如果Super Block出现损坏可以通过其他Super Block对文件进行恢复。

注意:文件名也是文件的属性,但是在Linux中,并没有文件名的概念,而是通过inode对应的Data Block编号来识别文件的,因此要找到文件,就必须找到该文件对应inode编号,找到inode编号就能找到文件的Data Blocks,从而找到文件内容。那么如何找到inode呢?

我们知道,目录其实也是文件,是文件就具有文件内容和属性,这里目录的文件内容其实就是文件与目录的inode编号的映射关系。当我们在某一个目录下创建一个文件的时候,OS会根据当前目录下的Inode Bitmap找到未使用空间,将创建的文件的属性写入到该未使用的inode上,然后再根据Block Bitmap找打未使用的Data Block,然后填写数据到Data Block上,最后返回该文件的inode。最后返回的inode编号找到该文件所处的目录,根据目录的inode找到目录的Data Block,然后将文件名与inode的映射关系写入到目录的Data Block中。(这就是为什么inode中不保存文件名,因为文件名在目录中)

当删除一个文件的时候,根据目录的inode和要删除的文件名,找到目录的Data Block,根据文件名的映射关系找到文件的inode,再根据要删除文件的inode找到该文件的BlockGroup,将要删除文件的inode Bitmap和Block Bitmap的位图上的标志位由1置为0,最后取消该文件与目录的映射关系。

软连接与硬连接

软连接:

如上图,在/home/101-asy/linux/2024-12-06/d1/d2/d3目录下编译成的可执行文件mytest1,如果在/home/101-asy/linux/2024-12-06下执行需要带该文件的路径: ./d1/d2/d3/mytest1;但是如果使用软连接的方式:ln -s ./d1/d2/d3/mytest1 mytest1.s在/home/101-asy/linux/2024-12-06目录下生成一个软连接的可执行文件mytest1.s。这个软连接可以理解成快捷键。

如上图,软连接的文件与源文件的inode不同(因此软连接文件是一个独立的文件,也要进行分配inode,填写属性Data block,映射等操作),并且软连接文件的内容其实是源文件的所在路径。


硬连接:

创建的硬链接文件与原文件的inode相同,所谓的硬连接就是在当前目录下,给指定的文件新增文件名和inode编号的映射关系。

硬连接数是指向同一inode文件的数量,用于标识有多少个文件指向当前inode文件。


为什么创建的文件默认硬连接数是1呢???而文件夹又是2呢???

如上图,我们知道硬连接数表示有几个文件名指向该文件。当创建file文件时,file文件本身就指向了该文件,因此file文件本省就是一个硬连接数。而对于文件夹来说除了文件夹名本身外其内部还有一些文件:

以目录d4为例,d4的硬连接数为3,分别为d4文件名本身指向d4,d4目录下的.文件指向d4,以及d5目录下的..文件指向d4。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/62271.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

5G扬帆乘劲风,遨游通讯赋能千行百业谱新篇

在大型工厂,轻触手机屏幕,实时库存数据、人员定位等信息便跃然眼前、一目了然;在边远油田,动动手指,即可实时查询设备温度、危险气体浓度等信息,大数据瞬间尽在“掌”握……在遨游5G防爆智能手机的助力下&a…

RT Thread Studio新建STM32F407IG工程文件编译提示错误

编译提示错误 原因: RT 源码使用4.0.3的话,请用STM32F4支持包的0.2.2版本,就不会出错了。 如果支持包用0.2.3版本的话,需要用RT内核4.1.0版本。0.2.3 版本更新了一些针对内核4.1.0的驱动代码,这几个定义都是4.1.0里的。

学生管理系统(java)

1.前期准备 (1)新建java项目 (2)新建java软件包以及三个文件Student.java,Student.txt,StuSystem.java Student.java package student_management_system;public class Student {private String id;private String name;private…

JavaWeb学习(2)(Cookie原理(超详细)、HTTP无状态)

目录 一、HTTP无状态。 (1)"记住我"? (2)HTTP无状态。 (3)信息存储客户端中。如何处理? 1、loaclStorage与sessionStorage。 2、Cookie。 二、Cookie。 (1&…

SpringBoot教程(三十二) SpringBoot集成Skywalking链路跟踪

SpringBoot教程(三十二) | SpringBoot集成Skywalking链路跟踪 一、Skywalking是什么?二、Skywalking与JDK版本的对应关系三、Skywalking下载四、Skywalking 数据存储五、Skywalking 的启动六、部署探针 前提: Agents 8.9.0 放入 …

flask创建templates目录存放html文件

首先,创建flask项目,在pycharm中File --> New Project,选择Flask项目。 然后,在某一目录下,新建名为templates的文件夹,这时会是一个普通的文件夹。 然后右击templates文件夹,选择Unmark as …

Java进阶(注解,设计模式,对象克隆)

Java进阶(注解,设计模式,对象克隆) 一. 注解 1.1 什么是注解 java中注解(Annotation),又称java标注,是一种特殊的注释 可以添加在包,类,成员变量,方法,参数等内容上 注解会随同…

部署loki,grafana 以及springcloud用法举例

文章目录 场景docker 部署grafanadocker-compose部署loki维护配置文件 local-config.yaml维护docker-compose.yml配置启动 grafana 添加loki数据源springcloud用法举例查看loki的explore,查看日志 场景 小公司缺少运维岗位,需要研发自己部署日志系统,elk…

keil报错---connection refused due to device mismatch

解决办法如下: 记得改成1 把Enable取消

第三节、电机定速转动【51单片机-TB6600驱动器-步进电机教程】

摘要:本节介绍用定时器定时的方式,精准控制脉冲时间,从而控制步进电机速度 一、计算过程 1.1 电机每一步的角速度等于走这一步所花费的时间,走一步角度等于步距角,走一步的时间等于一个脉冲的时间 w s t e p t … ……

vue中pdf.js的使用,包括pdf显示,跳转指定页面,高亮关键词

目录 一、下载pdf.js 二、引入到本地的项目中 三、实现预览pdf 四、跳转到指定页面 五、利用pdf里面的find查找关键词 六、修改页面大小为实际大小 一、下载pdf.js https://github.com/mozilla/pdf.js 里面有很多的版本, 高版本的可能浏览器不兼容或者还要考…

OD B卷【连续字母长度】

题目 给定一个字符串,只包含大写字母,求在包含同一字母的子串中,长度第k长的子串的长度,相同字母只取最长的那个子串。 输入描述: 第一行输入一个子串(长【1,100】),只包含大写字母…

python中的 Pydantic 框架介绍

Pydantic 框架介绍 Pydantic 是一个用于数据验证和设置管理的 Python 库。它主要通过数据模型类的定义来处理 JSON 数据、解析请求和响应数据,并提供自动化的验证和转换。Pydantic 主要用于处理 Python 类型的安全性和验证,尤其在 FastAPI 等现代 Pytho…

桥接模式和组合模式的区别

桥接模式(Bridge Pattern)和组合模式(Composite Pattern)都是结构型设计模式,旨在解决对象结构的复杂性问题,但它们的应用场景和目的有所不同。以下是它们的区别: 1. 定义与目的 桥接模式&…

Qt 小项目 学生管理信息系统

主要是对数据库的增删查改的操作 登录/注册界面: 主页面: 添加信息: 删除信息: 删除第一行(支持多行删除) 需求分析: 用QT实现一个学生管理信息系统,数据库为MySQL 要求&#xf…

14.数据容器-set集合

特点 无序的,元素不重复,自带去重功能。 可以容纳不同类型的元素数据。 # 定义一个空set my_set {} your_set set() my_set {aa, bb, bb, aa} # {aa, bb} print(my_set) 因为set集合是无序的,所以集合不支持下标索引访问。所以set集合…

“量子跃迁与数据织网:深入探索K最近邻算法在高维空间中的优化路径、神经网络融合技术及未来机器学习生态系统的构建“

🎼个人主页:【Y小夜】 😎作者简介:一位双非学校的大二学生,编程爱好者, 专注于基础和实战分享,欢迎私信咨询! 🎆入门专栏:🎇【MySQL&#xff0…

硬件选型规则

光源选型: 先用型号中带H的,没有的选标准的. 光源和光源控制器的搭配需要确保接口一致。 根据型号表中的最佳工作距离和相机的尺寸。 光源控制器选型: 首先选择海康风格系列光源控制器考虑与光源的接口匹配。功率应该满足接近光源功率。检查是否退市…

【QNX+Android虚拟化方案】135 - QNX侧如何Dump 88Q5152 MIBS报文计数

【QNX+Android虚拟化方案】135 - QNX侧如何Dump 88Q5152 MIBS报文计数 一、读取 88Q5152 MIBS 计数二、读取 88Q5152 WDT 相关寄存器基于原生纯净代码,自学总结 纯技术分享,不会也不敢涉项目、不泄密、不传播代码文档!!! 本文禁止转载分享 !!! 汇总链接:《【QNX+Andro…

C#核心(15)继承中的构造函数

前言 我们之前学过构造函数是什么东西,今天的内容也和构造函数紧密相关,一个继承了父亲的子类里面构造函数的规则是什么样的,今天内容很简单,请听我慢慢讲来。 基本概念 特点:当申明一个子类时,先执行父…