从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系统调用

我认为您可能在这里混淆了两个概念,它们实际上是完全独立的:

  • 打开磁盘映像并创建虚拟块设备以访问其内容
  • 在块设备上装载文件系统
  • 磁盘映像支持不是xnu内核的固有部分。它们在
    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我认为你把安装和打开磁盘映像混淆了。这是两个独立的过程。我已经更新了我的答案来解释它是如何工作的。