“文件系统级” API

“文件系统级” API

2025 南京大学《操作系统原理》
“文件系统级” API

文件系统目录树

UNIX/Linux: 一切都在 /

  • “/” 到底是什么?

Windows 的设计

HANDLE hDevice = CreateFile(
    "\\\\.\\PhysicalDrive0",
    GENERIC_READ | GENERIC_WRITE,
    FILE_SHARE_READ | FILE_SHARE_WRITE,
    NULL, OPEN_EXISTING, 0, NULL
);
2025 南京大学《操作系统原理》
“文件系统级” API

从无到有的目录树

mount

  • 把一个块设备上的目录树 “放到” 已有的目录
    • mount -o iso9660 /dev/cdrom /mnt/cdrom
    • 实际的 / 是 pivot_root 时的 mount point

如何挂载一个 filesystem.img?

  • 一个微妙的循环
    • 文件 = 磁盘上的虚拟磁盘
    • 挂载文件 = 在虚拟磁盘上虚拟出的虚拟磁盘 🤔
  • 试试镜像
2025 南京大学《操作系统原理》
“文件系统级” 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)
2025 南京大学《操作系统原理》
“文件系统级” API

OverlayFS (“UnionFS”, 联合挂载) 🌶️

我们可以虚拟化磁盘,为什么不能虚拟化目录?

  • 你看到的每个目录,都可能是假的
  • OverlayFS
    • lowerdir: 只读层 (修改会被丢弃)
    • upperdir: 可写层 (修改会被保留)
    • workdir: 操作系统用的临时目录

以及更多的 “文件系统级” API

  • 基于 Copy-on-Write 的文件系统级快照
    • LVM (lvcreate --snapshot) 或文件系统支持 (btrfs, zfs)
    • 实现系统备份与回滚、测试隔离、快速恢复
2025 南京大学《操作系统原理》