目录
1.磁盘
1.1 概念
1.2 磁盘物理结构
1.3 磁盘的存储结构
1.4 磁盘的逻辑结构
1.5 CHS && LBA地址
2.基础文件系统
2.1 块
编辑
2.2 分区
2.3 inode
3.ext2 ⽂件系统
3.1 宏观认识
3.2 Block Group
3.3块组内部构成
3.3.1 超级块(Super Block)
3.3.2 GDT(Group Descriptor Table)
3.3.3 块位图(Block Bitmap)
3.3.4 inode位图(Inode Bitmap)
3.3.5 i节点表(Inode Table)
3.3.6 Data Block
3.4 inode和datablock映射
3.5 ⽬录与⽂件名
3.6 路径解析
3.7 路径缓存
3.8 挂载分区
3.9 总结图
4.软硬连接
4.1 硬链接
4.2 软链接
4.3 软硬连接对⽐及用途
1.磁盘
在Linux中,打开的文件保存在内存中,对于没有打开的文件则保存在磁盘里
1.1 概念
磁盘(disk)是指利用磁记录技术存储数据的存储器。
1.2 磁盘物理结构
磁盘的物理结构由磁盘,磁头,马达....组成,这里的磁盘称为盘片,一般有三个盘片,六个面,同样也有每个盘面对应一个磁头,一共六个磁头,这六个磁头由于绑定在一个机械臂上,因此只能共同运行(你走哪,我就走哪)
1.3 磁盘的存储结构
磁盘的存储结构和飞镖盘差不多,每一面盘片中圆形代表一个磁道,磁道中又被分为许多扇区
扇区:是磁盘存储数据的基本单位,512字节,块设备
对于一个磁盘来说有三个盘片,对于一个磁道,从上往下看就相当一个圆柱体
可以先定位磁头(header)确定磁头要访问哪⼀个柱⾯(磁道)(cylinder)定位⼀个扇区(sector)
而这三步就被称为CHS地址定位
扇区是从磁盘读出和写⼊信息的最⼩单位,通常⼤⼩为 512 字节。磁头(head)数:每个盘⽚⼀般有上下两⾯,分别对应1个磁头,共2个磁头磁道(track)数:磁道是从盘⽚外圈往内圈编号0磁道,1磁道...,靠近主轴的同⼼圆⽤于停靠磁头,不存储数据柱⾯(cylinder)数:磁道构成柱⾯,数量上等同于磁道个数扇区(sector)数:每个磁道都被切分成很多扇形区域,每道的扇区数量相同圆盘(platter)数:就是盘⽚的数量磁盘容量=磁头数 × 磁道(柱⾯)数 × 每道扇区数 × 每扇区字节数
1.4 磁盘的逻辑结构
在上文叙述过,由于盘片中的磁道是一个圆形,就可以把这个圆形剪开,形成一个线性结构


一样也可以对多个磁道展开
整个磁盘就是多张⼆维的扇区数组表,也就是三维数组,对于三维数组,也可以像一维数组展开,所以,每⼀个扇区都有⼀个下标,我们叫做 LBA(Logical Block Address) 地址,其实就是线性地址
在OS只需要使⽤LBA就可以了,对于LBA地址转成CHS地址,这步操作由磁盘⾃⼰来做
1.5 CHS && LBA地址
磁头数*每磁道扇区数 = 单个柱⾯的扇区总数LBA = 柱⾯号C*单个柱⾯的扇区总数 + 磁头号H*每磁道扇区数 + 扇区号S - 1即:LBA = 柱⾯号C*(磁头数*每磁道扇区数) + 磁头号H*每磁道扇区数 + 扇区号S - 1扇区号通常是从1开始的,⽽在LBA中,地址是从0开始的柱⾯和磁道都是从0开始编号的总柱⾯,磁道个数,扇区总数等信息,在磁盘内部会⾃动维护,上层开机的时候,会获取到这些参数。
柱⾯号C = LBA // (磁头数*每磁道扇区数)【就是单个柱⾯的扇区总数】磁头号H = (LBA % (磁头数*每磁道扇区数)) // 每磁道扇区数扇区号S = (LBA % 每磁道扇区数) + 1"//": 表⽰除取整
2.基础文件系统
2.1 块
其实硬盘是典型的“块”设备,操作系统读取硬盘数据的时候,其实是不会⼀个个扇区地读取,这样效率太低,⽽是⼀次性连续读取多个扇区,即⼀次性读取⼀个”块”(block)。 硬盘的每个分区是被划分为⼀个个的”块”。⼀个”块”的⼤⼩是由格式化的时候确定的,并且不可以更改,最常⻅的是4KB,即连续⼋个扇区组成⼀个 ”块”。”块”是⽂件存取的最⼩单位。
2.2 分区

