目录树 API

目录树 API

2025 南京大学《操作系统原理》
目录树 API

存储设备的抽象

磁盘 = 块 (字节) 序列

  • 一本书:每一页纸存储了数据
  • 支持随机访问 (翻到某一页)

文件:虚拟的磁盘

  • hello.c, a.out, ...
    • 看不到 “一页纸” 的概念
    • 字节序列:vector<char>
    • 支持 read, write, lseek, ftruncate, ...
  • 新需求:怎么管理系统中众多的文件?
    • find_file_by_name?
2025 南京大学《操作系统原理》
目录树 API

管理虚拟磁盘:建一个图书馆!

center

  • 信息的局部性:将虚拟磁盘 (文件) 组织成层次结构
2025 南京大学《操作系统原理》
目录树 API

树状分层索引:利用信息的局部性

.
└── 学习资料
    ├── .
    ├── ..
    ├── .学习资料(隐藏)
    ├── 问题求解1
    ├── 问题求解2
    ├── 问题求解3
    ├── 问题求解4
    └── 操作系统
  • 隐藏 “.” 开头的文件不是操作系统的行为,只是为了偷懒
    • if (fname[0] == '.') continue;
2025 南京大学《操作系统原理》
目录树 API

Filesystem Hierarchy Standard

约定俗成的目录结构

  • FHS enables software and user to predict the location of installed files and directories.
    • 例子:macOS 是 UNIX 的内核 (BSD), 但不遵循 Linux FHS

center

2025 南京大学《操作系统原理》
目录树 API

目录树 API

“增删改查”

  • mkdir: 创建目录
  • rmdir: 删除目录
  • getdents: 读取目录
int mkdirat(int dirfd, const char *pathname, mode_t mode);
int unlinkat(int fd, const char *path, int flag);
ssize_t getdents64(int fd, void *dirp, size_t count);
  • 看看 bash -c 'echo /etc/**/*' 的 strace
    • 更多的工具,例如 fzf 也是同样的实现
2025 南京大学《操作系统原理》
目录树 API

“目录树” 也是个妥协

center

图书馆的索引系统其实可以淘汰了

  • 一本书的内容就是它的索引
  • 由计算机决定最优的陈列方式 (就像书店)
    • 路径 \to 结构化查询 (wildcard & globbing) \to 智能检索
2025 南京大学《操作系统原理》
目录树 API

硬 (hard) 链接

需求:系统中可能有同一个运行库的多个版本

  • libc-2.27.so, libc-2.26.so, ...
  • 还需要一个 “当前版本的 libc”
    • 程序需要链接 “libc.so.6”,能否避免文件的一份拷贝?

(硬) 链接:允许一个文件被多个目录引用

  • 文件系统实现的特性 (ls -i 查看)
    • 不能链接目录、不能跨文件系统
    • 删除文件的系统调用称为 “unlink” (refcount--)
      • 现在用 “万能” 的 unlinkat,也可以删除空目录
2025 南京大学《操作系统原理》
目录树 API

软 (symbolic) 链接

软链接:在文件里存储一个 “跳转提示”

  • 软链接也是一个文件
    • 当引用这个文件时,去找另一个文件
    • 另一个文件的绝对/相对路径以文本形式存储在文件里
    • 可以跨文件系统、可以链接目录、……

几乎没有任何限制

  • 类似 “快捷方式”
    • 链接指向的位置不存在也没关系
    • (也许下次就存在了)
2025 南京大学《操作系统原理》
目录树 API

软链接:甚至可以用来制作 Galgame

center

(上个时代有海量游戏是这个风格)

游戏 = 状态机

  • 用当前目录表示状态,符号连接实现迁移 (图像: nyaigc)
2025 南京大学《操作系统原理》
目录树 API

软连接:还可以用来 “伪造” 文件系统!

Nix: 这个题我会

center

  • 把所有软件包的所有版本都集中存储
  • /nix/store/b6gvzjyb2pg0kjfwrjmg1vfhh54ad73z-firefox-33.1
    • 然后用符号链接构建一个完全虚拟的环境
      • 完全的 deterministic: 由软件包的 hash 决定
  • 可以随时随地构建 “任意” 环境
    • nix-shell -p python3 nodejs
2025 南京大学《操作系统原理》