一·、从硬件出发
1)磁盘的主要构成
通常硬盘是由盘片、主轴、磁头、摇摆臂、马达、永磁铁等部件组成,其中一个硬盘中有多块盘片和多个磁头,堆叠在一起,工作时由盘片旋转和摇摆臂摇摆及逆行寻址从而运作,磁头可以对盘片进行读写操作,磁头和盘片之间不是挨着的,而是存在一个很小的距离,很具制作工艺不同,可能达到微米级或者是纳米级。每一个盘片的双面都可以进行数据读写,每一面对应一个磁头。
2)磁盘查找数据
在硬盘上,每一个扇面都有对应的一个磁头,每个扇面都被一个个同心圆划分为多个圆环,这些圆环叫做柱面或者磁道、每一个柱面又被多条半径切割为若干个小块,称作扇区,扇区是磁盘IO的基本单位但不一定是系统IO的基本单位,每一个扇区可以存储的数据大小是相同的,所以越中心区密度越大,越往外密度越小。每个磁头、盘面、柱面、扇区都有自己唯一的编号,所以当查找数据的时候只需要磁头编号、柱面编号、扇区编号这三个参数即可,该定位方法叫做CHS定位法。
3)磁盘逻辑结构抽象
在磁盘层面,由于每一次IO读取的单位是一个扇区,而每一个扇区的大小都是相同的,所以所有盘面上的所有扇区可以抽象为一个数组,每一个单位都是一个扇区,在操作系统启动的时候,可以获取每个盘面上柱面的个数以及柱面上扇区的个数。当获取到了一个需要进行读取的sectorno后,只需要对扇区编号通过以下操作就可以获取CHS参数,再通过CHS定位法找到指定位置。
在操作系统层面,由于一次IO只读取一个扇区太慢了,所以会将多个连续的扇区绑定在一起,称为数据块,每次IO读取一个数据块,在管理时,只需要指导起始扇区和扇区偏移量就可以找到所需要读取的扇区编号,再交给磁盘进行IO。文件系统对整个磁盘又进行了分区,每个分区又经过了分组划分为不同的组。
二、文件系统对分组的管理
文件系统管理
在磁盘分区格式化时,分区就被划分为一个个分组,分组大小确定后不能改变直至下一次格式化,每个分组由SuperBlock、Group Descriptor Table、Block Bitmap、inode Bitmap、inode Table、Data Blocks组成。在文件系统中,由于文件的内容大小不确定,而文件属性的大小是确定的,所以文件的内容和文件属性是分别存储的。每个系统分区都一定挂载在某个文件下面,访问文件时都是通过文件绝对路径进行访问,使用路径匹配就能确定文件所在的分区。
超级块(Super Block):存放文件系统本身的结构信息。记录的信息主要有:bolck 和 inode的总量, 未使用的block和inode的数量,一个block和inode的大小,最近一次挂载的时间,最近一次写入数据的时间,最近一次检验磁盘的时间等其他文件系统的相关信息。Super Block的信息被破坏,可以说整个 文件系统结构就被破坏了
GDT(Group Descriptor Table):块组描述符,描述块组属性信息
块位图(Block Bitmap):Block Bitmap中记录着Data Block中哪个数据块已经被占用,哪个数据块没 有被占用。
inode位图(inode Bitmap):每个bit表示一个inode是否空闲可用。在创建一个文件时,会自动遍历inode位图,找到第一个未被占用的节点,将其改为已经占用并且记录偏移量,在节点表中找到对应的位置的inode进行属性管理。
i节点表(inode Table):存放文件属性,如文件大小、所有者、最近修改时间、权限、inode编号(在分区中是唯一的)等。
数据区:存放文件内容。
文件查找逻辑
在查找文件时,先通过文件inode编号确定在哪个分组当中,通过inode编号-分组起始inode编号得到偏移量,再通过偏移量,在inode Table中查找对应的inode。在inode结构体中,存在一个block数组用于存放文件对应的数据块位置,其大小是15,其中前12个位置直接指向存放数据的数据块,13、14两个位置存放的数据块里面存放存储数据的数据块位置,(即a,b,c...指向数据,a,b,c...存放在d中,13、14指向d)15在13、14的基础上再套一层(即a,b,c,指向数据,a,b,c存放在d中,d存放在e中,15指向e)。
超级块(Super Block)
一个文件系统只存在一个Super Block,只存在于个别分组中,并不是每个分组都存在,每个超级块的数据始终保持一致,这样做的原因是为了将数据块进行备份,同时保持较高的效率。超级块存放了每个分组inode编号的范围,记录了分区的容量与使用情况。
重谈文件的增删查改
在linux下面,任何文件都一定在某个文件夹下面,文件夹的本质也是一个文件,其内容存放的是目录下面的文件名和inode编号映射关系,在创建文件的时候,在创建inode后,还需要将inode编号和文件名映射关系写入到文件夹的数据区中。
所以,在文件夹没有写权限的时候,无法在该文件夹下面创建、修改或者是删除文件,而文件夹没有读权限的时候,无法读取文件夹下面的文件信息。在对文件进行增删查改的时候,都需要对所在的文件夹进行修改,以此类推,直至对根目录文件进行修改。