文件系统 API

文件系统 API

2024 南京大学《操作系统:设计与实现》
文件系统 API

文件系统

文件 = struct file_operations

  • 数据文件:hello.c, a.out, ...
    • 虚拟的磁盘
    • vector<char>
  • 设备驱动
    • null, nuke0, ...
  • 虚拟文件
    • 进程的地址空间, ...

新需求:怎么管理系统中众多的文件?

  • find_file_by_name?
2024 南京大学《操作系统:设计与实现》
文件系统 API

一个新的需求:管理文件

文件那么多,怎么找到想要的?

  • 信息的局部性:将虚拟磁盘 (文件) 组织成层次结构

center

2024 南京大学《操作系统:设计与实现》
文件系统 API

思路:信息的局部性

树状层次结构

  • 逻辑相关的数据存放在相近的目录
.
└── 学习资料
    ├── .学习资料(隐藏)
    ├── 问题求解1
    ├── 问题求解2
    ├── 问题求解3
    ├── 问题求解4
    └── 操作系统
2024 南京大学《操作系统:设计与实现》
文件系统 API

麻烦的是 “非数据” 的文件

UNIX/Linux: Everything is a File

  • 一切都在 “/” 中 (例子:中文语言包, fstab)

Windows 的设计

HANDLE hDevice = CreateFile(
    "\\\\.\\PhysicalDrive0",
    GENERIC_READ | GENERIC_WRITE,
    FILE_SHARE_READ | FILE_SHARE_WRITE,
    NULL, OPEN_EXISTING, 0, NULL
);
2024 南京大学《操作系统:设计与实现》
文件系统 API

UNIX 的设计:目录树的拼接

mount: 将一个目录解析为另一个文件系统的根

mount(source, target, filesystemtype, mountflags, data);
  • 再看 “最小 Linux”
    • 初始时只有 /dev/console 和几个文件
    • /proc, /sys, 甚至 /tmp 都没有
      • 答案:它们都是 mount 系统调用创建出来的
  • UNIX 一贯的设计哲学:灵活
    • Linux 安装时的 “mount point”
      • /, /home, /var 可以是独立的磁盘设备
2024 南京大学《操作系统:设计与实现》
文件系统 API

Quiz

如何挂载一个 filesystem.img?

  • 一个微妙的循环
    • 文件 = 磁盘上的虚拟磁盘
    • 挂载文件 = 在虚拟磁盘上虚拟出的虚拟磁盘 🤔
  • 试试镜像
2024 南京大学《操作系统:设计与实现》
文件系统 API

Linux 的处理方式

创建一个 loopback (回环) 设备

  • 设备驱动把设备的 read/write 翻译成文件的 read/write
  • drivers/block/loop.c
    • 实现了 loop_mq_ops (不是 file_operations)

观察挂载文件的 strace

  • lsblk 查看系统中的 block devices (strace)
  • strace 观察挂载的流程
    • ioctl(3, LOOP_CTL_GET_FREE)
    • ioctl(4, LOOP_SET_FD, 3)
2024 南京大学《操作系统:设计与实现》
文件系统 API

Filesystem Hierarchy Standard

我们看到的目录结构

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

center

2024 南京大学《操作系统:设计与实现》
文件系统 API

文件系统 API: 目录管理

mkdir

  • 创建目录

rmdir

  • 删除一个空目录
  • 没有 “递归删除” 的系统调用
    • rm -rf 会遍历目录,逐个删除 (试试 strace)

getdents

  • 返回 count 个目录项 (ls, find, tree 都使用这个)
    • 更友好的方式:globbing
2024 南京大学《操作系统:设计与实现》
文件系统 API

硬 (hard) 链接

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

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

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

  • 文件系统实现的特性 (ls -i 查看)
    • 不能链接目录、不能跨文件系统
    • 删除文件的系统调用称为 “unlink” (refcount--)
2024 南京大学《操作系统:设计与实现》
文件系统 API

软 (symbolic) 链接

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

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

几乎没有任何限制

  • 类似 “快捷方式”
    • 链接指向的位置不存在也没关系
    • (也许下次就存在了)
2024 南京大学《操作系统:设计与实现》
文件系统 API

软链接:可以用来制作 Galgame

center

(上个时代有海量游戏是这个风格)
2024 南京大学《操作系统:设计与实现》
文件系统 API

软链接:可以用来制作 Galgame

center

2024 南京大学《操作系统:设计与实现》