【Linux进行时】磁盘文件结构

磁盘

上篇文章,我们提及文件是存放在磁盘当中,本篇文件我们来了解一下磁盘的结构!!!

磁盘的概念:

❓什么是磁盘?

💡磁盘(disk)是指利用磁记录技术存储数据存储器

磁盘是计算机主要的存储介质,可以存储大量的二进制数据,并且断电后也能保持数据不丢失。早期计算机使用的磁盘是软磁盘(Floppy Disk,简称软盘),如今常用的磁盘是硬磁盘([Hard disk](https://baike.baidu.com/item/Hard disk/2806058?fromModule=lemma_inlink),简称硬盘)。

磁盘的基本结构:

磁盘是我们电脑上的唯一的一个机械设备,目前我们的笔记本上可能已经不用磁盘了,而是固态硬盘 (SSD) 。相对而言用起来更快,效率更高。固态硬盘是另一种存储的方案,和磁盘的存储差别很大,单价比磁盘大很多。一般 500G 的固态基本上比同等的磁盘要贵个两三百块。

image-20231103161858154

🧊盘片:
磁盘通常由一个或多个盘片组成,这些盘片通常是由金属或玻璃等材料制成的圆形薄片。一个盘片有正反两个面。
🧊磁头:
磁头负责读取和写入数据。每个扇面都有一个磁头,它浮动在盘片表面上方,通过微小的电流在磁盘表面上读写数据。
🧊磁道(柱面):
扇面表面被划分为许多同心圆,每个圆被称为一个磁道。数据被写入或读取时,磁头会在特定磁道上移动。
🧊扇区:
磁道被进一步划分为多个扇区,每个扇区存储一定量的数据。磁盘中存储的基本单元,通常为 512 字节或 4 KB。

image-20231103162847190

CHS寻址方式:

❓通过上述的介绍我们大概知道了磁盘的结构。那我们现在思考一个问题,如何在一个磁盘上确定一个扇区呢?💡答案很简单,我们先确定一个盘面,盘面根据磁头( magnetic head)就可以确定了。再根据根据磁道也就是柱面(cylinder)定位扇区,最后在某个磁道上找到该扇区(cylinder),就可以定位到某个扇区了。这种磁盘寻址的方式是chs.

🧊因此以后找一个扇区只要

磁道(柱面): cylinder
磁头: head
扇区: sector

🧊而这种定位扇区的方法被称作 CHS 定位法。

磁盘的逻辑抽象结构:

通过上述我们知道磁盘寻址定位方式chs,但是这是物理寻址方式,操作系统是软件层,这套寻址方式看到不适操作系统。操作系统的上面怎么寻址管理磁盘上的数据的呢?我们先看看下面这张图片。

image-20231103163513913

类比于磁带,卷起来是圆形的,扯开是线性结构的。所以我们可以把磁盘盘片想象成线性结构。以OS为角度,则认为磁盘是线性结构,要访问某个扇区,只需要定位数组下标,也就是说知道这个扇区的下标就算定位了一个扇区。在操作系统内部,我们称这种地址为LBA(Logic Block Address)地址!而要写到物理磁盘上,我们就要把LBA地址转换成对应磁盘的三维地址CHS地址。总结来说,OS的地址为LBA地址,而对应的磁盘为CHS地址。

因为 OS 是以 4KB 为单位进行 IO 的,故 OS 读取的数据块要包括 8 个扇区,在 OS 的角度甚至可以不关心扇区。

只需要像计算机常规的访问方式那样: 起始地址 + 偏移量,即获取数据块第一个扇区的地址(下标) + 4KB(块的类型)即能访问的整个数据块。**

image-20231103163704433

文件系统:

🧊学习完上面的知识后,我们知道 OS 通过先描述再组织的方式将磁盘抽象成一个大数组进行管理。

🧊而具体管理的方法,就是我们接下来要讲解的内容了。

由于磁盘抽象成的数组过于庞大,首先第一步就需要将其分作几个区域。每个区域的管理方式都是一样的,因此只要管理好一个区域就相当于管理好整个磁盘了。(类似于 begin 和 end 进行下标的划分)

🧊虽然磁盘已经经历过一次分区,但是每个区的大小依旧十分庞大,我们还需要再进行一次分组

文件系统分组管理结构:

image-20231103170123771

由此管理每个区的任务就简化到了管理每个组,只要实现一个组的管理通过复制粘贴就可完成其他组的管理,进而完成整个区的管理,而管理好每个区就相当于管理好了整个盘。

🧊在每个区内都会有一个Boot Block,又名为启动块,在开机时会通过它读取 OS 镜像的地址,从而找到操作系统,若是这个区域损坏则会直接影响操作系统的启动

  • 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节点表:存放文件属性 如 文件大小,所有者,最近修改时间等

  • 数据区:存放文件内容

🧊我们常说,在文件 = 内容 + 属性,在 Linux 中内容和属性是被分开存储的。

一般而言,一个文件内部所有属性的集合就是 inode 节点(128字节),同时一个文件对应一个 inode。

🧊在一个分区中便会有大量的文件,因此就会又大量的 inode,由此需要将 group 中所有的 inode 管理起来,即 inode Table。

存储属性:

其中每个 inode 都有自己对应的编号,也属于对应文件的属性 id。我们可以通过 ls -i 查看文件的 inode 编号。

ls -i

image-20231103171350664

在之后的访问中,OS 也是根据 inode 编号来进行文件查找或读取内容。

内容存储:

🧊存完属性后,那考虑的便是如何存储文件内容。我们通过数据块来保存文件内容,所以一个有效文件保存内容至少需要 1 个数据块。

🧊而数据块在 Data Block 中,那么我们该如何定位文件对应的数据块呢?

🧊其实,在 inode 内部便会存入当前文件对应数据块的索引,之后在 Data Block 中定位即可。可以如此近似理解。

struct inode
{
    int number;
    ...//其他文件属性
    int datablocks[NUM]; 
};

深入理解文件操作:

如何理解inode:

**🧊Linux 系统中只识别 inode 编号,文件的 inode 中并不存在文件名,**文件名提供给用户使用的。我们又该如何理解这层关系呢?

image-20231103172034801

🧊创建一个目录文件后,我们可以观察到目录文件也有自己的 inode 编号,那目录中都存了什么数据呢?

🧊实际上,目录的数据块里保存的就是该目录下文件名与文件 inode 编号对应的映射关系,二者互为key值。

🧊因此,任何一个文件都应该在一个目录内部。

🧊同时,inode 可以用于确定分组,inode number 在一个分区中唯一有效,不能跨分区。(分组的起始位置 + 位图的位置)

创建一个新文件:

  1. 存储属性
    内核先找到一个空闲的i节点(这里是263466)。内核把文件信息记录到其中。
  2. 存储数据
    该文件需要存储在三个磁盘块,内核找到了三个空闲块:300,500,800。将内核缓冲区的第一块数据
    复制到300,下一块复制到500,以此类推。
  3. 记录分配情况
    文件内容按顺序300,500,800存放。内核在inode上的磁盘分布区记录了上述块列表。
  4. 添加文件名到目录
    新的文件名abc。linux如何在当前的目录中记录这个文件?内核将入口(263466,abc)添加到目录文
    件。文件名和inode之间的对应关系将文件名和文件的内容及属性连接起来。

image-20231103172319485

删除一个文件:

删除文件的话只需要修改两个 bitmap 即可,将空间空闲出来,下次便会直接覆盖写入

文件访问:

🧊当我们访问文件时:

首先在当前目录下,找到输入文件名对应的 inode 编号。
一个目录一定隶属于一个分区,结合编号在该分区中找到对应分组,在该分组的 inode table 中找到文件的 inode。
通过 inode 与对应的 Data Block 关联起来,于是便找到了相关数据,进而根据命令进行其他操作

如何存储大文件

🧊若是直接使用 inode 内部的数组直接索引 Data Block 中的内容,假设一个数组可以存 NUM 个内容,是否意味着我们最大只能存 NUM * 4KB 大小的文件呢?

🧊答案是否定的,我们可以使指向的数据块里的内容并非直接的数据,而是其他数据块的编号,由此拓宽文件的存储大小。

🧊这种索引方式称为二级索引。

  • 77
    点赞
  • 67
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 103
    评论
一般要将硬盘分成主引导扇区、操作系统引导扇区、FAT表、DIR目录区和Data数据区等五部分,这里分别进行了介绍!硬盘的文件系统结构 • 新买的硬盘,是没有直接办法使用的,需要将它分区、格式化,然后再安装上操作系统才可以使用。就拿一直沿用到现在的Win9x/Me/2000/XP系列来说,一般要将硬盘分成主引导扇区、操作系统引导扇区、FAT表、DIR目录区和Data数据区等五部分。通常所说的主引导扇区MBR在一个硬盘中是是唯一的,MBR区的内容只有在硬盘启动才读取其内容,然后驻留内存。其它几项内容随你的硬盘分区数的多少而异。 • 主引导扇区(MBR)。主引导扇区位于整个硬盘的0磁道0柱面1扇区,包括硬盘主引导记录MBR(Main Boot Record)和分区表DPT(Disk Partition Table)。其中主引导记录的作用就是检查分区表是否正确以及判别哪个分区为可引导分区,并在程序结束把该分区的启动程序(也就是操作系统引导扇区)调入内存加以执行。 • 分区表(DPT)。在主引导区中,从地址BE开始,到FD结束为止的64个字节中的内容就是通常所说的分区表。分区表以80H或00H为开始标志,以55AAH为结束标志,每个分区占用16个字节,一个硬盘最多只能分成四个主分区,其中扩展分区也是一个主分区。随着硬盘容量的迅速扩大,引入的扩展分区可以不受四个主分区的限制,把硬盘分区数扩展到“Z”。值得一提的是,MBR是由分区程序(例如DOS的Fdisk.exe)产生的,不同的操作系统可能这个扇区的内容代码是不相同,但是实现的功能只有一个,使其中的一个活动分区获得控制区,正常启动系统。 • 主引导扇区(MBR)。主引导扇区位于整个硬盘的0磁道0柱面1扇区,包括硬盘主引导记录MBR(Main Boot Record)和分区表DPT(Disk Partition Table)。其中主引导记录的作用就是检查分区表是否正确以及判别哪个分区为可引导分区,并在程序结束把该分区的启动程序(也就是操作系统引导扇区)调入内存加以执行。 • 主分区和扩展分区。主分区是一个比较单纯的分区,通常位于硬盘的最前面一块区域中,构成逻辑C磁盘。在主分区中,不允许再建立其它逻辑磁盘。也可以通过分区软件,在分区的最后建立主分区,或在磁盘的中部建立主分区。扩展分区的概念则比较复杂,也是造成分区和逻辑磁盘混淆的主要原因。由于硬盘仅仅为分区表保留了64个字节的存储空间,而每个分区的参数占据16个字节,故主引导扇区中总计可以存储4个分区的数据。操作系统只允许存储4个分区的数据,如果说逻辑磁盘就是分区,则系统最多只允许4个逻辑磁盘。对于具体的应用,4个逻辑磁盘往往不能满足实际需求。为了建立更多的逻辑磁盘供操作系统使用,系统引入了扩展分区的概念。 所谓扩展分区,严格地讲它不是一个实际意义的分区,它仅仅是一个指向下一个分区的指针,这种指针结构将形成一个单向链表。这样在主引导扇区中除了主分区外,仅需要存储一个被称为扩展分区的分区数据,通过这个扩展分区的数据可以找到下一个分区(实际上也就是下一个逻辑磁盘)的起始位置,以此起始位置类推可以找到所有的分区。无论系统中建立多少个逻辑磁盘,在主引导扇区中通过一个扩展分区的参数就可以逐个找到每一个逻辑磁盘。 • 操作系统引导扇区(OBR)。OBR(OS Boot Record)即操作系统引导扇区,通常位于硬盘的0磁道1柱面1扇区(这是对于DOS来说的,对于那些以多重引导方式启动的系统则位于相应的主分区/扩展分区的第一个扇区),是操作系统可直接访问的第一个扇区,它也包括一个引导程序和一个被称为BPB(BIOS Parameter Block)的本分区参数记录表。其实每个逻辑分区都有一个OBR,其参数视分区的大小、操作系统的类别而有所不同。引导程序的主要任务在当根目录中寻找系统文件IO.SYS,MSDOS.SYS和WINBOOT.SYS三个文件,如果存在,就把IO.SYS文件读入内存,并移交控制权予该文件。在WIN98的系统中,没有MSDOS.sys文件,系统能够正常启动,但是无法进入桌面;如果没有COMMAND.COM文件,能够正常启动到桌面,但是无法进入DOS字符方式。 BPB参数块:记录着本分区的起始扇区、结束扇区、文件存储格式、硬盘介质描述符、根目录大小、FAT个数、分配单元(Allocation Unit,以前也称之为簇)的大小等重要参数。OBR由高级格式化程序产生(例如DOS 的Format.com)。 • 文件分配表(FAT)。FAT(File Allocation Table)即文件分配表,是DOS/Win9x系统的文件寻址系统。为了防止意外损坏,FAT一般做两个(也可以设置为一个),第二FAT为第一FAT的备份, FAT区紧接在OBR之后(对于FAT32格式,位置是从引导扇区开始的第32个扇区就是第一个FAT表的位置),其大小由这个分区的空间大小及文件分配单元的大小决定。随着硬盘容量的迅速发展,Microsoft 的DOS及Windows也先后采用我们所熟悉的FAT12、FAT16和FAT32格式。不过Windows NT、OS/2、UNIX/Linux、Novell等都有自己的文件管理方式,不同于FAT文件格式。FAT12是使用12BIT来表示簇的位置,最大容量32M,FAT16是使用两个字节16BIT位来表示簇的位置,分区最大容量2G,而FAT32采用4个字节来表示簇的位置,分区最大容量65G。 • 目录区(DIR)。DIR是Directory即根目录区的简写,在FAT12和FAT16格式中,DIR紧接在第二FAT表之后,而在FAT32格式中,根目录区的位置可以在分区中的任意位置,其起始位置是由引导扇区给出的。单有FAT表还不能确定文件磁盘中的具体位置,只有FAT表和DIR区配合使用,才能准确定位文件的确切位置。DIR记录着每个文件(目录)的文件名,扩展名,是否支持长文件各,起始单元(这是最重要的)、文件的属性,大小,创建日期,修改日期等住处内容。操作系统在读写文件,根据DIR中的起始单元,结合FAT表就可以知道文件磁盘的具体位置,然后顺序读取每个簇的内容就可以了。 • 数据区(DATA) 。在DIR区之后,才是真正意义上的数据存储区,即DATA区。DATA虽然占据了硬盘的绝大部分空间,但没有了前面的各部分,它对于我们来说,也只能是一些枯燥的二进制代码,没有任何意义。注意:我们通常所说的格式化程序(指高级格式化,例如DOS下的Format程序),并没有把DATA区的数据清除,只是重写了FAT表而已,除非你使用了“Format X: /U”命令,强制对每一扇区写“F6”。 至于硬盘分区,也只是修改了MBR和OBR,绝大部分的DATA区的数据并没有被改变,这也是许多硬盘数据能够得以修复的原因。但即便如此,MBR,OBR,FAT,DIR之一被破坏的话,我们的数据也无法正常读取。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 103
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

学IT的小卢

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值