深入理解Linux文件系统

                                                           🎬慕斯主页修仙—别有洞天 

                                                         ♈️今日夜电波:晴る—ヨルシカ

                                                                0:20━━━━━━️💟──────── 4:30
                                                                    🔄   ◀️   ⏸   ▶️    ☰  

                                      💗关注👍点赞🙌收藏您的每一次鼓励都是对我莫大的支持😍


目录

引入

磁盘的物理存储结构

磁盘存储的逻辑抽象结构

理解文件系统

inode

什么是inode?

inode Table

inode Bitmap

Data blocks

Block Bitmap

Super Block

GDT

Boot Block

对于目录的理解

硬链接和软链接

硬链接

硬链接的应用

软连接


引入

        当我们使用ls -l命令的时候,我们可以看到的除了看到文件名,还看到了文件元数据 。而对于所表示部分的理解,依次分别为:权限部分、链接数、文件所有者、文件所属组、文件的大小、文件的最后修改时间、以及文件名。

        例子:第一行a.out的对应表示:

  • rwxrwxr-x:这是文件权限部分,共有10个字符,分为4组,每组3个字符。第一组表示文件所有者的权限,第二组表示文件所属组的权限,第三组表示其他用户的权限。
    • rwx:表示文件所有者具有读(r)、写(w)和执行(x)权限。
    • rwx:表示文件所属组具有读(r)、写(w)和执行(x)权限。
    • r-x:表示其他用户具有读(r)和执行(x)权限,但没有写(w)权限。
  • 1:表示链接数,这里有一个链接指向该文件。
  • amazon:表示文件所有者的用户名是amazon。
  • amazon:表示文件所属组的用户名是amazon。
  • 8560:表示文件的大小为8560字节。
  • Jan 15 20:57:表示文件的最后修改时间为2022年1月15日20点57分。
  • a.out:表示文件名是a.out。

        当然,如果想查看更详细的有关信息可以使用stat命令

        还是以a.out为例:

        对于以上的解析:

        文件名为'a.out',大小为8560字节,属于普通文件。文件的权限设置为-rwxrwxr-x,表示文件所有者具有读、写和执行权限,文件所属组和其他用户只有读和执行权限。文件的设备号为fd01h/64769d,inode编号为1310801,链接数为1。文件的访问时间是2024年1月15日20点57分22秒395467毫秒,修改时间是2024年1月15日20点57分19秒028325毫秒,更改时间也是2024年1月15日20点57分19秒028325毫秒。文件没有创建时间。

        对于上述的两个例子,我们对于其中的信息大多都是认识的,但是对于Blocks、Inode、Links等却不怎么熟悉,接下来的文章将围绕文件系统的物理到系统来叙述,即:从物理层面的磁盘到系统上的磁盘。以此来了解这些信息的意义。

磁盘的物理存储结构

        由上图可见,一个盘面可以有很多的同心磁道,一圈磁道可以有很多扇形的扇区,而扇区就是最小的存储单元(大概512B或者4KB)。而存储文件的本质就是向这些扇区进行写入!这是通过上电改变磁盘中颗粒的磁极朝向来作为0/1进而看作写入数据,读取也是读取磁极的朝向来看作读取0/1进而读取数据。如果我们想向一个扇区写入,我们如何进行寻址、定位呢?1、选择哪一面盘片—本质上就是选择磁头。2、选择该面上的哪一个磁道。3、选择在该磁道上的哪一个扇区。当然,由于我们是有多个盘片的,我们可以向一个写入,想当然的也可以向任意一个/连续多个扇区写入,也可以随机写入。