2.3 inode
模式硬链接数⽂件所有者组⼤⼩最后修改时间⽂件名

对于⽂件数据它都储存在”块”中,这种储存⽂件属性信息的区域就叫做inode,每⼀个⽂件都有对应的inode,⾥⾯包含了与该⽂件有关的⼀些信息。注意:Linux下⽂件的存储是属性和内容分离存储的Linux下,保存⽂件属性的集合叫做inode,⼀个⽂件⽂件名属性并未纳⼊到inode数据结构内部inode的⼤⼩⼀般是128字节或者256任何⽂件的内容⼤⼩可以不同,但是属性⼤⼩⼀定是相同的
3.ext2 ⽂件系统
3.1 宏观认识

3.2 Block Group
ext2⽂件系统会根据分区的⼤⼩划分为数个Block Group。⽽每个Block Group都有着相同的结构组成
3.3块组内部构成
3.3.1 超级块(Super Block)
存放⽂件系统本⾝的结构信息,描述整个分区的⽂件系统信息。记录的信息主要有:bolck 和 inode的总量,未使⽤的block和inode的数量,⼀个block和inode的⼤⼩,最近⼀次挂载的时间,最近⼀次写⼊数据的时间,最近⼀次检验磁盘的时间等其他⽂件系统的相关信息。Super Block的信息被破坏,可以说整个⽂件系统结构就被破坏了
3.3.2 GDT(Group Descriptor Table)
块组描述符表,描述块组属性信息,整个分区分成多个块组就对应有多少个块组描述符。每个块组描述符存储⼀个块组的描述信息,如:在这个块组中从哪⾥开始是inode Table,从哪⾥开始是Data Blocks,空闲的inode和数据块还有多少个等等。块组描述符在每个块组的开头都有⼀份拷⻉。
3.3.3 块位图(Block Bitmap)
Block Bitmap中记录着Data Block中哪个数据块已经被占⽤,哪个数据块没有被占⽤利用比特位记录
3.3.4 inode位图(Inode Bitmap)
表⽰⼀个inode是否空闲可⽤。
利用比特位记录
3.3.5 i节点表(Inode Table)
存放⽂件属性 如 ⽂件⼤⼩,所有者,最近修改时间等当前分组所有Inode属性的集合inode编号以分区为单位,整体划分,不可跨分区,可以跨组
3.3.6 Data Block
数据区:存放⽂件内容,也就是⼀个⼀个的Block。根据不同的⽂件类型有以下⼏种情况:
对于普通⽂件,⽂件的数据存储在数据块中。对于⽬录,该⽬录下的所有⽂件名和⽬录名存储在所在⽬录的数据块中,除了⽂件名外,ls -l命令看到的其它信息保存在该⽂件的inode中。Block 号按照分区划分,不可跨分区
3.4 inode和datablock映射
__le32 i_block[EXT2_N_BLOCKS];
/* Pointers to blocks */ ,
EXT2_N_BLOCKS =15
分区之后的格式化操作,就是对分区进⾏分组,在每个分组中写⼊SB、GDT、Block Bitmap、Inode Bitmap等管理信息,这些管理信息统称: ⽂件系统只要知道⽂件的inode号,就能在指定分区中确定是哪⼀个分组,进⽽在哪⼀个分组确定是哪⼀个inode拿到inode⽂件属性和内容就全部都有了
1. 存储属性内核先找到⼀个空闲的i节点(这⾥是263466)。内核把⽂件信息记录到其中。2. 存储数据该⽂件需要存储在三个磁盘块,内核找到了三个空闲块:300,500,800。将内核缓冲区的第⼀块数据复制到300,下⼀块复制到500,以此类推。3. 记录分配情况⽂件内容按顺序300,500,800存放。内核在inode上的磁盘分布区记录了上述块列表。4. 添加⽂件名到⽬录新的⽂件名abc。内核将⼊⼝(263466,abc)添加到⽬录⽂件。⽂件名和inode之间的对应关系将⽂件名和⽂件的内容及属性连接起来。
3.5 ⽬录与⽂件名
对于目录也有inode和数据内容,它的保存方式和文件一样,对于文件名保存在所属目录的数据内容中
访问⽂件,必须打开当前⽬录,根据⽂件名,获得对应的inode号,然后进⾏⽂件访问 ,所以,访问⽂件必须要知道当前⼯作⽬录,本质是必须能打开当前⼯作⽬录⽂件,查看⽬录⽂件的内容!
3.6 路径解析
所以类似"递归",需要把路径中所有的⽬录全部解析,出⼝是"/"根⽬录。⽽实际上,任何⽂件,都有路径,访问⽬标⽂件,⽐如:/home/Azusa/code/test/test/test.c都要从根⽬录开始,依次打开每⼀个⽬录,根据⽬录名,依次访问每个⽬录下指定的⽬录,直到访问 到test.c。这个过程叫做Linux路径解析。
访问⽂件必须要有⽬录+⽂件名=路径的原因根⽬录固定⽂件名,inode号,⽆需查找,系统开机之后就必须知道
路径谁提供?
访问⽂件,都是指令/⼯具访问,本质是进程访问,进程有CWD!进程提供路径。open⽂件,提供了路径
可是最开始的路径从哪⾥来?
本质就是在磁盘⽂件系统中,新建⽬录⽂件。⽽新建的任何⽂件,都在系统指定的⽬录下新建,此时就有路径了系统+⽤⼾共同构建Linux路径结构.
3.7 路径缓存
对于一个文件,每次访问都要进行路径解析,而这样效率很低,因此Linux中OS在进行路径解析的时候会把历史访问的所有目录形成一颗多叉树保存,而这个结构struct dentry
每个⽂件其实都要有对应的dentry结构,包括普通⽂件。这样所有被打开的⽂件,就可以在内存中形成整个树形结构整个树形节点也同时会⾪属于LRU(Least Recently Used,最近最少使⽤)结构中,进⾏节点淘汰整个树形节点也同时会⾪属于Hash,⽅便快速查找更重要的是,这个树形结构,整体构成了Linux的路径缓存结构,打开访问任何⽂件,都在先在这棵树下根据路径进⾏查找,找到就返回属性inode和内容,没找到就从磁盘加载路径,添加dentry结构,缓存新路径

