从macOS内核扩展装载/卸载文件系统
从macOS内核扩展装载/卸载文件系统,macos,filesystems,kernel-extension,xnu,Macos,Filesystems,Kernel Extension,Xnu,hdiutil可以将包含HFS+分区的DMG文件附加和分离到选定的装入点。但是,它使用了diskmages.framework的私有API。我的目标是使这个任务完全程序化,因此我在内核驱动程序领域寻找替代方案 在深入研究由表示的KPI时,我发现了根据匹配的fsid卸载文件系统的有用方法: int vfs_unmountbyfsid(fsid_t *fsid, int flags, vfs_context_t ctx) 然而,我们是否有相反的装载操作 没有用于启动装载的公共KPI,我甚至不知道c
hdiutil
可以将包含HFS+分区的DMG文件附加和分离到选定的装入点。但是,它使用了diskmages.framework
的私有API。我的目标是使这个任务完全程序化,因此我在内核驱动程序领域寻找替代方案
在深入研究由
表示的KPI时,我发现了根据匹配的fsid卸载文件系统的有用方法:
int vfs_unmountbyfsid(fsid_t *fsid, int flags, vfs_context_t ctx)
然而,我们是否有相反的装载操作 没有用于启动装载的公共KPI,我甚至不知道
com.apple.KPI.private
中有函数。然而,在用户空间中,可供您使用的不仅仅是DiskImages.framework:还有DiskArbitration.framework
,当然还有mount(2)
的POSIX系统调用
我认为您可能在这里混淆了两个概念,它们实际上是完全独立的:
IOHDIXController
对象中实现(该对象的代码在kext中),您可以在IORegistry的IOResources
中找到该对象。当用户双击.dmg文件或类似文件时,diskimages helper
守护进程将打开并解析该文件,并指示IOHDIXController创建一个新的IOIskAgeBlockStorageDeviceOutKernel
实例(一个IOBlockStorageDevice
子类)。在操作系统看来,这就像一个物理块设备,通常的IOBlockStorageDriver
->IOMedia
->IOPartitionScheme
->IOMedia
->iomediabdclient
对象堆栈在其上进行自我配置。然后,这会导致设备发现事件在diskclarationd
中触发,这将进入流程的第二部分:在新发现的IOMedia
对象的/dev/diskXsY
节点上调用mount(2)
(视情况而定)
据我所知,HDIX子系统没有打开。因此,如果您想实现自己的磁盘映像格式,您需要重新创建类似于Apple的diskimage helper
和IOHDIXController.kext
的东西。如果愿意的话,您可以完全在内核中实现它,尽管这可能不是一个好主意
第二部分,挂载,如果您正在使用IOStorage堆栈,则由diskjusticationd自动完成,但您可以通过磁盘仲裁程序来影响它。有关详细信息,请参阅DiskArbitration.framework。但这也会影响由diskmages helper
处理的磁盘映像的装载,因此,如果您使用的是它支持的映像格式,则无需编写自己的映像,只需截取装载并自行执行任何操作即可
您也可以完全绕过IOStorage堆栈,只在kext中创建BSD dev节点。在这种情况下,Disk仲裁不应该注意到它,您需要从守护进程显式调用mount()
我希望这能澄清问题。嗨,我希望我的进程负责将dmg文件附加到mounpoint进程中的原因是,我有一个kauth模块,它可以在访问图像文件(.dmg)时过滤掉其他进程,并避免将apple工具(如hfs_mount和hdiutil)列入白名单。请注意,dmg已经是hfs+格式的,我只需要将其附加到某个挂载点,以便访问其内容。我尝试使用磁盘仲裁,DADiskMount,但它需要设备名称而不是映像文件。顺便说一下,我尝试使用
mount(2)
,但根据struct hfs\u mount\u args
,它需要设备文件。为了使装载过程完全以编程方式进行,我唯一缺少的是模仿将图像文件(dmg)附加到设备文件的hdiutil attach
。你知道怎么做吗?thanks@Zohar81我认为你把安装和打开磁盘映像混淆了。这是两个独立的过程。我已经更新了我的答案来解释它是如何工作的。