磁盘的空间管理
如何对磁盘空间进行管理?
假设在一块大小为500G的磁盘中,500*1024*1024=524288000KB。在磁盘中,扇区是磁盘的基本单位(一般大小为512byte),而文件系统访问磁盘的基本单位是4KB,因此500G就被分成了131072000个扇区,将这些扇区看作为数组。而如果对这500GB进行分盘(C盘50G,D盘100G等),因此对500G磁盘的管理也就是对分的C盘50G,D盘100G的管理,相同,对于C盘50G的管理又被分化成对C盘中5个10G的管理。因此只要管理好局部,就能管理好整体,将整体细化成小等份进行管理即可(如下图)。
在Linux中,文件由数据与属性组成,这里数据内容存储在block(一般是4KB)中,属性存放在inode(磁盘上的另一块空间,一般是128字节)中,因此一个扇区(512字节)可以存储4个inode。但是内容可以增多或减少,而属性是不变的。
- Date blocks:里面包含许多Data Block,并且占磁盘的绝大部分空间,每一个Data Block大小是4KB。Data Blocks的作用是以块(这里的块就是Data Block)为单位,对文件内容进行保存,OS将文件每4KB分为一块进行保存,不够4KB也按照4KB保存。
- inode table:里面包含大量的inode空间(每个inode大小为128字节),用于保存文件属性。这里的inode可以理解成一个结构体(struct inode,其中保存着对应文件的Data Block编号,这使得Data Blocks与inode进行相互关联),结构体内部包含文件属性(所有者,权限等),并且以二进制的形式将实例化对象(struct inode i)写到inode空间里面。一般而言,一个文件有一个inode编号,以保证文件的唯一性。
- Block Bitmap:意思是位图,用于判断Data Blocks上的空间是否被占用。通过比特位上的数据来判断数据块中哪些空间被使用,哪些空间没被使用(0000 0000表示空空间都没有被使用,0000 1010表示1号位和3号位空间被使用)。
- Inode Bitmap:用于判断inode哪些空间被占,哪些空间没有被使用。
- Group Descriptor Table:简称GDT,块组描述符,用于描述inode表和数据块的起始位置。
- Super Block:用于记录存放文件系统本身的信息,记录Data Block和inode Block中的使用量以及未使用量等。并不是每个Block Group都含有Super Block,Super Block存在的意义是如果Super Block出现损坏可以通过其他Super Block对文件进行恢复。
注意:文件名也是文件的属性,但是在Linux中,并没有文件名的概念,而是通过inode对应的Data Block编号来识别文件的,因此要找到文件,就必须找到该文件对应inode编号,找到inode编号就能找到文件的Data Blocks,从而找到文件内容。那么如何找到inode呢?
我们知道,目录其实也是文件,是文件就具有文件内容和属性,这里目录的文件内容其实就是文件与目录的inode编号的映射关系。当我们在某一个目录下创建一个文件的时候,OS会根据当前目录下的Inode Bitmap找到未使用空间,将创建的文件的属性写入到该未使用的inode上,然后再根据Block Bitmap找打未使用的Data Block,然后填写数据到Data Block上,最后返回该文件的inode。最后返回的inode编号找到该文件所处的目录,根据目录的inode找到目录的Data Block,然后将文件名与inode的映射关系写入到目录的Data Block中。(这就是为什么inode中不保存文件名,因为文件名在目录中)
当删除一个文件的时候,根据目录的inode和要删除的文件名,找到目录的Data Block,根据文件名的映射关系找到文件的inode,再根据要删除文件的inode找到该文件的BlockGroup,将要删除文件的inode Bitmap和Block Bitmap的位图上的标志位由1置为0,最后取消该文件与目录的映射关系。
软连接与硬连接
软连接:
如上图,在/home/101-asy/linux/2024-12-06/d1/d2/d3目录下编译成的可执行文件mytest1,如果在/home/101-asy/linux/2024-12-06下执行需要带该文件的路径: ./d1/d2/d3/mytest1;但是如果使用软连接的方式:ln -s ./d1/d2/d3/mytest1 mytest1.s在/home/101-asy/linux/2024-12-06目录下生成一个软连接的可执行文件mytest1.s。这个软连接可以理解成快捷键。
如上图,软连接的文件与源文件的inode不同(因此软连接文件是一个独立的文件,也要进行分配inode,填写属性Data block,映射等操作),并且软连接文件的内容其实是源文件的所在路径。
硬连接:
创建的硬链接文件与原文件的inode相同,所谓的硬连接就是在当前目录下,给指定的文件新增文件名和inode编号的映射关系。
硬连接数是指向同一inode文件的数量,用于标识有多少个文件指向当前inode文件。
为什么创建的文件默认硬连接数是1呢???而文件夹又是2呢???
如上图,我们知道硬连接数表示有几个文件名指向该文件。当创建file文件时,file文件本身就指向了该文件,因此file文件本省就是一个硬连接数。而对于文件夹来说除了文件夹名本身外其内部还有一些文件:
以目录d4为例,d4的硬连接数为3,分别为d4文件名本身指向d4,d4目录下的.文件指向d4,以及d5目录下的..文件指向d4。