C++ / a working model

144 / 163   ·   C11   ·   约 8 分钟

文件系统实现

先记住这句话

本章通过一个极简的 vsfs 示例展示如何在纯软件层面设计磁盘上的核心结构来管理文件,重点讲解超级块、位图、inode 表与数据区的分工,以及系统调用如何映射到这些结构上。

本篇内容
  1. 从数据结构和访问路径理解文件系统
  2. vsfs 的固定块布局
  3. inode 如何把文件元数据固定下来
  4. 运行示例
  5. 动手练习

官方章节 PDF

从数据结构和访问路径理解文件系统

掌握文件系统的关键在于同时看清两件事:磁盘上究竟存放了哪些结构来记录数据和元数据,以及用户进程发出的 open、read、write 等调用会依次触及哪些结构。一旦这两部分都清楚,就能形成完整的心智模型,而不必死记某段具体代码。

vsfs 的固定块布局

整个分区被切成统一的 4 KB 块。最前面依次是超级块(记录总 inode 数、数据块数和魔数)、inode 位图、数据位图,接着是固定长度的 inode 表,剩余全部留给用户数据。这种简单划分让任何给定 inode 编号都能直接换算出它所在的块号和块内偏移。

inode 如何把文件元数据固定下来

每个文件对应一个固定大小的 inode,里面保存长度、权限、时间戳以及指向数据块的指针。inode 本身按编号顺序排成数组,因此定位某个 inode 只需要一次算术运算,无需搜索。正是这种“编号即地址”的设计,使得后续的读写路径可以保持最短。

常见误区

  • 误以为文件系统必须依赖特殊硬件加速
  • 把 inode 编号当成用户可见的文件名

运行一个例子

最低标准 C11 · 完整程序 · 下载 .c

#include <stdio.h>

int main(void) {
    const int block_size = 4096;
    const int inode_size = 256;
    const int inode_blocks = 5;
    int inodes_per_block = block_size / inode_size;
    int max_files = inode_blocks * inodes_per_block;
    printf("Very Simple File System (vsfs) layout simulation\n");
    printf("Block size: %d bytes\n", block_size);
    printf("Inode size: %d bytes\n", inode_size);
    printf("Inodes per block: %d\n", inodes_per_block);
    printf("Inode table blocks: %d\n", inode_blocks);
    printf("Maximum files: %d\n", max_files);
    printf("Disk layout (64 blocks):\n");
    printf("  Block 0: Superblock\n");
    printf("  Block 1: Inode bitmap\n");
    printf("  Block 2: Data bitmap\n");
    printf("  Blocks 3-7: Inode table\n");
    printf("  Blocks 8-63: Data region\n");
    int example_inum = 42;
    int block = 3 + (example_inum / inodes_per_block);
    int offset = (example_inum % inodes_per_block) * inode_size;
    printf("Example: inode %d located in block %d at byte offset %d\n", example_inum, block, offset);
    return 0;
}

在本地编译

gcc -std=c11 -Wall -Wextra -Wpedantic -Werror ostep-40-file-system-implementation.c -o example && ./example

预期结果

Very Simple File System (vsfs) layout simulation
Block size: 4096 bytes
Inode size: 256 bytes
Inodes per block: 16
Inode table blocks: 5
Maximum files: 80
Disk layout (64 blocks):
  Block 0: Superblock
  Block 1: Inode bitmap
  Block 2: Data bitmap
  Blocks 3-7: Inode table
  Blocks 8-63: Data region
Example: inode 42 located in block 5 at byte offset 2560

CHECK YOUR UNDERSTANDING

合上答案,试着解释。

若 inode 大小为 256 字节、块大小为 4 KB、inode 表占用 5 个块,该 vsfs 实例最多能容纳多少个文件?

查看参考答案

每块可放 16 个 inode,5 块共 80 个,因此上限是 80 个文件。

继续查证

标准草案与官方章节会更新;版本标记只说明示例最低要求。

回到目录