Linux磁盘结构 | 文件系统 | 软硬链接

文件的状态有被打开和没有被打开,之前谈到一个文件被进行读写,就要打开加载到内存中,通过对应的系统调用,fd文件描述符的管理,write和read等函数的增删查改。并且借助缓冲区对文件属性和内容的修改。

大部分文件是没有被打开的(不需要访问),都在磁盘里保存的!对于没被进程打开的文件也要进行管理。在一个偌大的磁盘中,需要找到某份内容,就要进行核心工作------快速定位!

文件的管理工作包括:1、打开的文件进行管理  2、没被打开的文件在磁盘里管理

这一个管理工作就叫文件系统。本质就是文件的存储问题。

了解磁盘的物理结构

磁盘是计算机唯一的机械设备,早些年计算机用的激素机械硬盘,这几年逐步过渡到ssd。根据冯诺依曼体系,里cpu越员,速度就会越慢。磁盘的速度是慢于内存慢于ssd。

虽然磁盘的速度效率慢,但是它的造价便宜,内存容量大。所以企业一般是使用机械硬盘。

磁盘的主要结构

包括盘片和磁头

盘片:一片有俩面

磁头:一个磁头负责一片,用来读取修改1或0

简述这一个过程:
一个磁盘会有多个盘片堆叠。一个磁头负责一个盘片。盘片沿着指定方向高速旋转,磁头沿着半径方向转动,一秒钟内盘片可能转了上万次。因此在这样的高速旋转下,盘面的每一个小单元都能被识别到。

这里需要主要磁头和盘片不是贴在一起,而是非常接近。因此一个细微的抖动或者是灰尘都会影响磁盘的数据。

写入:计算机的世界上只有0和1,0和1是一种标志,就好比N和S级。在高速旋转中,磁头通过磁化将一个比特位的空间磁化为0或1的过程就是写入。


磁盘的存储结构

这里对磁盘的盘片详细介绍。一个盘片可以等分分成多个扇形,每一个扇形就叫做扇区。

磁盘又可以做同心环,每俩个环之间包围的区域就叫做磁盘。

因此,研究盘片主要是研究扇区和磁道。一个磁道可以有多个扇区,一个扇区也可以有多个磁道。这是一个划分。

扇区就是磁盘的最小存储单元512字节,4kb.

磁头Head

磁道 Track

扇区 Sector


CHS定位法

一个磁盘有许多块盘片,盘片上有扇区和磁道。如何在一个磁盘中找到指定位置的数据?

多个磁道堆叠,就好比一个空心的圆柱cylinder 。

寻找地址的方法:

  1. 选择哪一面: 本质是选择磁头
  2. 选择哪一个磁道 :因为确定了面,所以要确定磁道,就是确定哪一个柱面
  3. 选择在磁道上的哪一个扇区

这一个过程就是Head Cylinder Sector  CHS定位法 


存储的逻辑抽象

将磁盘的结构由圆盘抽象成线性

类似于磁带,我们将圆盘拉直后,就是线性的存储介质

这一个将磁盘的抽象线性化,得到的数组地址。就叫做LBA(逻辑块地址)

那么我们想要对磁盘写入只需要知道LBA地址,然后通过LBA与CHS的映射关系就能在磁盘上找到那一块空间。

举例
假设:LBA地址为1234,有俩片盘片,共4面,每面可以存储1000字节,每面磁道有10个,扇区有100个

1234 / 1000=1 在第一面上(从0开始计算)

234/10=23  第23个磁道上

234/100=2  第2个扇区上

因此就是得到HCS

这样,我们对磁盘的管理就转化为对扇区数组的管理

OS可以按照扇区为单位进行存取,也可以基于文件系统,按照文件块对文件系统数据存取。

总结:
对存储设备的管理,OS层面就是对数组的增删查改

文件系统

磁盘里的文件是庞大的,为了便于管理,通常会将抽象的线性LBA拆分成小部分,将每一小份管理好,借鉴经验,来管理整体。这是分治的思想。

假设磁盘有500G。可以通过分区来将一个磁盘分成几个小区。通常我们的笔记本就有一块磁盘,一块磁盘被分成C盘D盘。假设我们将500G分成五个区,每个区域就是100G,在对100G划分成组,每一份就是2G。