磁盘存储的逻辑抽象结构

        通过上面对于物理层面磁盘的理解。接下来我们需要将这个结构抽象到系统中!一个磁盘中有多个盘片,盘片中分为多个磁道,通过一定的划分可以划分为多个扇区(可以理解为从盘片圆心拉出来很多条线,然后其中两条线以及磁道分割出来的区域)。对此我们可以将整个磁盘想像成如下的一个结构,将磁盘盘片想像成线性空间(可以理解为一个数组)。如下图所示,我们可以这样理解对应的结构:

        于是经过上述的操作我们将对于磁盘的管理就变成了对线性空间的管理!接下来,我们先理解一个概念:

        CHS-CHS指的是Cylinder(柱面)、Head(磁头)、Sector(扇区)。这是一种磁盘寻址方式,获取这些CHS信息,通过这些信息就可以对磁盘的信息进行定位。

        理解了CHS后,那我们的OS中是直接使用CHS来进行对应的管理吗?答案为否,OS是软件,磁盘是硬件,硬件定位一个地址,用的是CHS,但是如果OS直接用了这个地址,此时硬件发生改变,OS也要发生变化,所以OS要和硬件做好解耦工作。这就需要Logical Block Address - LBA。

        我们可以在操作系统中以一个一定的数据结构(可以想像成数组)来对磁盘进行管理。这个时候,对于磁盘的管理就变成了对数组的管理!

        需要注意的是:操作系统可以按照扇区为单位进行存储也可以基于文件系统,按照文件块为单位进行数据存取(一般为4KB),这样效率会比较高—即内存到磁盘,磁盘到内存的IO交互。

        对于LBA—CHS的转化:

        我们可以定义一系列的规则来对于磁盘进行管理,比如:数组下标1-100000为第一面,100001-200000为第二面,第一面中1-10000为第一个磁道,1-1000为第一个扇区等等。

理解文件系统

        理解了上述的相关知识点后,我们知道了对于磁盘的管理实际上就是对于OS中“数组”的管理。而为了方便管理,我们可以通过分治的思想将数组再进行分区,这个也可以理解成我们windows中的分盘,你的SSD只有一块,但是分出来了两个盘。如下C和D盘:

        对于管理整个磁盘太困难,就如上图,我们管理512G太难,那么就分多几个区来管理,你可以分100G、150G等等。最后,我们可以用管理小区域的经验进行复制,从而管理整体。

        虽然,我们将磁盘进行了分区,但是分区完后仍然很大,这个时候我们可以进一步划分,这个进一步划分叫做—分组。我们可以将每个分区划分为2GB大小的组,通过对每个组进行管理,在将管理的经验进行复制,从而管理整体。如下:

        Linux ext2文件系统,上图为磁盘文件系统图(内核内存映像肯定有所不同),磁盘是典型的块设备,硬盘分区被划分为一个个的block。一个block的大小是由格式化的时候确定的,并且不可以更改。例如mke2fs的-b选项可以设定block大小为1024、2048或4096字节。而上图中启动块(Boot Block)的大小是确定的,。

        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是否空闲可用。

        i节点表:存放文件属性 如 文件大小,所有者,最近修改时间等

        数据区:存放文件内容

        需要注意的是:在文件系统中,文件信息=内容+属性。他们都是数据,内容和属性是分开存储的,但是需要让管理数据写入到块组当中。

inode

ls -li//显示出具体的信息,包含inode编号

        一般情况,一个文件一个inode编号,基本上,每个文件都要有inode。在整个分区具有唯一性,Linux内核中,识别文件和文件名是无关的,只和inode有关。

什么是inode?

        在Linux系统中,inode是一种数据结构,大小通常为128B。它的主要功能是用于描述和定位文件系统中的文件和目录。每个文件或目录都由一个或多个inode组成,这些inode包含了文件或目录的所有信息,如文件大小、创建时间、修改时间、权限等。可以这样理解:

struct inode{int ref_count;//引用计数大小、权限、所有者、所属组、ACM时间、inode编号等int blocks[N]
}

