如何编程确定哪个Mac驱动器是启动驱动器?

3

这个问题中,有关通过IOKit询问已安装驱动器的重要信息。但是,有没有一种方法可以确定IOIteratorNext()返回的设备中哪一个是启动驱动器?更好的方法是,可能有一种方法可以只获取IOServiceGetMatchingServices()返回的迭代器中的引导驱动器吗?

2个回答

4
启动是从介质中进行的,而不是直接从设备启动。设备有介质,介质有卷。我不认为卷在IOKit中有表示。
这可能最容易使用磁盘管理来实现。使用DADiskCreateFromVolumePath()CFURL(用于/)进行调用。然后调用DADiskCopyDescription()以获取描述字典。其中包括卷、介质、设备甚至总线的属性,包括如果需要的IOKit路径。但是,您要查找的信息很可能直接在描述字典中。
Mark Setchell引用的NVRAM信息在IOKit中也可用,其路径为IOService:/AppleACPIPlatformExpert/AppleEFIRuntime/AppleEFINVRAM。有一个名为efi-boot-device的属性。它的值是包含服务匹配字典的属性列表。如您所见,它寻找提供商类别为IOMedia且其UUID属性为特定UUID的条目。

谢谢,这个答案以及这个问题中的代码示例正是我所需要的。 - theory

0
你可以使用这个:
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

这是调用命令行工具来完成一些繁琐的工作。他希望以编程方式实现。 - SevenBits
你并不总能得到你想要的,有时你必须妥协于一些接近目标的东西 - 或许在找到更好的之前。没有法律禁止编写使用命令行工具的程序 - 这就是 system() 的用途。而且无需安装任何东西,在所有 Mac 上,Apple 都提供了 nvram,因此它不是外部软件包的依赖项。 - Mark Setchell
就像@SevenBits所说的那样。我可以使用stat("/"),但如果有一种方法可以在不调用system()stat文件系统的情况下在注册表中查找它,那么这将更加安全,因为我怀疑替代方案在沙盒中的工作效果不佳。 - theory
也许你可以把这个当作一个线索... http://www.opensource.apple.com/source/system_cmds/system_cmds-550.10/nvram.tproj/nvram.c - Mark Setchell
如果在您的应用程序中无法以编程方式工作,则通过调用另一个程序也无法工作。由沙盒化进程创建的进程继承了沙盒。这是一项安全功能;否则,沙盒将非常容易被规避,变得毫无用处。 - SevenBits
我会看一下上面@Ken Thomases的答案,也许可以行得通。 - SevenBits

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接