【问题标题】:Mount/Unmount filesystem from macOS kernel extension从 macOS 内核扩展挂载/卸载文件系统
【发布时间】:2018-08-08 19:09:22
【问题描述】:

hdiutil 可以将包含 HFS+ 分区的 DMG 文件附加和分离到选定的挂载点。但是,它使用 DiskImages.framework 的私有 API。我的目标是让这个任务完全编程,所以我在内核驱动领域寻找替代方案。

在深入研究<sys/mount.h> 表示的 KPI 时,我发现了根据匹配的 fsid 卸载文件系统的有用方法:

int vfs_unmountbyfsid(fsid_t *fsid, int flags, vfs_context_t ctx)

但是,我们对 mount 有相反的操作吗?

【问题讨论】:

    标签: macos filesystems kernel-extension xnu


    【解决方案1】:

    没有用于启动挂载的公共 KPI,我什至不知道 com.apple.kpi.private 中的函数。然而,在用户空间中,您可以使用的不仅仅是 DiskImages.framework:还有 DiskArbitration.framework,当然还有 mount(2) 的 POSIX 系统调用。

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

    1. 打开磁盘映像并创建用于访问其内容的虚拟块设备
    2. 在块设备上挂载文件系统。

    磁盘映像支持不是 xnu 内核的固有部分。它们在IOHDIXController 对象中实现(代码在kext 中),您可以在IORegistry 中找到附加到IOResources 的对象。当用户双击 .dmg 文件或类似文件时,diskimages-helper 守护程序打开并解析它并指示 IOHDIXController 创建一个新的IODiskImageBlockStorageDeviceOutKernel 实例(IOBlockStorageDevice 子类)。这对操作系统来说就像一个物理块设备,IOBlockStorageDriver -> IOMedia -> IOPartitionScheme -> IOMedia -> IOMediaBSDClient 对象的通常堆栈在它之上配置自己。然后,这会导致设备发现事件在 diskarbitrationd 中触发,然后进入流程的第二部分:根据需要在新发现的 IOMedia 对象的 /dev/diskXsY 节点上调用 mount(2)

    据我所知,HDIX 子系统尚未开放。因此,如果您想实现自己的磁盘映像格式,则需要重新创建类似于 Apple 的 diskimage-helperIOHDIXController.kext 的内容。如果您愿意,您可以完全在内核中实现它,尽管这可能不是一个好主意。

    如果您使用 IOStorage 堆栈,则第二部分(挂载)由磁盘仲裁自动完成,但您可以通过磁盘仲裁异议者来影响它。有关详细信息,请参阅 DiskArbitration.framework。但这也可以让您影响由diskimages-helper 处理的磁盘映像的挂载,因此,如果您使用它支持的映像格式,则无需编写自己的,并且可以简单地拦截挂载并做任何您想做的事情做自己。

    您也可以完全绕过 IOStorage 堆栈,只在您的 kext 中创建 BSD 开发节点。在这种情况下,disarbitrationd 不应该注意到它,您需要从您的守护进程中显式调用 mount()

    我希望能澄清一些事情。

    【讨论】:

    • 嗨,我希望我的进程负责将 dmg 文件附加到 mounpoint 进程的原因是我有 kauth 模块,它在访问图像文件(. dmg),并避免将苹果工具(如 hfs_mount 和 hdiutil)列入白名单。请注意,dmg 已经是 hfs+ 格式,我只需要将它附加到某个挂载点,这样我就可以访问它的内容。我尝试进行磁盘仲裁,DADiskMount 但它需要设备名称而不是图像文件。
    • 顺便说一下,我尝试使用mount(2),但它需要根据struct hfs_mount_args的设备文件。为了使挂载过程完全以编程方式进行,我唯一缺少的就是模仿将图像文件(dmg)附加到设备文件的hdiutil attach。知道如何做到这一点吗?谢谢
    • @Zohar81 我认为您将安装与打开磁盘映像混淆了。这是 2 个独立的过程。我已经更新了我的答案,以准确解释它是如何工作的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-08
    • 2018-11-12
    • 1970-01-01
    • 2012-11-12
    • 2021-08-20
    • 2015-03-03
    相关资源
    最近更新 更多