回顾:
基础IO:被打开的文件都存在内存
磁盘:没有被打开的文件

目录
理解硬件
1、CHS:定位一个扇区的方法:C柱面、H磁头、S扇区
其实也就是3个下标。C找到磁道,H找到盘面,一个盘对应两个面,S找到当前磁道的扇区。


柱⾯(cylinder)数:磁道构成柱⾯,数量上等同于磁道个数。
磁头(head)数:每个盘⽚⼀般有上下两⾯,分别对应1个磁头,共2个磁头。
扇区(sector)数:每个磁道都被切分成很多扇形区域,每道的扇区数量相同。
2、逻辑抽象:把磁盘看成线性结构

3、LBA(Logical Block Address):逻辑块地址,把CHS抽象为一维数组
磁盘内部用LBA,而不用CHS地址。磁盘的抽象是以柱面 为基本单位的,也就是一维数组。

4、OS只需要使⽤LBA就可以了!! LBA地址转成CHS地址,CHS如何转换成为LBA地址。谁做啊??磁盘 ⾃⼰来做!
操作系统用LBA地址,从现在开始,磁盘就是⼀个元素为扇区的⼀维数组,数组的下标就是每⼀个扇区的LBA地址。OS使用磁盘,就可以用⼀个数字访问磁盘扇区了。
最终只要告诉磁盘一个512B的数据,以及这个扇区的LBA,系统就可以把数据写到磁盘中去了,系统可以写多个扇区,因此就可以实现对磁盘的写操作了。
文件系统
1、系统读取磁盘不是每一次读取一个扇区的,而是一个"块",一个块=4KB=8个扇区
- 知道LBA:块号=LBA/8
- 知道块号:LAB=块号*8+n.(n是块内第⼏个扇区)

Rxt2文件系统

1、文件系统是以分区为单位的
2、一个数据块的大小是4096
3、Block Group(块组):文件系统的 "管理单元"
每个块组是文件系统的最小管理单元,包含以下核心组件(以 EXT2 为例,大小是固定 / 按配置的):
- Super Block(超级块) :记录整个文件系统的信息(总块数、空闲块数、块组数量等),大小是1 个数据块(通常 1KB/4KB),有的块组会备份一份,因为要是这个管理信息出问题了,那么整个300GB的D盘可能就出问题了,所以需要多个块组备份这部分信息。
- GDT(块组描述符表) :记录每个块组的状态(比如该块组的空闲块数),大小通常是1 个数据块。目前的inode占比多少,data block占比多少,从哪起始从哪儿结束等信息需要GDT再去描述。
- Block Bitmap(块位图) :用 "位" 记录该块组内哪些数据块是空闲的(1 位对应 1 个数据块),大小是1 个数据块(比如 1KB 的位图可以管理 8192 个数据块)。
- inode Bitmap(inode 位图) :用 "位" 记录该块组内哪些 inode 是空闲的,大小是1 个数据块。
- inode Table(inode 表) :存放该块组内所有文件的 inode(文件元数据),每个 inode 大小是128 字节 / 256 字节(EXT2 默认 128 字节),一个块组的 inode 表通常占多个数据块。inode编号以分区为单位,整体划分,不可跨分区
- Data Blocks(数据块) :实际存储文件内容的地方,每个数据块大小是1KB/2KB/4KB(用户可配置,EXT2 默认 1KB)。B lock 号按照分区划分,不可跨分区
4、格式化其实就是清除管理信息。

5、
实际磁盘没有目录,只是操作系统在内存构建一个目录,实际只有inode,目录也是inode 。访问过的目录构建成一个多叉树,访问的越多,后续就越快了。
6、挂载分区:怎么知道inode在哪个分区?
分区一定是被挂载到某个路径下的,所以比如code.c文件的目录前缀里面,一定有分区挂载的目录,这样就知道这个文件是在哪个分区里面的了。
7、inode和datablock映射(弱化)
- 1 个文件 ↔ 1 个
inode:这是固定的,inode是文件的唯一 "身份证"; - 1 个
inode↔ N 个data block:N 的大小取决于文件大小,小文件 N=1,大文件 N 可以是成千上万。
例子:
一个 10MB 的文件,块大小 4KB:
- 需要
10MB ÷ 4KB = 2500个data block; inode的 12 个直接指针用掉 12 个块;- 剩下的
2500-12=2488个块,靠一级间接指针就能覆盖(因为一级间接能管 1024 个块,不够的话再用二级); - 最终,这个文件的 2500 个
data block的位置,全记录在同一个inode里
a block的位置,全记录在同一个inode里。

8、文件内容分组保存:
万一一个分组下存不下一个大文件,也就是说一个Block Group里面的Data Block可能存不下这个文件的内容,那么可以存到另外一个Block Group里面去,也就是文件内容可以分组保存。
0、文件系统的总结



软硬链接
1、软链接
是一个独立的文件,因为他有独立的inode number。软连接相当于windows下的快捷方式。
为啥需要软链接?当要运行的文件不在当前目录下时,需要运行别的目录下的.c文件,需要加一大堆前缀,那么直接在当前目录下创建别的目录下的.c文件的软连接后,可以直接在当前目录下./软链接名去运行别的目录下的文件。
软连接保存目标文件的路径!

2、硬链接
不是独立的文件。但可以对文件进行备份
cd ./.. 这个./..就是硬链接

3、
硬链接不能给目录建立,软链接可以。为什么?因为要是可以的话,那么用户可以给每个目录建立指向根目录的硬链接,最终导致目录变为环状结构,所以不能。但是那为啥./..也是硬链接呢,这个是Linux对这俩做了特殊处理,只是方便命令的执行。
