Macos 如何以编程方式确定哪个Mac驱动器是引导驱动器?

Macos 如何以编程方式确定哪个Mac驱动器是引导驱动器?,macos,cocoa,boot,iokit,Macos,Cocoa,Boot,Iokit,关于通过中的IOKit查询已安装驱动器的详细信息。但是有没有办法确定IOIteratorNext()返回的哪些设备是引导驱动器?或者更好的是,是否有一种方法可以在迭代器中仅获取由IOServiceGetMatchingServices()返回的引导驱动器??您可以使用以下方法: nvram efi-boot-device efi-boot-device <array><dict><key>IOMatch</key><dict><

关于通过中的IOKit查询已安装驱动器的详细信息。但是有没有办法确定
IOIteratorNext()
返回的哪些设备是引导驱动器?或者更好的是,是否有一种方法可以在迭代器中仅获取由
IOServiceGetMatchingServices()返回的引导驱动器?

您可以使用以下方法:

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
nvram efi引导设备
efi引导设备IOMatchioProviderClassIOMediaIOPropertyMachuid78025031-4C42-4FDE-8DD1-A515A2BF6032BLLastBSDNamedisk0s3%00

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

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


Mark Setchell引用的NVRAM信息也可从IOKit获得,路径为:
IOService:/AppleACPIPlatformExpert/AppleEFIRuntime/AppleEFINVRAM
。有一个属性
efi引导设备
。它的值是包含服务匹配字典的属性列表。正如您所看到的,它查找一个provider类为
IOMedia
的条目,其
UUID
属性是某个UUID。

这是调用命令行工具来执行脏工作。你并不总是能得到你想要的,有时你不得不满足于某个能完成任务的接近的东西——也许直到你找到更好的东西。没有法律禁止编写使用命令行工具的程序,你知道-这就是
system()
编写的目的。而且没有什么可安装的,苹果在所有Mac电脑上提供
nvram
,所以它不是一个外部包依赖项。@SevenBits说的。我可以
stat(“/”)
,但如果有某种方法可以在注册表中查找它,而不必调用
系统()
stat
对于文件系统,它会安全得多,因为我怀疑替代方案在沙盒中是否能正常工作。也许你可以以此为线索…@理论如果它在你的应用程序中不能以编程方式工作,那么调用另一个程序就不能工作。沙盒进程创建的进程继承沙盒。这是一个se安全特性;否则,沙箱将很容易被绕过,这将是无用的。谢谢你,这个答案,连同中的代码示例,正是我所需要的。