我目前正在编写一些单用户模式维护脚本。我目前的目标是能够在单用户模式下使用 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 内部工作原理,可能确定缺少了什么?
答案1
我不确定是什么导致了这个问题,但似乎不是缺少守护进程——我尝试加载/System/Library/LaunchDaemons
除 之外的所有内容com.apple.WindowServer.plist
,但仍然以同样的方式失败。它甚至在运行 时也失败了diskutil
,而通常只会打印使用情况摘要。此外,“Killed: 9”表明它本身并没有崩溃,而是其他东西(launchd
?)正在杀死它。
无论如何,还是有一点好消息:diskutil repairpermissions
它实际上只是程序的一个前端repair_packages
,并且似乎在单用户模式下运行良好(即使没有加载任何守护进程):
/usr/libexec/repair_packages --repair --standard-pkgs
格式化磁盘可能会更困难。您可能需要考虑使用gpt
、newfs_hfs
等。
答案2
el capitan 现在正在保护权限,即使使用 /usr/libexec/repair_packages --repair --standard-pkgs(感谢),也无法修复权限 - 要修复的文件系统是只读的 - 有什么提示吗? 谨致问候并致谢 Martin