inode Table

        inode表里面会存储很多的inode。每一个inode的大小是固定的,也就是128B,那么我们可以通过inode编号对固定大小的偏移量进行偏移就可找到对应的inode。你可以理解为:通常每一个分组都会有一个起始inode编号,当要计算inode编号时,通过偏移量加上起始inode编号就可得出。那如果我们想知道定位对应的分组位置,也可通过减去起始inode编号来定位。

inode Bitmap

        inode bitmap是一种数据结构,它的主要功能是用于追踪inode table在Linux系统中,inode bitmap是一种数据结构,它的主要功能是用于追踪inode table中的每个inode是否已经被使用。具体来说,每个bitmap中的每一个位都对应于inode table中的一个inode,如果该位为0,则表示对应的inode为空,如果为1,则表示相应的inode entry已被使用。

        这种位图技术(bitmap)的优势在于,当需要修改文件系统时,可以快速找到空闲的inode位置。例如,当需要新建一个文件时,系统会先检查inode bitmap中哪些inode是空闲的,然后将新文件的信息存储到这个空闲的inode中。同样地,当文件被删除时,对应的inode会被标记为可用,以供后续的新建文件使用。

Data blocks

        在Linux系统中,数据区块(block)是文件存储的最小单位,每个由多个连续性的扇区(sector)组成,每个扇区通常是512字节。而一个数据块最常见的大小则是4KB,即连续8个sector组成,用于存储文件数据和目录数据

        需要注意的是:上面提到的inode中会维护一个blocks数组,这个数组记录的是对应数据区块的块号,需要读取文件就可根据这些块号来读取!这个数组大小大概为15,,其中0-12位为直接映射,13:为间接映射,14为三级映射。

        看到这里,你应该就明白了,只要我们知道了inode编号我们就可以根据inode编号找到对应的分组,再通过分组找到对应的inode数据结构,然后通过inode里面的blocks数组来进一步找到对应的数据区块读取对应的数据。

Block Bitmap

        block bitmap是一种数据结构,它的主要功能是用于追踪每个block group中哪些block已经被使用。具体来说,block bitmap是一个特殊的文件,其大小恰好为一个block,而在这个block中,每个bit表示一个对应block的占用情况。如果该位为0,则表示对应的block为空,如果为1,则表示相应的block中存有数据。

        这种block bitmap技术的优势在于,当需要读取或修改文件时,可以快速找到空闲的block位置。例如,当执行写入操作时,系统会首先检查block bitmap,找出哪些block是空闲的,然后将新的数据写入到这些空闲的block中。同样地,当某个block不再使用时,系统会在block bitmap中将相应的bit标记为可用,以供后续的存储操作使用。

        此外,需要注意的是,一个block group中最多只能包含8×4096=32768个block。因此,对于一个含有大量数据的磁盘分区来说,可能需要多个block bitmap来分别记录各个block group的使用情况。

        看到这里你也应该明白了,新建、删除文件只需要改位图即可!

Super Block

        在Linux操作系统中,superblock是一个特殊的数据结构,它记录了文件系统的整体信息,包括inode和block的总量、使用量、剩余量,以及档案系统的格式与相关信息等。具体来说,它包含了文件系统的类型、block大小、block总数、inode大小、inode总数、group的总数等等。此外,每个Group 中的SuperBlock都是对 Main SuperBlock(主SuperBlock)的备份,用于处理主SuperBlock故障或者误删的情况。

        为了保证数据的安全性,Linux会周期性地将所有“脏”的超级块写回磁盘,以减少数据丢失的风险。这种与超级块关联的操作是由数据结构super_operations来描述的,该结构的起始地址存放在超级块的s_op域中。

        需要注意的是:只有个别组内会有SuperBlock,并不是所有的组都有。

        总的来说,superblock是Linux文件系统中非常重要的一部分,它记录了文件系统的关键信息,并负责管理文件系统的运行。通过superblock,我们可以了解到文件系统的详细信息,包括其类型、大小、使用情况等等。同时,它也承担着保障数据安全的重要任务。

