目录
文件系统
磁盘的物理结构:
磁盘的存储结构
磁盘的逻辑抽象结构
管理文件
那么文件如何与属于自己的内容关联起来?
创建一个文件,OS做了什么?
删除一个文件,OS做了什么?
软硬链接
硬链接
软连接
文件系统
打开的文件在内存中,前面谈过了,但是大量的文件在磁盘上未打开,OS就需要对它们进行管理,这些就是磁盘文件。
首先了解磁盘:
磁盘的物理结构:
在计算机中磁盘几乎是唯一机械存储设备,是永久存储介质,而相应的内存则是断电数据易丢失的存储介质。
磁盘主要特点如下:
磁盘盘面:文件数据在盘面上,两面都可以放数据
马达:磁盘主轴下有马达带动盘片高速旋转,盘片的旋转决定访问盘片的区域
读写磁头:磁头摆动决定访问磁盘内侧还是外侧吗,一个面对应一个磁头
电路板:磁盘中有电路板,用于接收磁盘协议
磁盘的制作工艺要求高:无尘环境 ,防抖(怕摔)
计算机读取磁盘原理:磁性物质有NS极,对计算机而言可以区分0,1
磁盘的存储结构
草图大概如下:
数据存储在磁盘上这些同心圆上,也就是磁道
数据存储的基本单位是一个扇区,是512字节(byte)
磁盘访问的基本单位是一个扇区,可以一次访问多个扇区
读写磁盘需要查找到某一个面,某一个磁道,某一个扇区对应了一个地址,这个地址叫做CHS地址 (柱面,盘面,扇区)
磁盘的逻辑抽象结构
比如我们以前听力用的磁带,将它拉出是一条线。同理将盘片想象成线性结构,于是这些磁盘存储结构就像连续的数组一样,这个地址是逻辑块地址LBA,管理磁盘就是对这些数组的管理,使用LBA地址,访问磁盘的时候转换成CHS地址即可。
磁盘的基本存储单位是512字节,但是IO的基本单位是4KB,这是为了提高IO的效率,为什么不保持二者的大小一样呢?这是因为硬件和软件各自是需要发展的,为了便于各自的发展,软件和硬件应当不具有强相关性,内存读取的大小也是4KB。
那么如何管理500G甚至更大的磁盘空间呢?
要管理大的内存空间,需要用到分而治之的思想,比如说将它分成100份,每份就是5G,那么只需要管理好5G的空间,再将这种管理的方法应用到每这100份空间当中就可以了。
管理文件
EXT2文件系统管理的方案是这样的,将整个大的磁盘分区分成一个个块组的概念,然后再各自对快组进行管理。将对每个块组的管理方法应用到所有对块组的管理方法上,这边是分而治之的思想。如图:
注意:保存文件=保存文件的内容+保存文件的属性,Linux将文件内容和属性分开存储,内容放在block中以4KB为单位,文件属性数据放在inode中,以128字节 为单位,文件属性是固定的稳定的大小。
各个属性作用:
Boot Block:包含内容有分区表和OS在什么地方,便于加载OS,也就是开机
Data blocks:占据了大部分磁盘空间,以(4KB)块为单位,保存文件内容
inode table:以128字节为单位,保存inode属性 ,有一个inode编号,一般一个文件对应一个inode号,查看inode编号可以用ls的 -i 选项,也可以用stat查看文件更详细的信息。
比如:查看inode编号
Block Bitmap :标识数据块(Data blocks)是否被占用的位图
inode Bitmap:标识inode块是否被占用的位图
Group Descriptor Table:存储inode数量,起始inode编号,多少block已使用,剩余多少block,总group大小,又称GDT块组描述符
super block:文件系统的顶层数据结构,管理整个分区,存放文件系统本身的结构信息,记录的信息主要有:bolck 和 inode的总量, 未使用的block和inode的数量,一个block和inode的大小等等,但是每个块组都有一份,这是为了在块组内做备份,当其中一个损毁,可以用别的块组做数据恢复。
那么文件如何与属于自己的内容关联起来?
inode中保存文件对应的blocks编号,inode中不保存文件名,Linux底层通过inode编号标识文件,而不是文件名。
注意:目录文件的文件内容保存目录文件中的文件的文件名和inode编号的映射关系,在同一个目录下无同名文件,所以知道目录名并找不到目录文件对应的inode,需要知道父目录的inode,父目录的文件内容就有该目录文件的目录名和inode的映射。
创建一个文件,OS做了什么?
首先找到未被占用的inode编号,然后找到自己所处的目录 ,根据目录的inode找到目录的datablock,将文件名和inode编号的映射关系写入到目录的数据块中
删除一个文件,OS做了什么?
先找到文件名对应inode,然后将两个位图对应位置清0,然后将文件名和inode映射关系去掉,不用真的清空文件内容,这种策略是伪删除,不仅效率高,数据没被覆盖的时候,恢复文件只要知道inode编号,将对应的位图位置置一即可。
软硬链接
硬链接
使用ln 为文件创建硬连接文件,使用和本来文件同一个inode和inode编号,本质给指定文件新增文件名和inode编号的映射,文件的硬连接数就是与inode编号映射的文件名数量:
ll可以查看硬链接数,比如创建一个普通文件的硬链接数就是1:
创建硬链接后就变成2了:
这里看出硬链接文件和源文件共用一个inode编号,硬链接文件不是独立文件。
创建目录时,目录默认是2,目录中有.文件,和inode建立了映射,也就是 . 增加目录硬连接,目录中还有..,与父目录的inode也建立的映射,所以..增加父目录的硬连接数:
软连接
使用ln -s 文件 软连接文件名为文件创建软连接,软连接文件是一个独立文件,软连接文件的inode和源文件的不同,文件保存的是指向文件的路径,相当于window下的快捷方式。
使用unlink可以删除链接文件,也可以删除其他非目录文件。