深入理解Linux文件系统

news2024/11/18 1:33:27

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

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

                                                                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.coloradmin.cn/o/1395883.html

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

相关文章

力扣精选算法100题——长度最小的子数组(滑动窗口专题)

本题链接——长度最小的子数组 第一步:了解题意 给定一个数组,要求在这个数组中找到一个必须是连续的子数组并且这个子数组每个元素加起来>target并从找到的这些数组中取一个最短的数组。 第二步:算法原理 滑动窗口是一种在序列&#xff…

【开源】基于JAVA语言的河南软件客服系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 系统管理人员2.2 业务操作人员 三、系统展示四、核心代码4.1 查询客户4.2 新增客户跟进情况4.3 查询客户历史4.4 新增服务派单4.5 新增客户服务费 五、免责说明 一、摘要 1.1 项目介绍 基于JAVAVueSpringBootMySQL的河…

中仕公考:贵州省统一面向社会公开招录公务员公告

2024年1月22日至1月25日期间,每日10:00、14:00及19:00对报名情况进行更新,供报考者参考。 资格初审时间为2024年1月22日9:00至1月28日17:00。 网上缴费时间为2024年1月22日9:00至1月29日17:00。 打印准考证时间2024年3月11日9:00至3月14日17:00。 公共科目笔试时间为: 202…

深度学习(2)--卷积神经网络(CNN)

卷积神经网络(Convolutional Neural Networks)是一种深度学习模型或类似于人工神经网络的多层感知器,常用来分析视觉图像。 一.卷积神经网络基础概念 传统网络是二维的,而卷积网络是三维的。 例如32x32x3的图片,在传…

Pure-admin框架 Pure-table中获取所选中的内容的信息

最近在尝试使用Pure-admin框架来进行开发,正好遇到了多选表格需要获取选中项的id的情况,因为平台介绍说是二次封装 element-plus 的 Table ,直接拿el-table的方法来试 在table上设置属性ref"multipleTableRef" let idArr [];mult…

为什么需要放行回源IP

为什么需要放行回源IP 网站以“独享模式”成功接入WAF后,所有网站访问请求将先经过独享引擎配置的ELB然后流转到独享引擎实例进行监控,经独享引擎实例过滤后再返回到源站服务器,流量经独享引擎实例返回源站的过程称为回源。在服务器看来&…

从“渲个锤子”,浅析影视动画渲染的困难与挑战!

提起“雷神之锤”,相信大家都不陌生。它是漫威电影宇宙中“雷神”托尔所使用的武器。传说中,这把圣器可以承载魔法咒语,召唤风、雨、雷、电四种自然元素。它能在使用者的意念下对目标进行攻击,无视与使用者之间的距离和障碍物&…

C++进阶(五)二叉搜索树

📘北尘_:个人主页 🌎个人专栏:《Linux操作系统》《经典算法试题 》《C》 《数据结构与算法》 ☀️走在路上,不忘来时的初心 文章目录 一、二叉搜索树概念二、二叉搜索树操作三、二叉搜索树的实现四、二叉搜索树的应用五、二叉搜索…

(人才测评)招聘数据分析师的入职测评方案

现在是一个大数据的时代,我们的车载导航、淘宝购物、包括人才招聘、都是大数据的产物,然而光靠数据堆积是没用的,所以如何高效的进行数据挖掘与分析,就成了每一件企业思考的问题。 一、 数据分析师的基本工作标准 1、 平时需要…

【vue2】状态管理之 Vuex

文章目录 一、介绍1、概念 2、工作示意图3、安装4、简单示例 二、核心1、State1.1 组件中获取 Vuex 的状态1.2 mapState 辅助函数1.3 对象展开运算符 2、Getter2.1 基本使用2.2 通过属性访问2.3 通过方法访问2.4 mapGetters 辅助函数 3、Mutation3.1 定义 mutation3.2 commit 提…

C++初阶类与对象(三):详解复制构造函数和运算符重载

上次介绍了构造函数和析构函数:C初阶类与对象(二):详解构造函数和析构函数 今天就来接着介绍新的内容: 文章目录 1.拷贝构造函数1.1引入和概念1.2特性 2.赋值运算符重载2.1运算符重载2.2放在哪里2.3运算符重载示例2.3.…

WebRTC视频会议/视频客服系统EasyRTC进入会议室密码验证的开发与实现

基于WebRTC技术的EasyRTC视频会议系统,建设目标是让用户随时随地、快捷方便地进行视频会议,并根据行业需求有针对性地提供多样化、个性化功能,该系统是覆盖全球的实时音视频开发平台,支持一对一、一对多等视频通话,极大…

Vray渲染效果图材质参数设置

渲染是创造出引人入胜视觉效果的关键步骤,在视觉艺术领域尤为重要。不过,渲染作为一个资源密集型的过程,每当面对它时,我们往往都会遭遇到时间消耗和资源利用的巨大挑战。幸运的是,有几种方法能够帮助我们优化渲染&…

mac PyCharm 使用conda环境

1 使用conda创建虚拟环境 conda create -n test6 python3.9 -y conda activate test62 选择conda环境 本地 选择已经存在的conda环境 右下角会显示现在的环境。

Android中矩阵Matrix实现平移,旋转,缩放和翻转的用法详细介绍

一,矩阵Matrix的数学原理 矩阵的数学原理涉及到矩阵的运算和变换,是高等代数学中的重要概念。在图形变换中,矩阵起到关键作用,通过矩阵的变换可以改变图形的位置、形状和大小。矩阵的运算是数值分析领域的重要问题,对…

Go新项目-Golang使用RemoteAddr()获取远程主机地址的注意事项(9)

一、问题描述 http.Request 下的方法RemoteAddr() 可以获取客户端的地址和端口号,最近的一个项目中用到了这个方法。 使用过程中一直都没有什么问题,但是当项目上线之后就发现不管怎么获取ip,客户端地址都是127.0.0.1 。 对于这个问题一直…

Rust之旅 - Rust概念、Windows安装、环境配置

🌹作者主页:青花锁 🌹简介:Java领域优质创作者🏆、Java微服务架构公号作者😄 🌹简历模板、学习资料、面试题库、技术互助 🌹文末获取联系方式 📝 系列专栏目录 [Java项目…

VirtualBox安装openSUSE-Leap-15.5虚拟机并配置网络

VirtualBox安装openSUSE-Leap-15.5虚拟机并配置网络 适用于在VirtualBox平台上安装openSUSE-Leap-15.5虚拟机。 1. 安装准备 1.1 安装平台 Windows 11 1.2. 软件信息 软件名称软件版本安装路径Oracle VM VirtualBoxVirtualBox-7.0.12-159484D:\softwareopenSUSE-Leapopen…

跨Android、iOS、鸿蒙多平台框架ArkUI-X

ArkUI是一套构建分布式应用界面的声明式UI开发框架。它使用极简的UI信息语法、丰富的UI组件、以及实时界面预览工具,帮助您提升移动应用界面开发效率30%。您只需使用一套ArkTS API,就能在Android、iOS、鸿蒙多个平台上提供生动而流畅的用户界面体验。 一…

上门服务系统|上门服务小程序|上门服务系统的发展趋势

在现代社会,人们的生活节奏越来越快,对于更加便捷的服务需求也随之增加。正是基于这一背景,上门服务系统应运而生,并且迅速发展壮大。那么,上门服务系统的发展趋势又是怎样的呢? 首先,上门服务系…