目录
- `🍑磁盘文件管理`
- `🚀磁盘的机械构成`
- `🌌磁盘的物理存储`
- `🍑存储原理`
- `📕磁盘的逻辑存储`
- `🦅文件名`
🍑磁盘文件管理
前面几篇都是说的被打开的文件,那系统中没有打开的文件呢?
- 系统中没有被打开文件存储在
磁盘/SSD
中。其中,没有被打开的文件也需要被OS管理,我们随时随地都需要打开磁盘中的文件,那么怎么才能将磁盘中的文件快速找到呢?所以,OS需要将磁盘中的文件进行管理。 如何让OS快速找到文件。
🚀磁盘的机械构成
磁盘盘片(Platters)
- 作用:硬盘存储数据的核心部件。
- 特点:盘片的数量可以从一片到多片不等,通常盘片越多,硬盘的存储容量越大。每个盘片都有两个盘面,即正反两面都可以存储数据。
主轴马达(Spindle Motor)
- 位置:位于盘片的中心。
- 作用:负责驱动盘片以恒定的速度旋转,转速越高,硬盘的数据访问速度越快。
读写头(Read/Write Heads)
- 作用:每个盘片表面都有一个读写头,用于读取和写入数据。
- 特点:读写头悬浮在盘片表面上非常微小的距离内(通常是几十纳米),这样可以避免与盘片接触并造成损害。
机械臂杆(Actuator Arm)
- 作用:读写头被安装在臂架上,臂架的运动使读写头能够在盘片的
半径方向上移动
,从而访问盘片上不同轨道的数据。
🌌磁盘的物理存储
磁盘存储的详细结构
- 磁道(Tracks):每个盘面被划分为一个个磁道,这些磁道是同心圆环,从外围开始编号,从0开始。
- 扇区(Sectors):每个磁道又被划分为若干个扇区,扇区是磁盘的最小组成单元,通常是512字节或4KB(高级格式化)。
扇区是硬盘的最小存储单元
。 - 柱面(Cylinders):柱面是所有盘面中相同磁道的柱面,形成的是一个立体的柱体形状。磁盘的柱面数和磁道数是相等的,盘面数等于总的磁头数。
存储容量计算
- 存储容量 = 磁头数 × 磁道(柱面)数 × 每道扇区数 × 每扇区的字节数
其中,磁头沿着半径方向左右摇摆
,定位在哪一个磁道
,马达带动盘片旋转
,定位在磁盘的哪一个扇区
。
怎么定位一个扇区?
CHS定位法
:
- 定位在哪一个磁道(cylinder)
- 定位使用哪一个磁头(head)
- 定位在哪一个扇区(Sector)
🍑存储原理
任何文件的数据都是存储在多个扇区中的,只需要将文件使用过的扇区记录下来,就能找到文件的数据。
写入数据
:
- 当计算机需要将数据写入磁盘时,首先将待存储的数据传输给磁盘控制器。
- 磁盘控制器再将数据传输给磁头。
- 磁头通过在磁盘表面上产生磁场来磁化磁盘表面上的磁性材料,从而存储数据。这些磁区可以通过改变磁盘表面上的磁极方向,表示不同的数据位。
- 磁头通过移动磁盘上的臂部将磁头定位到特定的扇区上,然后通过改变磁头的电流来磁化磁盘表面,写入数据。
读取数据
:
- 当计算机需要读取磁盘上的数据时,磁盘控制器会指示磁头移动到包含所需数据的磁道上。
- 磁头会定位到具体的扇区上,并检测该扇区中的磁场变化。
- 通过将磁场变化转换为数字信号,磁头将读取的数据传输给磁盘控制器,进而传输给计算机进行处理。
📕磁盘的逻辑存储
我们将一个磁盘抽象成一个磁带,将磁带拉出来,扯平了就是一个线性
的结构,类似于将每一个盘面的磁道打开,拼接成一个长的线性空间。如下图:假设磁盘总存储大小为:800G
但是OS认为,一次和磁盘IO一个扇区单位太小了,OS系统文件
认为,IO的基本单位是4KB
(8个连续的扇区),不同的OS有不同的区别,基本单位是可以更改的。如下图:
一个磁盘往往会进行分区
,比如电脑上的D,E,F盘,OS在管理每一个区的时候,还会进行分组
,每一组由很多个4KB数据块
组成。其中分区与分组中有特有的数据段。如下图:
Linux文件特性:文件 = 内容+属性,并且内容与属性分开存储的
。
其中,内容是可变的,大小不确定,属性是确定的,只是属性的内容不一样。
注意:文件名
不属于文件属性;
存放文件属性的struct inode结构体
大小固定的,为128字节。
inode编号整个分区唯一
的,其中ls -i 选项可以查看文件的inode编号;
系统中,标识一个文件不直接是文件名,而是inode编号。
认识一下分区分组中的数据段:
inode Table
:里面有很多个连续的128字节的空间,每一个空间存放文件的属性 如 :文件大小,所有者,最近修改时间等inode Bitmap
:inode Table对应的位图,标识inode Table的使用情况,每个bit表示一个inode是否空闲可用。Data blocks(数据区
):该区域被划分为很多个以4KB为单位的数据块,存储文件的内容。块位图(Block Bitmap
):Block Bitmap中记录着Data Block中哪个数据块已经被占用,哪个数据块没有被占用。GDT,Group Descriptor Table
:块组描述符,描述块组属性信息,例如块组的整体使用情况等。
-超级块(Super Block)
:存放文件系统本身的结构信息。记录的信息主要有:bolck 和 inode的总量,未使用的block和inode的数量,一个block和inode的大小,最近一次挂载的时间,最近一次写入数据的时间,最近一次检验磁盘的时间等其他文件系统的相关信息。Super Block的信息被破坏,可以说整个文件系统结构就被破坏了。Super Block只在个别的Block group中有,本质是进行数据备份。Block Group
:文件系统会根据分区的大小划分为数个Block Group。而每个Block Group都有着相同的结构组成。
删除文件
直接将inode bitmap与block bitmap删除
即可,不需要将属性与内容删除,使用时覆盖即可。
文件内容与属性怎么关联的?
文件属性结构体
中,包含一个int block[15],就是来存储该文件所使用的数据区里面的数据块的编号,其中,[0,12]为直接映射
,[12,13]为间接索引
(不保存文件内容,保存的文件使用的数据块的编号),[13,14]为三级索引
。所以,有了文件的inode编号,就有了文件属性与内容;
怎么通过一个文件的inode编号找到文件的?
每一个分区的inode编号有一个范围,先根据inode编号确定是在哪一个分区的,然后减去该分区的起始inode编号,去inode bitmap中看是否存在,如果存在就去inode Table中查找文件即可。
🦅文件名
目录
也是文件,也有自己的inode编号,目录的内容里面放什么呢?
任何一个普通文件都在一个目录中。
目录内容
放的是文件名与inode的映射关系
。
如果一个目录没有r,w权限的表现在这里就很好理解了。
对于一个文件的增删查改,都和该文件所处的目录有关系的。
增删查改
,都必须先找到文件,找文件就是找到该文件的inode,就需要先找到文件的目录,通过目录的内容找到该文件名与inode的映射关系。
那怎么找到目录呢?
- 查找一个文件,在内核中,都要
逆向的递归般
得到``根目录/,其中,根目录的inode编号是确定的,然后从根目录进行
路径解析`,查找文件。
怎么知道该文件在哪一个分区呢?
- 通过该文件的
路径前缀
可以直接区分
处在哪一个分区下的。
将属性和数据分开存放的想法看起来很简单,但实际上是如何工作的呢?我们通过touch一个新文件来看看如何工作。
[root@localhost linux]# touch abc
[root@localhost linux]# ls -i abc
263466 abc
为了说明问题,我们将上图简化:
创建一个新文件主要有一下4个操作:
- 存储属性
内核先找到一个空闲的i节点(这里是263466)。内核把文件信息记录到其中。 - 存储数据
该文件需要存储在三个磁盘块,内核找到了三个空闲块:300,500,800。将内核缓冲区的第一块数据复制到300,下一块复制到500,以此类推。 - 记录分配情况
文件内容按顺序300,500,800存放。内核在inode上的磁盘分布区记录了上述块列表。 - 添加文件名到目录
新的文件名abc。linux如何在当前的目录中记录这个文件?内核将入口(263466,abc)添加到目录文件。文件名和inode之间的对应关系将文件名和文件的内容及属性连接起来。
删除文件
:
将文件名在目录内容中做字符串匹配,找到文件的inode编号,将inode bitmap与block bitmap删除,不需要将属性与内容删除,使用时覆盖即可,然后将目录中的映射关系删除。