进程中讨论的都是被打开的文件,那在磁盘中有大量的没有被打开的文件,需要系统进行管理。
一、磁盘
磁盘(disk)是指利用磁记录技术存储数据的存储器。
磁盘是计算机主要的存储介质,可以存储大量的二进制数据,并且断电后也能保持数据不丢失。早期计算机使用的磁盘是软磁盘(Floppy Disk,简称软盘),如今常用的磁盘是硬磁盘(Hard disk,简称硬盘)。
磁盘结构:
- 盘片:一个磁盘(如一个 1T 的机械硬盘)由多个盘片叠加而成。盘片的表面涂有磁性物质,这些磁性物质用来记录二进制数据。因为正反两面都可涂上磁性物质,故一个盘片可能会有两个盘面。
- 磁道、扇区:每个盘片被划分为一个个磁道,每个磁道又划分为一个个扇区。其中,最内侧磁道上的扇区面积最小,因此数据密度最大。
- 柱面:每个盘面对应一个磁头。所有的磁头都是连在同一个磁臂上的,因此所有磁头只能“共进退”。所有盘面中相对位置相同的磁道组成柱面。
磁盘存储数据:
磁盘存储数据的基本单位是扇区,一般扇区大小为512自己(4KB),每一面盘片被被分为多个通同心的圆,也就是磁道,每一个磁道上划分多个相同大小的扇区
如何找到一个扇区?CHS寻址方式
- 在哪一个磁道(柱面)上,Cylinder
- 在哪一个面上(对应的就是哪一个磁头),Head
- 在哪一个扇区上,Sector
磁盘的抽象(逻辑、虚拟)结构:
相当于将每一个磁道拉长,再按顺序依次链接起来。所以在逻辑上就可以看成一个数组,每一个扇区就是数组中的一个元素
- 所以就认为磁盘是线性结构,要访问某一个扇区,就是直接定位数组的下标,( LBA寻址(logic block address))。
- 操作系统内部使用的是 LAB寻址,LAB方式寻址和 CHS方式寻址可以相互转化,这样就实现了系统对磁盘之间数据的交互。
二、inode
磁盘空间很大,管理成本高,磁盘采用分治思想,对磁盘进行分区,对于每一个分区来说,分区的头部会包括一个启动块(Boot Block),对于该分区的其余区域系统将其划分为一个个的块组(Block Group)
启动块的大小是确定的,而块组的大小是由格式化的时候确定的,并且不可以更改,每个分区的大小由 OS 决定
每个块组都有着相同的结构,都由超级块(Super Block)、块组描述符表(Group Descriptor Table)、块位图(Block Bitmap)、inode位图(inode Bitmap)、inode表(inode Table)以及数据表(Data Block)组成
- Block Group:文件系统会根据分区的大小划分为数个Block Group,而每个Block Group都有着相同的结构组成
- 超级块(Super Block):存放整个文件系统本身的结构属性信息。主要有:bolck 和 inode 的总量,未使用的block和inode 的数量,一个 block 和 inode 的大小,最近一次挂载的时间,最近一次写入数据的时间,最近一次检验磁盘的时间等其他文件系统的相关信息。Super Block 的信息被破坏,可以说整个文件系统结构就被破坏了
- GDT(Group Descriptor Table):块组描述表,描述块组属性信息。对应分组的宏观的属性信息,inode有多少个,已经使用多少,已经被占用多少个,还剩下多少个。
- 块位图(Block Bitmap):Block Bitmap 中记录着 Data Block 中哪个数据块已经被占用,哪个数据块没有被占用
- inode位图(inode Bitmap):用每个位表示每一个对应的inode 是否被使用
- inode属性节点表(inode Table):存放文件属性,如文件大小,所有者,最近修改时间,每个文件的 inode编号等
- 数据区(Data Blocks):存放文件内容
- 超级块(Super Block)是每个块组都有一个,不能像Boot Block一样在分区的开头,如果某个块组的Super Block出现异常,因为每一个分区都有一个相同的Super Block,就可以将同一分区下其他块组中的Super Block拷贝到出异常的Super Block中。
- 磁盘的格式化本质上就是重新写入文件系统,比如 Windows 下的磁盘分区 C/D/E...盘,假设对E盘格式化就是对该分区重新写入文件系统
- 在 Linux 下,磁盘文件的内容和属性是分开存储的,文件属性里面有一个重要的东西:inode,inode 是固定大小的,一般是 128字节,也有 256字节的。Linux 下的 inode 一般是 128字节,每一个文件都有一个 对应的inode。
- inode 几乎包含了文件的所有的属性,文件名除外,文件名并不在 自己的inode 中存储,在对应的目录文件的inode中存储的
inode的是一个结构体,其中包含了文件的属性信息,以及数据存放的信息
文件内容放在data blocks中,文件属性保存在inode中,而inode内部有一个数组,保存对应data blocks块的编号,二者就联系起来了。
如果存储文件特别大,怎么办?
在data block中,不是所有的data block都只能存文件数据,也可以存其他块的块编号。inode内部的block数组的最后三个元素指向的数据块,就不是存储文件的数据,而是存的是其他块的块编号。这三个元素分别是一级索引、二级索引和三级索引。当该文件使用数据块的个数超过12个时,会使用这三个索引进行数据块扩充,不用担心数据块不够使用
目录文件:
也有自己的inode,有自己的data blcok,其中会保存目录下存在的文件名和其对应inode编号的映射关系。文件名是用户给的,inode编号是系统给的。
1.创建文件,系统做了什么
- 在某一个块中,遍历inode btimap,找到一个空闲的,未被使用的inode,将其由0置为1
- 在inode table中找到对应的inode,将属性信息写入进去
- 将文件名和inode编号,在目录文件的data block中建立映射关系
2.删除文件,系统做了什么?
- 找到文件所在目录,根据目录的inode找到目录的data block,在其中根据文件名和映射关系找到文件inode编号
- 根据inode,将inode bitmap对应位置0
- 根据inode,将block bitmap对应位置0
- 在目录文件的data block中删除该映射关系
3.查看文件,系统做了什么?
- 显示文件名时,根据目录文件找到所要查看文件的inode
- 根据inode在inode table中找到属性信息显示出来
- 根据inode在data block中找到文件内容显示出来
三、软硬链接
1.软链接
ln -s l1/l2/mytest mytest
从图中可以看出软链接之后,该链接文件有新的inode编号,所以是一个独立的文件,所以就可以理解软链接文件的内容就指向对应的路径
软链接的作用:软链接就类似于windows下的快捷方式(桌面的软件图标就是该软件exe的快捷方式,软件实际上的存储位置并不在桌面,我们可以通过快捷方式直接去执行该exe文件)。当执行路径非常深,导致路径非常长不方便记忆,因此我们可以通过软链接来访问文件,这样就不用每次都输入长长的路径来访问文件
2.硬链接
ln log.txt hard_log.link
硬链接没有独立的inode,所以没有生成一个独立的文件。就是在指定的目录下,建立了文件名与指定inode的映射关系。
在inode结构体中,有一个引用计数,当有文件指向这个inode时,引用计数+1,当删除一个文件的时候,引用计数-1,当引用计数为0的时候,这个文件才算真正的删除,也就是在磁盘上被完全释放。
默认创建目录,为什么引用计数(硬链接数)为2?
- 因为:自己目录名指向这个inode,目录内还有个 . 文件(当前目录文件)也指向这个inode
- 特别的,在当前目录下创建再一个目录,当前目录的硬链接数会变为3,因为当前目录下创建的那个目录中存在的 .. 文件(
..
表示上一层目录,它也是文件名)和inode也是一组映射。
Linux不允许普通用户给目录创建硬链接,因为假如给根目录创建硬链接,新创建的硬链接的文件名从根目录开始查找,查找到的硬链接就是根目录,此时就造成了递归式查找(环形查找),导致软件无法正常进行查找。因此不允许普通用户给目录建立硬链接。