从macOS内核扩展中挂载/卸载文件系统
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从macOS内核扩展中挂载/卸载文件系统相关的知识,希望对你有一定的参考价值。
hdiutil
可以将包含HFS +分区的DMG文件附加到选定的挂载点。但是,它使用DiskImages.framework
的私有API。我的目标是使这个任务完全编程,所以我在内核驱动程序领域寻找替代方案。
在深入研究由<sys/mount.h>
表示的KPI时,我找到了根据匹配的fsid卸载文件系统的有用方法:
int vfs_unmountbyfsid(fsid_t *fsid, int flags, vfs_context_t ctx)
但是,我们对mount有相反的操作吗?
启动挂载没有公共KPI,我甚至不知道com.apple.kpi.private
中的函数。然而,在用户空间中,除了DiskImages.framework之外还有很多东西:DiskArbitration.framework
,当然还有mount(2)
的POSIX系统调用。
我想你可能会在这里混淆2个概念,这些概念实际上完全是分开的:
- 打开磁盘映像并创建用于访问其内容的虚拟块设备
- 在块设备上挂载文件系统。
磁盘映像支持不是xnu内核的固有部分。它们在IOHDIXController
对象中实现(代码为kext),您可以在IORegistry中找到IOResources
。当用户双击.dmg文件或类似文件时,diskimages-helper
守护程序将打开并解析它并指示IOHDIXController创建一个新的IODiskImageBlockStorageDeviceOutKernel
实例(IOBlockStorageDevice
子类)。这在操作系统中看起来像一个物理块设备,并且通常堆叠的IOBlockStorageDriver
- > IOMedia
- > IOPartitionScheme
- > IOMedia
- > IOMediaBSDClient
对象将其自身配置在其上。然后,这将导致设备发现事件在diskarbitrationd
中触发,该事件将移至进程的第二部分:在新发现的mount(2)
对象的IOMedia
节点上调用/dev/diskXsY
。
据我所知,HDIX子系统没有打开。因此,如果您想要实现自己的磁盘映像格式,则需要重新创建类似于Apple的diskimage-helper
和IOHDIXController.kext
的内容。如果你愿意,你可以完全在内核中实现它,尽管它可能不是一个好主意。
如果您使用的是iostorage堆栈,第二部分是挂载,它是通过diskarbitrationd自动完成的,但您可以通过磁盘仲裁异议器来影响它。有关详细信息,请参阅DiskArbitration.framework。但是这也可以让你影响diskimages-helper
处理的磁盘映像的安装,所以如果你使用它支持的图像格式,你就不需要编写自己的图像格式,只需截取挂载并做你想做的任何事情。你自己。
您也可以完全绕过IOStorage堆栈,只在您的kext中创建BSD dev节点。在这种情况下,diskarbitrationd不应该注意到它,你需要从你的守护进程中明确地调用mount()
。
我希望澄清事情。
以上是关于从macOS内核扩展中挂载/卸载文件系统的主要内容,如果未能解决你的问题,请参考以下文章