深入理解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.hqwc.cn/news/414164.html

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

相关文章

CMake 实战构建TcpServer项目 静态库/动态库

爱编程的大丙CMake: 20. 举例 - 下_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV14s4y1g7Zj?p20&spm_id_frompageDriver&vd_sourcea934d7fc6f47698a29dac90a922ba5a3 hehedalinux:~/Linux/LinuxServerCpp$ ls Buffer.cpp Log.h Buffe…

经典计算机网络面试题

1.说说HTTP常用的状态码及其含义? 状态码 类别 1xx 信息性状态码 2xx 成功状态码 3xx 重定向状态码 4xx 客户端错误状态码 5xx 服务端错误状态码 日常开发中的状态码: 状态码 含义 101 切换请求协议 200 请求成功 301 永久性重定向&…

UE5 C++ 基础变量类型,关于框架的初级练习

一.创建自己的MyGameModed。并在其中设置好GamePlay框架。 1.创建MyGameState,MyGameState,MyHUD,MyPawn,MyPawn,MyPlayerController,MyPlayerState。 2.并在MyGameMode的头文件里面,把GmaeMode里的框架需要的框架类都包含进去。 3.写一个构…

Spring 核心之 IOC 容器学习一

IOC 与 DI IOC(Inversion of Control)控制反转:所谓控制反转,就是把原先我们代码里面需要实现的对象创建、依赖的代码,反转给容器来帮忙实现。那么必然的我们需要创建一个容器,同时需要一种描述来让容器知道需要创建的对象与对象…

电力能源三维可视化合集 | 图扑数字孪生

电力能源是现代社会发展和运行的基石,渗透于工业、商业、农业、家庭生活等方方面面,它为经济、生活质量、环境保护和社会发展提供了巨大的机会和潜力。图扑软件应用自研 HT for Web 强大的渲染引擎,助力现代化的电力能源数字孪生场景&#xf…

微信小程序(六)tabBar的使用

注释很详细,直接上代码 上一篇 新增内容: 1. 标签栏文字的内容以及默认与选中颜色 2. 标签栏图标的默认样式与选中样式 3. 标签选项路径页面 4.标签栏背景颜色 🐼(文末补充)设置标签栏后为什么navigator标签无法跳转页…

最新版git2.43安装、记住用户名和密码以及tortoisegit2.15使用

一、下载git 打开git官网地址:https://git-scm.com/进行下载 下载完安装,一直next就好,如果愿意就可以改下安装路径,改在d盘。 具体可以参考:git安装教程 二、安装完下载小乌龟以及中文语言包 下载地址:…

253:vue+openlayers 加载HERE多种地图(v2软件版本)

第253个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+openlayers中添加HERE地图,并且含多种的表现形式。包括地图类型,文字标记的设置、语言的选择、PPI的设定。 直接复制下面的 vue+openlayers源代码,操作2分钟即可运行实现效果 文章目录 示例效果图配置方式示例源…

【STM32】| 02——常用外设 | I2C

系列文章目录 【STM32】| 01——常用外设 | USART 【STM32】| 02——常用外设 | I2C 失败了也挺可爱,成功了就超帅。 文章目录 前言1. 简介2. I2C协议2.1 I2C物理连接2.2 I2C通信协议2.2.1 起始和停止信号2.2.2 数据有效性2.2.3 数据传输格式2.2.4 从机地址/数据方…

腾讯云轻量化应用服务器_轻量化应用服务器_轻量化私有云

腾讯云轻量应用服务器开箱即用、运维简单的轻量级云服务器,CPU内存带宽配置高并且价格特别便宜,大带宽,但是限制月流量,轻量2核2G3M带宽62元一年、2核2G4M优惠价118元一年,540元三年、2核4G5M带宽218元一年&#xff0c…

esp32-idf eclipse 定时器的使用demo

esp32定时器的使用demo 1、介绍 ESP32芯片包含两个硬件定时器组。每组有两个通用硬件定时器。它们都是基于16位预分频器和64位自动重载功能的向上向下计数器的64位通用定时器。 2、API接口函数 创建定时器函数: esp_timer_create(); esp_err_t esp_timer_create …

阿里云ECS使用docker搭建mysql服务

目录 1.确保正确安装好docker 2.安装mysql镜像 3.创建容器(设置端口映射、目录映射) 1.确保正确安装好docker 安装教程: 阿里云ECS(CentOS镜像)安装docker-CSDN博客https://blog.csdn.net/qq_62262918/article/details/135686614?spm10…