我知道可以使用磁盘仲裁框架和POSIXstatfs()
函数通过磁盘的BSD名称找到文件系统类型(apfs, hfs, msdos等)和磁盘的挂载路径。
然而,我想知道这个信息是否也写在IO注册表的某个地方,这样我就可以只使用IOKit框架提取它?
我已经搜索了我自己的Mac的IO注册表,但没有找到这样的东西,但仍然怀疑它在那里。
任何想法?
I/O Kit不涉及挂载的文件系统:这发生在BSD层,所以IOKit唯一看到的是是来自BSD子系统的对设备的读、写和ioctl
s,并由IOMediaBSDClient
转换为IOStorage方法调用。I/O Kit不关心哪个文件系统发出这些IO操作。
但是,它确实有一个"内容提示"的概念。(kIOMediaContentHintKey
)属性在IOMedia
节点上。内容提示影响哪个文件系统将尝试挂载块设备。
内容提示来自分区或卷管理方案:在GPT磁盘上,内容提示将是分区类型GUID。每个文件系统实现都会发布它正在寻找的内容提示,并且操作系统(磁盘仲裁)会为任何声称支持新出现的块设备节点的内容提示的文件系统运行mount命令。
注意内容提示只是一个提示:
- 不能保证块设备实际上包含任何特定类型的可挂载文件系统。
- 即使块设备包含可挂载的文件系统,I/O Kit也不知道它当前是否已挂载。(除了
IOStorage
节点可能是"开放的";或者不,但是任何进程都可以打开块设备,它不必是内核中的文件系统实现来做这件事。 - GPT分区类型guid和MBR分区类型编号不一定唯一。
所以简而言之,不,来自BSD和磁盘仲裁子系统的精确等效的挂载点信息在I/O Kit中不存在,尽管块设备声明包含一些关于文件系统类型的信息。