0基础入门linux文件系统

时间:2024-11-05 09:00:06
[root@localhost linux]# stat test.c
File: "test.c"
Size: 654 Blocks: 8 IO Block: 4096 普通文件
Device: 802h/2050d Inode: 263715 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2017-09-13 14:56:57.059012947 +0800
Modify: 2017-09-13 14:56:40.067012944 +0800
Change: 2017-09-13 14:56:40.069012948 +0800
为了能详细地读懂上面的信息,那就必须得介绍linux文件系统

机械硬盘

在我们装载在笔记本的硬盘大部分都是固态硬盘ssd,但是在实际开发中,更多还是使用固态用品(便宜、容量大),作文文件的存储介质,有必要好好介绍一下固态硬盘

固态硬盘是计算机自带的唯一的机械设备,也是一个外设。

物理结构介绍

固态硬盘HDD最主要的就是磁头与磁盘,磁盘是用来存储数据的。

存储数据的最小操作单元是512byte(哪怕你只想用1bite,那也得把512字节全部加载到内存)

磁盘存储数据的区域是由一个个同心圆构成,这些相同半径的同心圆(即磁道)称之为柱面

磁盘被访问的基本单元是扇区---512byte

磁头左右摆动目的就是定位磁道或柱面。这就是定位扇区的过程。由于是机械设备,所以性能要比ssd要差。

CHS寻址

想要读取磁道的信息,需要经过几步定位:磁头定位(确定扇面)----磁道定位----扇区定位。

CHS即这三个要素的首字母。

逻辑结构介绍

物理上磁盘是圆的,但是磁盘我们在理解时(逻辑上) 可以像磁带一样去延展开,变成线性结构。

磁盘的逻辑线性结构

每一段都有无数个扇区

因此整个磁盘就可以被抽象成一个以扇区为基本单位的数组(集合)

由于数组的下标是唯一的,因此我们可以根据下标去反推在哪个扇面,哪个磁道,哪个扇区

每个柱面的磁道数目是一致的(只需要控制好密度即可)。但是现在的技术已经能做到扇区的长度一致了。        

OS是可以控制硬盘的,但是如何管理硬盘?就是靠这样的线性结构!

LBA寻址法

对于OS而言,就可以进行这样抽象过的逻辑结构去管理磁盘

在OS中,对应的地址称为LBA地址(logic block address)逻辑地址。

文件系统与磁盘管理

磁盘是一个巨大的存储介质,假设一个磁盘800G,那么就需要分区管理

磁盘太大:磁盘分区

OS去管理磁盘的时候:先描述后组织。对于800G的硬盘只需要定义一个结构,内部包含起始与结束。定义一个数组包含5个元素即可。

当然。这200G(一个分区)还是太大,应该继续分层管理分成10G、5G(block group0, block  group 1)等小区域

这个东西就叫做文件系统。

Linux ext2文件系统,上图为磁盘文件系统图(内核内存映像肯定有所不同),磁盘是典型的块设备,硬盘分区被划分为一个个的 block 。一个 block 的大小是由格式化的时候确定的,并且不可以更改。

Boot Block

Boot Block(引导块)是存储设备上的一部分,通常位于设备的起始位置,它的主要作用是在计算机启动过程中加载操作系统。

  • Boot Block通常包含引导加载程序(Boot Loader),这是计算机启动时运行的第一个软件。
  • 引导加载程序负责初始化硬件、检查系统配置,并将控制权传递给操作系统的内核。
  • 在启动过程中,引导块会检测可用的启动介质,如硬盘、光盘、USB驱动器等。
  • Boot Block可能会包含启动配置数据,如启动菜单、默认启动设备选择等。

Boot Block是确保计算机能够成功启动的关键部分,如果Boot Block损坏或配置错误,可能会导致系统无法启动。

Data block

存放文件内容的区域,以块的形式呈现,最常见的大小4KB----文件系统的块大小

inode block

存放某个文件的属性信息。一个文件对应一个inode。

在linux中,文件的属性与数据是分开存放的。

-li的i就是inode码的意思

OS不关心名称,只关心文件编号。linux标识文件用的是inode码。

如何将属性和数据块联系起来呢

每个数据块都在data blocks中有自己的编号,这个blocks数组就记录了数据块(单位4KB)的编号。可以去查找内容

索引的指示着在data block的那一块区域

索引分级,分为一级到多级索引(存在多级映射)

0-11块为一级索引存放文件内容的存储位置

12-13为二级索引。通过二级索引在data blocks中找到的存储块存在着一级索引。

Block Bitmap

采用位图的结构用来揭示,哪些data blocks的单元被使用,哪些没有被使用。

所以删除文件时,只需要位图制成0并取消索引即可,不需要去释放块空间。对属性和内容没有任何关系。这就是为什么下载慢删除快的原因。

Inode Bitmap

inode位图用来管理inode结构有没有被合法使用(伪删除)

Group Descriptor Table(GDT)

组描述符表,描述的是整个分组的使用情况、使用信息。

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

如何理解目录

inode表示文件的所有属性,文件名不属于inode内的属性。

那我们怎么将文件名与inode关联起来呢?

文件 = 内容+属性

对于一个目录而言,也存在自己的内容。文件的内容就是内部文件的inode与内部文件名的映射。

因此,在一个目录内部无法使用相同的文件名:防止出现映射错误

没有w就意味着的无法将文件名与inode的对应信息进行关系的映射。

目录可以将文件名与inode编号进行映射,那么目录的inode如何确定呢?

根目录/名称与inode是确定的,可以确定根目录在哪里,通过路径就能找到对应的目录

以下是inode结构内部包含的文件信息

文件类型:例如可执行文件、块特殊文件等。

权限:如读、写权限等。

所有者:文件的所有者。

组:文件所属的组。

文件大小:文件的大小。

文件访问、更改和修改时间:Linux/Unix系统不存储文件创建时间,但会记录文件的访问、更改和修改时间。

文件删除时间:文件被删除的时间。

链接数:文件的软链接和硬链接数量。

扩展属性:例如“仅追加”属性,或者“无人可删除文件”属性,包括root用户也不能删除(不可变属性)。

访问控制列表(ACLs):控制文件访问的列表

补充

OS如何管理内存

内存与磁盘的数据交互的固定单位4kb的原因

1.提高硬件IO效率

减少IO次数,减少磁盘等待,空间换时间---硬件

2.提高软件执行效率

根据局部性原则,存在预加载机制,提升软件运行的效率。

OS管理内存时,先描述,后组织,只需要将内存单元处理成一个数组即可

struct page mem_array[10000]

其中struct page内部存在着内存page页的必要属性信息。

我们要访问一个内存时,先找到这个4kb对应的page,就能在OS找到对应的页框,去找到合适的物理内存。

其实所有申请内存的动作,都是在访问内存page数组。

补充2:linux中,我们在进程中打开的每一个文件,都有自己独立的文件页缓冲区和inode属性

数据写入到磁盘:三次拷贝。C缓冲区、文件缓冲区、磁盘,每次写入都要一次拷贝。