1. 文件元数据
我们使用 ls -l 的时候看到的除了看到文件名,还看到了文件元数据。
每行包含7列内容,分别为 模式,硬链接数,文件所有者,组,大小,最后修改时间,文件名。
ls -l 读取存储在磁盘上的文件信息,然后显示出来。
![](https://i-blog.csdnimg.cn/direct/48b4b291ad6544a0a9014f68362fa2f7.png)
2. 文件系统
我们已经知道,文件=内容+属性。在Linux中,文件的内容和属性是分开管理的,因为文件的内容大小是不确定的,而每个文件的具有属性都是相同的,只是属性值不同。Linux把文件的属性放在结构体struct inode中管理。
struct inode 是Linux文件系统中的一个核心数据结构,用于表示文件或目录的元数据。每个文件或目录在文件系统中都有一个唯一的inode号码,该号码由文件系统分配。struct inode 包含了文件的类型、大小、权限、时间戳、链接数(有多少文件名指向这个节点)等信息。
可以通过 ls 的 -i 选项查看文件的inode编号:
接下来我们以Linux ext2文件系统为例简单了解一下文件系统,下图为磁盘文件系统图(内核内存映像肯定有所不同),虽然目前有了最新的ext4文件系统,但其内部管理方式差别不大,均采用inode来唯一标识文件,并通过块(block)来存储文件数据。
1. Boot Block,Block Group(分组), Group Descriptor Table 和 Super Block(超级块)
Boot Block用于计算机开机时告知磁盘的分区情况,帮助计算机加载操作系统等。
文件系统整体是由Block Group,Group Descriptor Table 和 Super Block管理的。
![](https://i-blog.csdnimg.cn/direct/5cd1906088cb42c996c8286d4e3871a7.png)
2. inode Table 和 inode Bitmap(inode位图)
Inode Table 包含了文件系统中所有 inode 的实际数据结构,当新创建文件的时候,就需要给这个文件分配一个inode。每个 inode 存储了文件或目录的元数据,如文件权限、所有者、文件大小、时间戳以及指向文件数据块的指针。Inode Table 中的每个 inode 都有一个唯一的编号,这个编号可以通过文件路径或文件名通过文件系统的目录结构来解析,以找到具体的文件或目录信息。
Inode Bitmap 是文件系统中用于跟踪 inode 使用情况的一种数据结构。它是一个位图,其中的每一位对应文件系统中的一个 inode。如果某个 inode 被使用,则相应的位被设置为 1;如果某个 inode 未被使用,则相应的位被设置为 0。Inode Bitmap 允许文件系统快速识别出哪些 inode 是空闲的,从而可以分配给新文件或目录。
3. Data blocks(数据块)和 Block Bitmap(块位图)
我们知道
文件=内容+属性,我们已经了解文件的属性被inode管理,而inode被分组中的inodeTable管理。文件中内容则是由 Block Bitmap 与 Data blocks 来管理。
Data blocks是文件系统中用于实际存储文件数据的基本单位。在文件系统中,文件的内容被分割成多个数据块,这些数据块按照文件的逻辑顺序存储在磁盘上。数据块的大小在文件系统格式化时确定,并且对于整个文件系统是固定的。数据块的大小可以影响文件系统的性能,因为它决定了文件存储的最小单位和磁盘I/O操作的效率.。
Block Bitmap是文件系统中用于跟踪数据块使用情况的一种数据结构。它是一个位图,其中的每一位对应文件系统中的一个数据块。如果某个数据块被文件占用,则相应的位被设置为 1;如果某个数据块未被占用,则相应的位被设置为 0。块位图允许文件系统快速识别出哪些数据块是空闲的,从而可以分配给新文件或目录。块位图是文件系统管理存储空间的重要工具,它提高了文件分配和回收的效率.。
现在总结一下刚才讲解的结构:
Boot Block:描述整个硬盘的分区情况,帮助计算机加载操作系统
Super Block:描述一个分区,文件系统的核心
Group Descriptor Table:宏观描述一个分组
inode Table:存储当前分组所有文件的inode
inode Bitmap:标识当前分组的inode的使用情况
Data Blocks:管理当前分组的数据块
Block Bitmap:标识当前分组的数据块的使用情况
3. 创建新文件过程
创建一个新文件主要有一下4个操作:
1. 存储属性
内核先找到一个空闲的 inode(示例为263466),把文件信息记录到其中。
2. 存储数据
该文件需要存储在三个磁盘块,内核找到了三个空闲块:300,500,800。将内核缓冲区的第一块数据复制到300,下一块复制到500,以此类推。
3. 记录分配情况
文件内容按顺序300,500,800存放。内核在inode上的磁盘分布区记录了上述块列表。
4. 添加文件名到目录
新的文件名abc。linux如何在当前的目录中记录这个文件?内核将入口(263466,abc)添加到目录文件。文件名和inode之间的对应关系将文件名和文件的内容及属性连接起来。
实际上文件名不属于文件的属性,也不存在于inode中。
文件名存在于目录中,而不存在于文件本身。我们通过目录来访问文件名,本质是去目录文件中,通过文件名找到对应的inode编号,然后再访问到文件。