3.8 挂载分区
在上文能够根据inode号在指定分区找⽂件了,也已经能根据⽬录⽂件内容,找指定的inode了,怎么找到自己所在的分区?
此时就需要一个特定的目录来进行关联,而这个目录就是就需要挂载才能使用
怎么利用Linux进行挂载这里就不做叙述
3.9 总结图
4.软硬连接
4.1 硬链接

这两个链接状态完全相同,他们被称为指向⽂件的硬链接。内核记录了这个连接数,inode789401的硬连接数为2。删除⽂件时⼲了两件事情:1.在⽬录中将对应的记录删除,2.将硬连接数-1,如果为0,则将对应的磁盘释放。硬链接本质不是一个独立的文件,因为没有独立的inode,其实就是一组新的文件名和目标inode number映射关系,主要的作用就是用来对文件进行备份

4.2 软链接
硬链接是通过inode引⽤另外⼀个⽂件,软链接是通过名字引⽤另外⼀个⽂件,但实际上,新的⽂件和被引⽤的⽂件的inode不同,应⽤常⻅上可以想象成⼀个快捷⽅式

4.3 软硬连接对⽐及用途
软连接是独⽴⽂件硬链接只是⽂件名和⽬标⽂件inode的映射关系
硬链接:⽂件备份软连接:类似快捷⽅式