GDT

        在Linux操作系统中,GDT(Global Descriptor Table)是一种全局描述符表,主要用于管理和定位内存地址空间。在实模式下,当我们需要对一个内存地址进行访问时,我们使用的是【段基地址:偏移地址】的形式来计算内存的实际地址。然而,当系统进入到保护模式后,内存管理被分为段式和段页式,这时就需要使用到GDT。

        GDT可以看作是一个描述符数组,其中的每个元素都被称为一个选择子。选择子的主要作用是确定段描述符,其目的一方面是为了实现特权级、界限等安全考虑,另一方面则是为了确定段的基地址。具体来说,GDT中的每一项都是由8字节组成,其中包括了段限、基址等关键信息。

        总的来说,GDT是Linux操作系统用来进行内存管理和保护的一种重要数据结构。它通过有效地划分和管理内存地址空间,为运行在操作系统上的各种程序提供了必要的资源和安全保障。

Boot Block

        在Linux中,引导块(Boot Block)是每个磁盘分区的开头部分,它预留了1024字节的大小来存放引导程序和数据。这个区域被称为引导扇区,可能位于第一个Block,即Block 0中,但并不一定会占满这个Block,因为Block的大小可能会大于1024字节。

        引导块中主要包含了启动时所需的基本信息,如启动加载程序和内核。这些信息对于系统的启动过程至关重要。例如,启动加载程序可以负责加载更多的系统组件,而内核则是计算机硬件和系统软件之间的桥梁,用于控制应用程序对硬件的访问。

        值得注意的是,与BIOS中的引导块不同,Linux的引导块不依赖于特定的操作系统或硬件。这是因为Linux是一种开源操作系统,其设计允许在各种不同的硬件和操作系统上运行。因此,无论您使用的是哪种Linux发行版或计算机硬件,引导块的功能和结构基本相同。

对于目录的理解

        目录实际上也是文件,目录的数据块保存的是目录下的文件的文件名和inode的映射关系。通常我们访问一个文件,打开目录,根据文件名,找到inode就可以访问那个文件了。因此,同一个目录下也是不能存在同名文件的!但是我们可以用不同的文件名指向相同的inode。这个可以理解为指针和地址的关系!那这个现象怎么看到呢?这就要说到硬链接和软链接了。

硬链接和软链接

        硬链接和软链接是Linux系统中两种不同类型的文件链接。它们的主要作用是解决文件的共享使用问题。

        硬链接(hard link)是指多个文件名指向同一个inode节点,即同一个文件的数据块。它的特点是:

  • 不允许给文件指定不同的路径;
  • 不能跨分区;
  • 删除一个硬链接并不影响其他硬链接和原文件,只有当最后一个硬链接被删除后,原文件才会被删除。

        软链接(又称符号链接,即 soft link 或 symbolic link)是指一个文件名指向另一个文件的路径。它的特点是:

  • 可以给文件指定不同的路径;
  • 可以跨分区;
  • 删除软链接并不影响原文件,但删除原文件后,软链接将失效。

硬链接
ln 目标文件 硬链接文件名

        可以看到进行硬链接后,链接数由1变为了2,而他们的inode编号是一样的,这就是说明两个文件指向的是同一个文件。当你将其中一个文件删除后,会发现连接数又变回了1。

        根据上面inode的数据结构我们可知,其中有一个引用计数的变量,只要有新的指向就会++,指向减少就会--,当没有指向了才会真正的删除。

硬链接的应用

        通过上图我们可知,当我们创建的是普通的文件时,默认的链接数为1,而我们创建了一个目录后,默认居然是2,这是为什么呢?请看下图:

        表示为本级目录,而 .. 表示为上级目录。. 和 .. 实际上就是硬链接!

