Linux系统编程:Ext文件系统

目录

一、硬件结构

磁盘的存储结构

磁盘的逻辑抽象结构

磁盘的分区管理

二、软硬链接

1.软链接

2.硬链接

删除软硬链接


一、硬件结构

没错,正如你上图所看见的,这些都是我们生活中的硬件。

但是这其中最重要的就属磁盘结构。

之前我们在数据库也讲过磁盘结构,但本篇文章,我们将更加细致的来了解磁盘是如何工作的。

磁盘的存储结构

整个磁盘是有若干个小磁盘(圆滑面)的,每个正反面是单独的存储面,每个存储面都有一个磁头

当整个磁盘工作时会高速旋转,同时磁头左右摆动来锁定目标位置,达到管理效果(存储、访问.....)

扇区是从磁盘读出和写入信息的最小单位,通常大小为512字节。

  • 磁头(head)数:每个盘片一般有上下两面,分别对应1个磁头,共2个磁头
  • 磁道(track)数:磁道是从盘片外圈往内圈编号0磁道,1磁道...,靠近主轴的同心圆用于停靠磁头,不存储数据
  • 柱面(cylinder)数:磁道构成柱面,数量上等同于磁道个数
  • 扇区(sector)数:每个磁道都被切分成很多扇形区域,每道的扇区数量相同圆盘(platter)数:就是盘片的数量
  • 磁盘容量=磁头数 x 磁道(柱面)数 x 每道扇区数 x 每扇区字节数

我们重点来看每个磁盘面:每个盘面会以中间的主轴为中心,向外分为一个个同心磁道,而每个磁道又会被划分为各个扇区,所以我们看到文件的存储,本质上就是占据扇区的问题。

磁盘上存储的基本单位是扇区。

所以将来在进行磁盘寻址的时候,磁头找的是某一个面上的某一个磁道上的某一个扇区,这种寻址方式叫做CHS寻址。

CHS寻址对早期的磁盘非常有效,知道⽤哪个磁头,读取哪个柱⾯上的第⼏扇区就可以读到数据了。 但是CHS模式⽀持的硬盘容量有限,因为系统⽤8bit来存储磁头地址,⽤10bit来存储柱⾯地 址,⽤6bit来存储扇区地址,⽽⼀个扇区共有512Byte,这样使⽤CHS寻址⼀块硬盘最⼤容量为256*1024*63*512B=8064MB(1MB=1048576B)(若按1MB=1000000B来算就是 8.4GB),效率大大降低。

磁盘的逻辑抽象结构

当操作系统要对磁盘进行写数据操作或者读数据操作,操作系统和磁盘之间又是怎么建立联系的呢?

磁带上面可以存储数据,那么我们可以把磁带"拉直",形成线性结构。那么磁盘本质上虽然是硬质的,但是逻辑上我们可以把磁盘想象成为卷在⼀起的磁带,那么磁盘的逻辑存储结构我们也可以类似于:

这样每⼀个扇区,就有了⼀个线性地址(其实就是数组下标)

所以在操作系统层面,磁盘的盘片就被逻辑抽象成为线性的数组,这个数组的每一个单位就是一个扇区,定义了这样的一个数组,操作系统只需要有数组的下标,就可以实现对磁盘的管理,这也是先描述再组织的思想。这种下标地址我们叫做LBA地址 ,即Logical Block Address,逻辑块地址。所以如果内存中有数据需要写入到磁盘里,操作系统会根据LBA地址映射转换成CHS地址,然后将内存中要写入到磁盘的数据配合着CHS地址写入到磁盘里,至此就完成了对应的写入操作。

磁盘的分区管理

我们的磁盘是一块很大的内存空间,管理这么大的一块内存空间成本是比较高的。因此操作系统对磁盘的管理采取的是分而治之的思想,即将磁盘分成几个区,然后分别对单独的一个区进行管理。磁盘分区其实非常常见,我们的电脑上一般会有所谓的C盘、D盘甚至是E盘F盘,这就是磁盘的分区。

将磁盘分成一个个的区以后,我们就可以针对一个区进行管理 ,其中每个区又可以继续分成若干个组,如下图所示:

一个分区里面最开始一般都有一个区域叫做Boot Block这里存储的是开机信息这些开机信息一般包含了分区表、操作系统软件在磁盘的什么位置等 ,**所以在开机的时候硬件就可以通过这里的开机信息找到我们的操作系统。**除了这个区域外剩下的区域就被分成了一个个的小组。

到这里,我们就将磁盘的管理转换成了一个组的管理。下面我们可以介绍针对一个组的管理方案,首先我们要明确一点:文件是由文件内容和文件属性组成的文件内容和文件属性都是数据,它们都要被存储起来,在Linux中采用的是将内容和属性数据分开存储的方案。

其中文件内容被存储在block中,也就是我们所说的磁盘中的块 ,一个块是4KB大小的空间;文件属性被存储在inode中,inode就是磁盘上的另一份空间,一个inode空间的大小一般是128字节。

