使 diskutil 命令在 OSX Mavericks 单用户模式下工作

Ale*_*umb 4 disk-utility osx-mavericks macos

我目前正在编写一些单用户模式维护脚本。我目前的目标是能够在单用户模式下使用 diskutil 命令执行权限修复和磁盘格式化。在以前版本的 OS X 中执行此任务很简单,只需挂载根分区并启动以下启动守护程序:

com.apple.diskmanagementd

com.apple.diskarbitrationd

之后,我只需要运行以下命令即可成功修复权限:

diskutil repairpermissions /

但是,在 Mavericks 中,此命令不再有效,我不知道为什么。运行 diskutil 命令(即使没有参数)会返回一条简单且无用的消息:

Killed: 9

我无法弄清楚这里发生了什么。除了 diskutil 需要的磁盘仲裁守护程序之外,我的维护脚本还加载了以下守护程序:

com.apple.notifyd

com.apple.syslogd

com.apple.configd

com.apple.kuncd

com.apple.kextd

com.apple.KernelEventAgent

com.apple.distnoted.xpc.daemon

com.apple.aslmanager

com.apple.opendirectoryd

com.apple.coreservicesd

com.apple.securityd

com.apple.fseventsd

com.apple.cfprefsd.xpc.daemon

无论是加载上述所有守护程序还是仅加载之前使 diskutil 运行所需的两个守护程序,我都会得到相同的响应。如果我选择从单用户模式启动(通过加载 /System/Library/LaunchDaemons 的全部内容),我可以在计算机完成启动过程后使用 diskutil。

更了解 Mac OS 内部工作原理的人能否确定缺少什么?

Gor*_*son 5

我不确定是什么导致了这个问题,但它似乎不是一个丢失的守护进程——我尝试在/System/Library/LaunchDaemonsexcept 中加载所有内容,但com.apple.WindowServer.plist它仍然以同样的方式失败。它甚至无法运行diskutil,它通常只打印使用情况摘要。此外,“Killed: 9”表明它并没有崩溃,而是其他东西(launchd?)正在杀死它。

无论如何,有一个好消息:diskutil repairpermissions它实际上只是程序的前端repair_packages,并且在单用户模式下似乎运行良好(即使根本没有加载任何守护程序):

/usr/libexec/repair_packages --repair --standard-pkgs
Run Code Online (Sandbox Code Playgroud)

格式化磁盘可能会更困难。您可能需要考虑使用gptnewfs_hfs等。