inode

每个区的起始位置都有一个Boot Block

Boot  Block是至关重要的 记录OS用于引导用户的操作与配置,记录分区的信息等。

每个区的划分就是组,下面对组详细研究

一个组被划分成 super block(超级块)         group descriptor table(组织描述符)  block bitmap(块位图)        inode bitmap( i结点位图)          bata block(数据块)


i结点表

用来存储文件的属性,如大小,所有组,权限,修改时间等

inode表应该是一个定长的结构体

struct inode{
    大小,权限,所属组,ACM,inode编号等
    引用计数
    block[n]
}

每个inode结构体的大小是128字节,一般而言一个文件就有一个inode编号,一个组有多少个inode编号是可以计算的  一个组的大小是4KB 4KB=4096字节 就有inode=4096/128=32个


数据段

:存放文件内容

ionde结构体会记录编号 

通过数据块的映射关系就能快速找到需要的内容

其中

0-12为 1 级映射

13为间接映射

14为3 级映射

一级映射:1-》2    2-》3

间接映射   13-》20

三级映射  向四面八方(发散)寻找


inode位图/块位图

来标识每一个bit的inode(数据块)是否空闲可用

用法同位图 0表示空闲/1表示存在


超级块(super block)

用来记录文件系统本身的基本信息。包括inode和数据块的总量,未使用的inode和block数目,挂载信息,最后一次检擦磁盘的时间。

文件=内容+属性 都是数据 并且内容和属性是分开存储的

要把多个文件的数据写入组中,就要先把管理组的信息写入。

一个磁盘被格式化后,就是重新写入管理者信息。要想使用分区,就要先进行挂载。

如果超级块被破坏,那么就不能正常使用磁盘。但是OS会对超级块拷贝几份到不同的组起始位置,以备意外的修改。


细节问题

文件的内容和属性是分开的,inode标识符是文件的唯一标志,文件名和inode是映射关系,Linux识别文件只认inode

描述文件的创建

根据文件名 映射到空闲的inode_bitmap 把0修改为1,找到对应inode表的结点,写入相应的属性。为其分配数据块,向数据块写入信息。再block_bitmap对应位置的0修改为1,建立inode 和 datablock的映射关系,最后返回inode

创建文件,一定是再某个路径底下!

通过inode编号->找到所处目录->根据文件的inode找到目录的data block->将文件名和inode编号映射关系写入目录数据块中。

文件的删除

在文件目录中找到 inode,再找到对应的block,在数据块里通过映射关系找到要删除文件的inode编号

再根据inode的编号找到block group(组) ,在俩个(inode和block)位图中,都将1修改为0。

最后在目录的数据块映射除,把文件名和inode映射关系解除。完成删除工作。

软硬链接

在当前路径底下,有test.txt文件和dir目录


软链接

类似于window的快捷方式

通过指令 ln -s test.txt test.soft 将前的文件链接到后

通过ls -il查看inode 得到源文件和软连接的文件的inode不同,不是同一份文件!

因此软链接是创建独立文件,有独立的inode

软链接的内容是指向目标文件的路径

如果删除了源文件,链接文件存在。但是不能存在或者执行

目录是无法进行软链接的


硬链接

创建文件myfile.txt 通过硬链接指令 ln myfile.txt myfile.hard

通过ls -il指令 对比源文件myfile和硬链接文件myfile.hard得到这俩个文件是同一个inode编号,因此它们不是独立文件,是同一份文件。

还可以观察到 文件权限后的标识符是软硬链接数目

软链接不改变链接数目

硬链接改变链接数目

删除硬链接文件后,源文件的软硬链接数目减一

删除源文件后,硬链接的文件链接数目会减一

这里就涉及到了引用计数

硬链接的本质就是在目录下建立的文件名和inode的映射关系

被硬链接一次映射关系就会多1 ,引用计数会增加。

当文件名和inode的映射关系全部解除  ,计数从1减到0时。文件才会被删除。找到inode编号,修改inode位图和block位图

目录的链接数:

一个目录被创建出来,就有俩个链接数,链接文件为本身目录和当前目录下的 .

如果在目录下建立新目录,上一层目录的链接数也会增加

目录硬链接会出现路径错误

软硬链接就在为了不切换路径,而能够打开的快捷方式