有了这两个概念以后,我们可以介绍磁盘分区中一个块组的内容:

  • Data blocks: 这个区域实际上在一个块组中的占比是很大的,一般占一个块组的80%(图中没有画明确),这个区域是以块为单位进行文件内容的保存,一个块的大小是4KB,即使文件没有满4KB,比如文件内容大小只有3KB,照样会分配一个块来保存;或者文件内容大小是6KB,就会分配两个块来保存。
  • inode Table: 这个区域是以128字节为单位进行文件属性的保存,即里面是一个一个的inode,文件属性就存储在inode里面。文件属性里面有一个inode编号,一般而言,一个文件对应一个inode,也就是说一个文件对应一个inode编号。
  • 如图,输入:ll -i ,我们就能查看我们的inode编号。

  • Block bitmap: 这是一个位图结构,用来记录Data blocks的使用情况。比如说Data blocks里面有1000个block,那么Block bitmap就有1000个比特位来记录每一个block是否被占用。
  • inode bitmap: 同理,inode bitmap用来记录inode Table中每一个inode是否被占用。
  • Group Descriptor Table: 简称GDT,它管理的是一个块组,用来记录块组的信息,包含块组中有多少个inode、块组的起始inode编号是多少、块组中有多少个inode被使用、块组中有多少个block被使用、块组的总大小是多少等等信息。
  • Super Block: 这是文件系统的顶层数据结构 ,它管理的是宏观上的整个分区,**它表示的是整个分区的信息,**比如整个分区一共有多少个块组、整个分区内每一个块组的inode的使用情况、整个分区内每一个块组的block的使用情况、每一个块组的大小、整个分区在磁盘中对应的位置等等。
  • 虽然Super Block管理的是整个分区 ,但Super Block不是像Boot Block一样存在于分区里,而是存在于分区下的每一个块组中,这是因为Super Block存储的信息太重要了,同一个分区下每个块组都存储一个相同Super Block能够起到备份的作用。如果出现了文件系统损坏的情况,可以用备份来修复。

那我们梳理一下,我们在创建一个新的文件的时候,操作系统做了什么?

  1. 首先操作系统会在分区内部的一个块组里的inode Bitmap查找没有被使用的inode,找到以后将inode Bitmap里对应的比特位由0置1,然后将创建的文件的属性值写入到inode Table对应的inode里;
  2. 当我们往文件写入内容时,操作系统会到Block Bitmap里查找没有被使用的块,然后将要写入的数据写入到对应的块中,最后再在inode的blocks[]数组里填上对应的编号。
  3. 这还没有完,我们创建一个文件一定是在一个目录下创建的,在创建文件的时候用户会给文件指定文件名,操作系统会根据目录的inode找到目录的Data blocks,将文件名和inode编号的映射关系写入到目录的数据块中。

反之,删除的时候根据目录的inode找到目录的Data blocks,再根据文件名和inode编号的映射关系拿到文件的inode编号,再通过inode编号找到文件的inode Bitmap和Block Bitmap,将inode Bitmap和Block Bitmap对应的比特位由1置0,就完成了删除工作。

这里可以反复理解。在现代文件系统的设计和优化中,inode 与 datablock 的直接强映射关系确实有所弱化但弱化并非取消映射而是通过引入中间层、缓存机制、动态分配等技术,让映射关系更灵活、高效,以适配更高的存储需求。

二、软硬链接

所以,说来说去就是可以根据访问目标文件的"路径前缀"准确判断文件在哪⼀个分区。

那我们再来看看软硬链接。

1.软链接

软链接是通过名字引用另外一个文件,相当于Windows操作系统下的创建快捷方式,软链接创建出来的文件是一个独立文件,它和原来的目标文件不共用同一个inode编号。软链接文件并不是对原来文件的拷贝,而是将原来文件的路径存储到软链接文件的内容当中。

那么什么时候用呢?

我们之前有尝试运行过进程,我们创建进程的时候,必须在当前目录下才能运行现在所写的文件,那么,一旦文件路径变深了呢?

这样一来,就会非常不方便。因此我们可以在上级目录建立可执行程序的软链接,输入指令:ln -s ./dir1/xxx xxxx ,这样我们就创建了目标文件的软链接,即在当前目录下的快捷方式,可以直接./运行起来了。

语法:ln -s 原文件的绝对/相对路径 软连接路径

2.硬链接

我们知道了在磁盘上找文件是通过inode编号而不是文件名,文件名和inode是通过映射关系关联起来的,其实在Linux中可以让多个文件名对应同一个inode编号。硬链接就是单纯地在目录下给指定的文件新增"文件名和inode编号的映射关系"。

cpp 复制代码
[root@localhost linux]# touch abc
[root@localhost linux]# ln abc def
[root@localhost linux]# ls -li abc def
263466 abc
263466 def

abc和def的链接状态完全相同,他们被称为指向文件的硬链接。 内核记录了这个连接数,inode263466 的硬连接数为2。
我们在删除文件时干了两件事情:

1.在目录中将对应的记录删除,

2.将硬连接数-1,如果为0,则将对应的磁盘释放。

删除软硬链接

建议使用unlink来删除软硬链接,输入指令:unlink mytest、unlink abc

相关推荐
wjs20246 分钟前
抽象工厂模式
开发语言
lly2024067 分钟前
SVG 模糊效果详解
开发语言
奇树谦9 分钟前
FastDDS路由可达的跨网段通信支持说明
网络
期待のcode9 分钟前
Java虚拟机类加载机制
java·开发语言
看见繁华16 分钟前
Linux 交叉编译实践笔记
linux·运维·笔记
Learner16 分钟前
Python运算符
开发语言·python
一晌小贪欢21 分钟前
Python 精确计算:告别浮点数陷阱,decimal 模块实战指南
开发语言·python·python入门·python3·python小数·python浮点数
咕噜企业分发小米21 分钟前
直播云服务器安全防护有哪些最新的技术趋势?
运维·服务器·安全
superman超哥21 分钟前
Rust 范围模式(Range Patterns):边界检查的优雅表达
开发语言·后端·rust·编程语言·rust范围模式·range patterns·边界检查
空城雀27 分钟前
python精通连续剧第一集:简单计算器
服务器·前端·python