“文件把连续字节偏移映到设备块。inode保存映射入口,空闲空间记录描述哪些块可分配。OS 16设备块大小B=256B,与内存页同大只是本模型选择;现实中两者并不必须相等。”
形式陈述
本文选用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应等于目录中指向它的普通硬链接项数。新增项与计数增加、删除项与计数减少必须一起被恢复协议保护;断电若只保存其中一半,可造成泄漏或过早回收。这是文件系统日志理路文件系统重做日志与提交边界Filesystem redo journal · Journaling filesystem commit把文件数据、位图、inode和目录组成有界块事务,证明payload、commit、home和清日志的稳定顺序及再次崩溃恢复。需处理的具体元数据不变量。
路径解析若线性扫描每层目录,成本随各目录项数相加;若有散列或树索引则可降低查找工作,还要另计缓存缺失的块I/O。路径字符串长度、目录深度和inode读取不是同一个成本参数。
普通运行时的重命名原子性没有自动指定掉电结果。目录项的持久化由目录同步理路文件同步与目录持久化fsync and directory durability · fdatasync · File persistence boundary为write、设备完成、fsync文件与fsync目录各写出准确承诺,区分内容保存、名称保存和多对象原子性。处理;已经返回的文件数据同步也不等于新名字已经稳定。文件身份、运行时可见性与恢复状态应分别核对。
参考资料
- Remzi与Andrea Arpaci-Dusseau,OSTEP: Files and Directories,第39章,名称、硬链接、unlink及目录接口。
- Linux man-pages 6.19,path_resolution(7)、link(2)、unlink(2),2026-10-08核查。OS-16的inode号和目录内容为自定算例。