索引分配与UNIX inode
索引分配与UNIX inode
复习定位
inode(索引节点)是Linux/ext2-4文件系统的核心数据结构——每个文件(和目录)都有一个inode存储它的元数据。inode中有15个指针(或更多)来定位文件数据块——前12个指向直接数据块——后面的指向间接块。这种混合索引结构让大多数小文件不需要间接寻址(性能好)——大文件通过多层次索引(可以非常大)。
inode的结构
inode(inode index)是非持久性存储中的结构——超级块(超级块存储文件系统本身的信息)。inode中的字段:
- 文件类型和权限(如-rwxr-xr-x)
- 文件硬链接计数
- 文件所有者和所属组
- 文件大小(精确字节数)
- 时间戳(ctime/atime/mtime)
- 直接块指针(12个)
- 一级间接块指针(1个)
- 二级间接块指针(1个)
- 三级间接块指针(1个)
每个直接指针指向一个数据块(如4KB)。对大多数小文件——12个直接块覆盖48KB——无需访问间接块(节省一次磁盘I/O)。当文件超过48KB——使用一级间接块——间接块是一个磁盘块——存放额外的数据块指针(若每个指针4字节——一个间接块可存1024个指针→映射4MB)。文件超过4MB+48KB→使用二级间接块——再映射1024×1024×4KB=4GB。三级间接块映射4TB。
这种多层结构——小文件零额外间接I/O开销——超大文件通过多级索引依然可以定位到任一块——但大文件的随机写意味着需要更新多个间接块(开销更大)。
硬链接和软链接
硬链接——两个目录项指向同一个inode。在文件系统中——删除文件名只是从目录中删除目录项——inode的链接计数减1——只有当链接计数变为0——文件数据才真正被删除。硬链接不能跨越文件系统(因为inode号只在同一文件系统内唯一)。
软链接(符号链接)——是存放目标路径的普通文件——有独立的inode和数据块。读取符号链接时——系统自动将访问重定向到目标文件。符号链接可跨文件系统、可指向目录——但如果原文件被删除——符号链接变为"悬空"(指向不存在文件)。
ln file1 file2 # 硬链接——file1和file2指向同一inode
ln -s /path/to/file symlink # 软链接——symlink指向/path/to/file目录的实现
目录文件——存储"文件名→inode号"的映射。在ext4中——目录项包含inode号、文件类型(用于快速文件过滤而不必加载inode)、以及文件名。查找文件时——扫描该目录文件中的每个目录项——找到匹配文件名的项——获得inode号——读取inode→读取数据块。
复习检查
inode中前12个直接块指针覆盖多少字节的文件——如果一个文件只有500字节——需要使用间接指针吗?
假设块大小4KB、指针大小4字节——一个一级间接块可以再映射多少个数据块——映射文件的大小是多少(1024×4KB=4MB)——二级间接块映射多少次(1024×1024×4KB=4GB)?
硬链接和软链接的根本区别——硬链接是直接指向同一inode——软链接是存储目标路径的独立文件——盘上是否有自己的inode和数据块?删除原文件后——软链接和硬链接各自状态如何?
为什么不能跨文件系统建立硬链接——因为inode号只在同一文件系统内唯一——不同文件系统中的同一个inode号代表完全不同的文件——跨文件系统的inode号碰撞导致无法使用。
目录文件中存储了什么信息——为什么从路径查找文件的步骤是先扫描文件名所在目录的目录文件、找到对应目录的inode、再递归直到找到文件的inode——这个过程称为路径解析——相对路径和绝对路径的性能差异?