索引节点包含元数据并指向实际数据的位置。但是系统如何知道文件或文件夹在目录树中的位置,以及如何将文件名转换为 i 节点?
如果您能从文件系统的角度解释一下我请求文件 /folder/directory/filename 时发生的过程,我将不胜感激。
答案1
从技术上讲,目录只是一个包含文件名、其 inode 编号和属性的文件。在 BSD 和 Plan9 中,您甚至可以像文件一样读取它。(尽管在现代文件系统上,磁盘上的格式是某种二叉树,而不是顺序列表。)
基本过程(对于类 Unix 路径)是:
- 将给定的路径拆分为以
/
/
内核已经知道了的位置。- 扫描目录
/
以查找名为“ ”的项目folder
。获取关联的 inode 编号。- 如果
/folder
不是目录(或指向目录的符号链接),则返回 ENOTDIR。
- 如果
- 扫描目录
/folder
以查找名为“ ”的项目directory
。获取 inode 编号,读取 inode,查找数据。 - 扫描目录
/folder/directory
以查找名为“ ”的项目filename
并获取关联的 inode 编号。 - 读取inode并获取文件的元数据,权限位,数据位置等。
注意:/
、/folder
和/folder/directory
可以是完全独立的文件系统的挂载点。一种常见的配置是为 有一个分区,/
为 有另一个分区/home
。(这也适用于非 Unix 系统,例如 Windows NT。)上述过程应列出内核挂载表中的查找项。