【问题标题】:How do I programmatically determine which Mac drive is the boot drive?如何以编程方式确定哪个 Mac 驱动器是引导驱动器?
【发布时间】:2014-11-07 21:52:07
【问题描述】:

this question 中有关通过 IOKit 询问已安装驱动器的重要信息。但是有没有办法确定IOIteratorNext() 返回的哪些设备是引导驱动器?或者更好的是,有没有办法在IOServiceGetMatchingServices() 返回的迭代器中只获取引导驱动器?

【问题讨论】:

    标签: macos cocoa boot iokit


    【解决方案1】:

    引导是从媒体完成的,而不是设备本身。设备有媒体,媒体有卷。我不相信 IOKit 中表示卷。

    这可能是使用磁盘仲裁最简单的方法。将DADiskCreateFromVolumePath()CFURL 一起用于/。然后调用DADiskCopyDescription()获取描述字典。这将包括卷、媒体、设备甚至总线的属性,包括 IOKit 路径(如果需要)。不过,您要查找的信息很有可能直接在描述字典中。

    Mark Setchell 引用的 NVRAM 信息也可从 IOKit 获得,路径为 IOService:/AppleACPIPlatformExpert/AppleEFIRuntime/AppleEFINVRAM。有一个属性efi-boot-device。它的值是一个包含服务匹配字典的属性列表。如您所见,它查找提供程序类为IOMedia 的条目,其UUID 属性是某个UUID。

    【讨论】:

    • 谢谢,这个答案以及this question 中的代码示例正是我所需要的。
    【解决方案2】:

    你可以用这个:

    nvram efi-boot-device
    
    efi-boot-device <array><dict><key>IOMatch</key><dict><key>IOProviderClass</key><string>IOMedia</string><key>IOPropertyMatch</key><dict><key>UUID</key><string>78025031-4C42-4FDE-8DD1-A515A2BF6032</string></dict></dict><key>BLLastBSDName</key><string>disk0s3</string></dict></array>%00
    

    【讨论】:

    • 这是在调用命令行工具来做脏活。他想要以编程方式。
    • 你并不总能得到你想要的,有时你不得不接受一些接近的东西来完成这项工作——也许直到你找到更好的东西。没有法律禁止编写程序以使用命令行工具,你知道 - 这就是 system() 的用途。而且没有什么可安装的,Apple 在所有 Mac 上提供 nvram,所以它不是外部包依赖。
    • @SevenBits 所说的。我可以stat("/"),但是如果有某种方法可以在注册表中查找它而无需调用文件系统system()stat,它会更安全,因为我怀疑替代方案在一个沙盒。
    • @theory 如果它不能在你的应用程序中以编程方式工作,那么它不会通过调用另一个程序来工作。由沙盒进程创建的进程会继承沙盒。这是一项安全功能;否则,沙盒会很容易被绕过,它会毫无用处。
    猜你喜欢
    • 2011-05-22
    • 1970-01-01
    • 2011-02-14
    • 1970-01-01
    • 2012-12-20
    • 2021-04-12
    • 2012-02-01
    • 2011-04-16
    • 2010-10-04
    相关资源
    最近更新 更多