软连接
ln -s 目标文件 软链接文件名

        需要注意的是:如下图,和硬链接不同,软链接指向的inode编号是不同的。那这个的作用又是干什么的呢?你可以理解为Windows的快捷方式,对于他的删除不会影响原来的文件。


                         感谢你耐心的看到这里ღ( ´・ᴗ・` )比心,如有哪里有错误请踢一脚作者o(╥﹏╥)o! 

                                       

                                                                        给个三连再走嘛~  

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

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

相关文章

防火墙技术

防火墙(英语:Firewall)技术是通过有机结合各类用于安全管理与筛选的软件和硬件设备,帮助计算机网络于其内、外网之间构建一道相对隔绝的保护屏障,以保护用户资料与信息安全性的一种技术。 防火墙技术的功能主要在于及…

开发需求总结9-el-tree获取选中节点,节点全选时返回被全选子级的父节点,未全选则返回被选中的节点

目录 需求描述 代码实现: 需求描述 需要获取树组件选中的节点,假如父节点被选中(该节点全选),即只返回父节点的数据,如父节点未被全选,则正常返回被选中节点的数据。 示例一: 如上图…

【学习记录24】vue3自定义指令

一、在单vue文件中直接使用 1、html部分 <template><divstyle"height: 100%;"v-loading"loading"><ul><li v-for"item in data">{{item}} - {{item * 2}}</li></ul></div> </template> 2、js…

基于YOLOv8深度学习的智能肺炎诊断系统【python源码+Pyqt5界面+数据集+训练代码】深度学习实战

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推…

CentOS stream 9配置网卡

CentOS stream9的网卡和centos 7的配置路径&#xff1a;/etc/sysconfig/network-scripts/ifcfg-ens32不一样。 CentOS stream 9的网卡路径&#xff1a; /etc/NetworkManager/system-connections/ens32.nmconnection 方法一&#xff1a; [connection] idens32 uuid426b60a4-4…

2024 CKA 题库 | 11、创建 PVC

不等更新题库 文章目录 11、创建 PVC题目:考点&#xff1a;参考链接:解答:更换 context创建 pvc创建 pod修改 pvc 并记录 11、创建 PVC 题目: 设置配置环境&#xff1a; [candidatenode-1] $ kubectl config use-context ok8sTask 创建一个新的 PersistentVolumeClaim&#x…

SG-9101CGA(汽车+125°C可编程晶体振荡器)

SG-9101CGA是用于汽车CMOS输出的可编程晶体振荡器&#xff0c;彩用2.5 x 2.0 (mm)封装&#xff0c;0.67 MHz至170 MHz频率范围、工作温度范围为-40℃~125℃&#xff0c;符合车规级晶振&#xff0c;无铅&#xff0c;绿色环保&#xff0c;满足汽车工业标准&#xff0c;电源电压范…

【linux】粘滞位.yum

粘滞位 1.为什么我们普通用户可以删掉别人的文件&#xff08;包括root&#xff09;?合理吗&#xff1f; 2.删除一个文件和目标文件有关系吗&#xff1f; 没关系&#xff0c;和所处的目录有关系。 1.我们先以root身份创建一个目录&#xff0c;接着在这个目录下创建一个文件 2…

噪声的产生机制和来源

噪声广泛存&#xff0c;噪声按照噪声携带能量的强弱分为功率型噪声和信号型噪声&#xff0c;功率型噪声持续时间短&#xff0c;能量强&#xff0c;对设备的寿命具有很大的影响&#xff0c;而信号型噪声顾名思义来源于信号且作用于信号&#xff0c;本节简述噪声的产生机理和来源…

QtAV:基于Qt和FFmpeg的跨平台高性能音视频播放框架

目录 一.简介 1.特性 2.支持的平台 3.简单易用的接口 二.编译 1.下载依赖包 2.开始编译 2.1克隆 2.2修改配置文件 2.3编译 三.试用 一.简介 官网地址&#xff1a;http://www.qtav.org/ Github地址&#xff1a;https://github.com/wang-bin/QtAV 1.特性 ●支持大部分…

Windows 开启卓越性能模式

在powershell命令行中输入下面代码即可&#xff1a; powercfg -duplicatescheme e9a42b02-d5df-448d-aa00-03f14749eb61

机器学习--人工智能概述

人工智能概述 入门人工智能&#xff0c;了解人工智能是什么。为啥发展起来&#xff0c;用途是什么&#xff0c;是最重要也是最关键的事情。大致有以下思路。 人工智能发展历程机器学习定义以及应用场景监督学习&#xff0c;无监督学习监督学习中的分类、回归特点知道机器学习…

Producer源码解读

Producer源码解读 在 Kafka 中, 我们把产生消息的一方称为 Producer 即 生产者, 它是 Kafka 的核心组件之一, 也是消息的来源所在。它的主要功能是将客户端的请求打包封装发送到 kafka 集群的某个 Topic 的某个分区上。那么这些生产者产生的消息是怎么传到 Kafka 服务端的呢&a…

TypeScript依赖注入框架Typedi的使用、原理、源码解读

简介 typedi是一个基于TS的装饰器和reflect-metadata的依赖注入轻量级框架&#xff0c;使用简单易懂&#xff0c;方便拓展。 使用typedi的前提是安装reflect-metadata&#xff0c;并在项目的入口文件的第一行中声明import ‘reflect-metadata’&#xff0c;这样就会在原生的R…

【图解数据结构】深度解析时间复杂度与空间复杂度的典型问题

&#x1f308;个人主页&#xff1a;聆风吟 &#x1f525;系列专栏&#xff1a;图解数据结构、算法模板 &#x1f516;少年有梦不应止于心动&#xff0c;更要付诸行动。 文章目录 一. ⛳️上期回顾二. ⛳️常见时间复杂度计算举例1️⃣实例一2️⃣实例二3️⃣实例三4️⃣实例四5…

FPGA引脚选择(Select IO)--认知1

主要考虑功能角度&#xff08;速度&#xff0c;电平匹配&#xff0c;内部程序编写&#xff09;去找研究芯片内部资源 1. 关键字 HP I/O Banks, High performance The HP I/O banks are deisgned to meet the performance requirements of high-speed memory and other chip-to-…

参照oracle按名称排序,用js在前端对附件封装排序方法

此前因客户需求需要附件按照名称排序 而后台无法对单个文件夹做单独处理。虽可以在每次点击之后重新调用接口&#xff0c;再组装数据&#xff0c;但效率太低&#xff0c;且无须存储&#xff0c;而存储在当前文件夹的排序方法也需要更新。索性自己写了一个通用的方法。经测试排序…

彩超框架EchoSight开发日志记录

EchoSight开发记录 蒋志强 我会不定期的更新 开发进展。最近更新进展于2024年1月15日 1.背景 由于某些不可抗逆的原因&#xff0c;离开了以前的彩超大厂&#xff0c;竞业在家&#xff0c;难得有空闲的时间。我计划利用这段时间 自己独立 从零开始 搭建一套 彩超系统的软件工…

【陈老板赠书活动 - 22期】- 人工智能(第三版)

陈老老老板&#x1f9d9;‍♂️ &#x1f46e;‍♂️本文专栏&#xff1a;赠书活动专栏&#xff08;为大家争取的福利&#xff0c;免费送书&#xff09; &#x1f934;本文简述&#xff1a;活就像海洋,只有意志坚强的人,才能到达彼岸。 &#x1f473;‍♂️上一篇文章&#xff…

浅谈CPU进入保护模式的方法

看程序要想思路不乱&#xff0c;最重要的就是要抓到程序的主线&#xff0c;不要被一些只是用来保护的代码打乱。如何抓到主线呢&#xff1f;比较法学习代码是比较有效的&#xff0c;比如对于CPU如何进入保护模式的理解。 不同的操作系统作者有自己的方法&#xff0c;代码看起来…