前言:
文件从某种角度进行分类可以分为被进程打开的文件和未被进程打开的文件,被进程打开的文件存在于内存中,因此也成为内存文件,没有被打开的文件存在于磁盘中,因此未被打开的文件也被称为磁盘文件.
在学习磁盘文件的侧重点有哪些??
站在单个文件的角度,文件在哪个路径下?文件的属性是什么?站在系统的角度下,还可以存储文件的空间大小是多少?如何进行找到特定文件?系统下一共有多少文件?文件的属性存放到哪里?
了解磁盘文件
内存文件的特性---掉电易失存储介质
磁盘文件的特性---永久存储介质(SSD U盘 flash卡 光盘 磁带)
磁盘和内存相比既然有优于内存的永久存储介质的优势,必然有不如内存的特性,其最显著的就是磁盘进行文件的拷贝的速度慢,而且磁盘是计算机中唯一一个机械设备,既然拷贝速度特别慢,操作系统肯定会想一定的方法进行提高磁盘的速度.
磁盘的物理结构
数据存放在磁片,我们知道数据在计算机中的存储方式是以二进制的方式进行存储的,盘片可以理解成被压扁的电池,是拥有磁极的,磁头是可以进行改变盘片的磁极,从而实现数据的二进制的存储
磁盘的存储结构
若干个盘片的相同位置的磁道组成一个柱面,一个磁道分为若干个扇区,扇区是存储数据的基本单位.一般扇区的大小是512字节先进的已经来到了4K.
如何将数据进行写入磁盘?
- 首先需要确定数据在那一个柱面上
- 然后通过磁头进行确定数据在那个盘面上
- 最后确定是哪一个扇区
上面这种将数据进行写入磁盘的方式称为CHS寻址(cylinder-head-sector),通过CHS寻址就可以找到任何一个扇区进行写入数据,从而实现对磁道 柱面的控制.
磁盘的抽象结构
抽象结构也叫做逻辑结构和虚拟结构
所谓的抽象结构解释将圆形的磁道进行展开每个扇区进行拼接形成的线性结构,这个线性结构是一个数组,每个扇区都存在在这个数组结构中,通过数组进行查找对应扇区的内容的寻址方式称为LBA寻址(Logical Block Addressing(逻辑块寻址))
存储结构和抽象结构的对应关系
- 将数据进行写入到盘片的扇区,就是将数据进行写入到sector disk数组中
- 找到盘片中指定扇区就是找到对应的数组下标
- 对存储的数据进行管理就是对数组进行管理
磁盘的分区管理
想要对磁盘进行管理其实就是对磁盘的分区进行管理,对每个磁盘的分区进行管理,分区的管理又继续细致称对块组(Block Group)的管理,从而实现对磁盘进行管理
注:磁盘进行分区后并没有改变磁盘连续的结构,还是只有一个sector disk数组
Boot Block
Boot Block这个区域是磁盘上负责启动操作系统的关键区域,包含了启动代码和分区信息,用于计算机启动时加载操作系统的信息.根据Boot Block分区的功能按道理来说应该磁盘应该有一个Boot Block就可以了,没有必要磁盘的每个分区都有一个Boot Block,其实磁盘进行这样的设计是有一定的道理的,当我们进行开机时,某一个分区的数据起不来后,通过其他分区的Boot Block进行同步数据保证该分区能够正常运行
Block Group
文件系统的共识:数据在磁盘中是以512字节为基本单位进行存储的,但是操作系统(文件系统)是以4KB为基本单位进行存储数据的,为什么不以磁盘存储的基本单位作为文件系统的基本单位呢??这里原因有二,其一是减少操作系统和磁盘的IO次数,提高效率;其二是降低软件和硬件层面的耦合度,防止由于硬件的更换导致软件层面基本单位的变化
- Super Block
该区域用于存储文件系统的属性信息,包括一些分区情况,从该区域的功能来说,该区域应该放到和块组同等的位置区域,但是该区域放到了块组下,其实这样设计也是为了备份,防止磁头进行刮到该区域造成文件系统混乱,有多个该区域就可以增大容错率,当某一个信息被挂掉后可以通过其他该区域进行信息的同步.
- Data Block
在Linux中文件的存储是将文件内容和文件属性进行分开存储的,Data Block中存储的是文件的内容也就是多个4KB的集合.
- Inode Table
该区域是一个128字节的空间,是一个类似于表的结构,是用于存储该块组中文件的属性,一般而言一个文件一个inode一个inode编号
- Block Bitmap
一个块组中有若干个Data Block,既然有若干个Data Block需要对文件内容进行管理,记录哪个区域已经有了内容哪些位置还可以继续进行存储,为了进行管理通过位图进行记录,比特位和block进行一一对应,block被占用用1进行表示,没有被占用用0进行表示.
- Inode Bitmap
一个块组中的所有文件的属性信息通过Inode Table进行存储,也是用位图进行管理inode,比特位和inode进行一一对应,1表示inode被占用,0表示inode没有被占用.
- Group Descriptor Table
super block用于存储文件系统的属性信息,Group Descriptor Table用于存储块组的属性信息,用于管理块组.
文件内容是如何进行查找的??
一个文件只对应一个inode节点,只有一个inode编号,但是一个文件可能有多个block(一个block的大小仅有4KB当一个文件的大小超过4KB时显然是不能够满足的),那么文件是如何将存储的内容进行联系起来的呢??
通过inode编号找到对应inode节点,从inode节点中获取block对应的内容位置,虽然block数组的大小仅有15个int的空间,但是数组中是可以进行存储其他位置的编号信息从而将文件内容进行串联呈现.
找到文件的路径
inode编号→BlockGroup→inode→属性→内容
如何进行找到inode编号??
在目录下进行创建文件是通过文件名进行创建文件的,一个目录下不能有相同的文件名存在,但是Linux下inode中是没有文件名的概念的,文件inode编号是依附于目录文件的,文件的inode编号和文件进行映射存于目录文件的Data Block中.
温故知新
我们之前学习文件的权限的时候,进行进入目录的时候我们需要有x权限,目录的本质是一个特殊文件,存储了文件名到文件inode的映射表。访问目录内的文件时,系统需要“遍历”这个映射表,而x权限控制的就是这种“遍历能力”。在目录中进行创建文件需要拥有w权限,本质就是将文件名和inode编号的映射关系写到目录的data block中;在进行显示目录的信息需要拥有r权限,也是进行读取目录data block中的信息
操作系统是如何在目录下进行创建文件的??
操作系统通过super block找到特定目录所在的块组,然后遍历inode bitmap找到第一个为0的位图将inode编号赋予文件,然后将文件的属性信息进行加载到inode table中,假设数组的内容为空,将block bitmap对应的位置进行置0,data block也进行置空即可.最后将用户对文件进行的命名和inode编号的映射关系存于目录的data block中.
操作系统是如何进行删除文件的??
操作系统根据删除文件的inode编号进行将inode bitmap对应位置进行置0,然后更新GDT中的信息,这里文件的内容和属性是没有被清空的,当后续进行创建文件后这个被删除文件的inode编号被使用时,删除文件的内容和属性信息才会被覆盖.这也是为什么下载慢而删除快的原因.
系统是如何进行查看文件的??
将当前路径下的目录的data block进行找到文件的inode编号,然后通过inode文件编号进行找到inode,将文件的属性信息进行呈现出来.
创建文件失败的原因
- inode编号用完了
- data block没有空间进行存储创建文件的内容
软硬链接
软硬链接的创建
创建软连接
ln -s 目标文件 链接文件
创建硬链接
ln 目标文件 链接文件
软硬链接的区别
软连接拥有独立的inode编号是新创建的一个文件,文件中的内容是软连接指向的目标文件路径,相当于window下的快捷方式;而硬链接的inode值和原文件的inode值相同不是独立的文件相当于给原文件起了个别名,并非真正创建了文件,而是建立了文件名和指定inode的映射方式.
硬链接下的引用计数
通过引用计数我们就可以知道特定的inode和多少个文件名建立了映射关系,当进行删除建立映射关系的文件名时引用计数就会进行相应减法.
当我们进行创建一个目录时,初始目录的引用计数就是2,为什么呢??
其实就是首先目录自己和inode进行建立映射,其次是目录内的 . 和inode建立的映射关系,在此目录下进行在创建目录时,引用计数还会进行增加是因为新目录下的 ..和该目录是硬链接.