Skip to content

模型Model

文件对象、目录与路径名

Inode directory and pathname · Hard link and symbolic link · 硬链接与符号链接

把名称到文件对象的映射与对象本身分开,执行逐分量路径解析、硬链接计数、符号链接与删除后的存活。

形式陈述 ​

本文选用Unix式文件对象模型。一个inode是文件系统内有身份的对象记录,保存类型、大小、权限、链接数及数据块定位信息;目录是从名称分量到inode身份的映射。路径是访问这个映射图的指令,不是文件本身的永久身份。inode号的唯一性只在给定文件系统和相应生命周期内成立,释放后的号码可以复用。

OS-16的目录中,每个普通名称唯一对应一个inode。绝对路径从根目录开始,相对路径从进程当前目录开始,逐分量查找;非末分量必须解析为可遍历目录。这里省略权限身份细节,但每一步仍必须通过该目录的搜索权限检查,不是只检查最终文件的读写位。

硬链接是在目录里新增一个指向同一inode的名称;nlink是硬链接数。符号链接则是一个独立对象,内容为路径字符串,解析时按规则重新跟随它。相对符号链接以它所在目录为起点,不能一律以调用进程的当前目录为起点。符号链接可跨文件系统,也可悬空或形成环;解析器需限制跟随次数或检测环。

直觉

路径名回答“从哪里走到它”,inode回答“走到的是哪个文件对象”。两个名字可以通往同一个对象;同一个名字也可以在替换后通往另一个对象。已经打开的文件引用通常跟随对象,不会因某路径被替换而自动跳到新对象。

链接数与打开次数也不同。某文件只有一个名称,仍可被多个进程打开;删掉最后一个名称后,已经打开它的进程仍可能继续使用它。回收需要把名称和运行中的引用都考虑进去。

例子与边界

同一文件的两条名称路径 ​

根目录含d -> inode2。目录d含log -> inode42,inode42内容为abcdefgh、nlink=1。执行硬链接/d/alias指向inode42后,d同时有log和alias,nlink=2。经log写入的字节,经alias读取也改变,因为它们不是两个副本。

另建符号链接/d/shortcut,其对象inode44保存字符串alias。解析/d/shortcut时,先找到inode44,再以目录d为起点查alias,最终得到inode42。删除alias后,shortcut成为悬空链接,但log仍可找到inode42;删符号链接只删除inode44的名称,不会把它指向的inode42一并删除。

动作 d中的相关项 inode42.nlink 已打开的inode42引用
初始并打开log log→42 1 1
新增硬链接alias log→42,alias→42 2 1
删除log alias→42 1 1
删除alias 无指向42的名称 0 1
关闭最后打开对象 无 0 0,可回收

OS-16在最后一行才释放inode42及其块。若还有文件映射或其他内核持有者,也须等它们结束。unlink是删除一个目录项,不承诺立即覆写数据,更不是安全擦除。

路径重命名不搬动现有打开对象 ​

假设/d/current原来指inode42,另一个文件/d/tmp指inode43。原先打开current的fd仍指inode42;把tmp重命名替换current后,新的open解析到inode43。两个进程都说“我打开了current”,若时间不同便可能拿到不同对象。

Linux/Unix式硬链接一般不能跨文件系统,也通常禁止普通用户对目录任意建硬链接,以维持目录结构与遍历语义。符号链接只是路径内容,没有这些相同限制,却可能因为目标移动而失效。

推论与应用

对每个存活普通文件,在OS-16一致命名状态中,nlink应等于目录中指向它的普通硬链接项数。新增项与计数增加、删除项与计数减少必须一起被恢复协议保护;断电若只保存其中一半,可造成泄漏或过早回收。这是文件系统日志需处理的具体元数据不变量。

路径解析若线性扫描每层目录,成本随各目录项数相加;若有散列或树索引则可降低查找工作,还要另计缓存缺失的块I/O。路径字符串长度、目录深度和inode读取不是同一个成本参数。

普通运行时的重命名原子性没有自动指定掉电结果。目录项的持久化由目录同步处理;已经返回的文件数据同步也不等于新名字已经稳定。文件身份、运行时可见性与恢复状态应分别核对。

参考资料
关系图谱7 个相邻概念 · 1 类关系

拖动节点调整位置。

显示关系

显示:依赖

  1. 前置三跳
  2. 前置二跳
  3. 前置一跳
  4. 当前条目
  5. 后续一跳
  6. 后续二跳
  7. 后续三跳
文字版关系按与当前条目的最短距离分组