NTFS 源码阅读引导(0) -- 总览
在 macOS 系统下, NTFS 文件系统实现有两大类:
- 内核扩展实现: 通过
vfs_ops
对接相应功能. - 用户空间实现: 有两种(实际三种, 两种中间层方案算作一种)
- 中间层: 基于 Fuse(实际也需要安装内核扩展) 和基于 NFS(无需安装内核扩展), 此两种均有成熟框架的支援.
- 系统框架: macOS 15 中提供的 FSKit, 实际通过 FSkit 内核扩展配合一个 fskitd daemon 实现. 代码对接的是框架提供的标准协议接口.
但无论哪种实现, 均需要有一个成熟的 NTFS 实现, 故这个系列的文章, 主要介绍 NTFS 用户空间实现的核心源码. 过程中会穿插苹果的开源 NTFS 实现(内核扩展)和 NTFS-3G(可使用 Fuse 内核中间层, 或 Fuse 转 NFS 中间层)来看.
源码总览
NTFS-3G 整体结构如下:
- include:
- fuse-lite: Linux 下的 fuse 头文件, macOS 下的请参考 macfuse(已闭源).
- ntfs-3g: NTFS 核心实现对应头文件.
- libfuse-lite: fuse 精简版实现.
- libntfs-3g: NTFS 核心实现(对接 fuse).
- ntfsprogs: NTFS 的若干实用工具实现.
苹果开源的 NTFS 内核扩展实现整体结构如下:
- kext: NTFS 核心实现(对接 vfs)
- mount: 专用的 NTFS 挂载程序(其中指定用哪个内核扩展和对应参数)
- newfs: bootcamp 支援和 NTFS 格式化.
- ntfs.util: NTFS 相关实用程序.
总体步骤
由于目前主要目的是熟悉用户空间侧的实现, 因此 NTFS-3G 和苹果开源 kext 实现在过程中会结合起来看. 并且进一步整体介绍和熟悉 NTFS.
附: 磁盘相关概念
- sector 为磁盘最小的计量单位, 一个 sector 一般来说都是 512 字节. 若存储一个 800 字节文件, 则需要两个 sector.
- cluster 由一个或多个连续 sector 构成, 但数量必须是 2 的幂, 即: 1, 2, 4, 8... 个 sector 构成.
- cluster 越大, 产生磁盘碎片的可能性越小.(机械硬盘)