macOS 27 Golden Gate 最新beta的hdiutil man page里,苹果加了一句话:这个工具已被弃用,以后磁盘映像操作请统一改用diskutil image。用了二十多年的老命令,就这么被beta文档判了缓刑。

有开发者拿两者做了实测:同样打包一个用户主目录,diskutil imagehdiutil快了一分钟出头(约40-45秒对110-115秒),生成的dmg文件也更小(2.8GB对2.89GB)。听起来是个干净利落的升级。问题出在细节里——新工具遇到root权限文件时不会像老工具那样弹认证框,而是直接报"Operation not permitted",不告诉你为什么。

快是真快,但认证机制没跟上

hdiutil打包时如果碰到root用户拥有的文件,会弹出授权对话框,输入管理员密码就能继续,这套流程很多Mac用户已经习惯了很多年。diskutil image遇到同样的文件,直接失败,verbose模式也不给原因,唯一的解法是手动删掉那个root文件。

这不是选项少几个的问题,是两套权限体系没对齐。Unix文件所有权认证和macOS的TCC隐私授权本来就是两条线,hdiutil用弹窗把这两条线缝在了一起,diskutil目前还没补上这一针。此外-puppetstrings这类给脚本读进度的参数、-skipunreadable这类容错选项,在新工具里也还没出现。

hdiutil vs diskutil image 实测对照 hdiutil(老工具) 耗时 110-115秒 体积 2.89 GB 遇root文件 弹认证框,可继续 Trash文件夹 默认包含 diskutil image(新工具) 耗时 40-45秒 体积 2.8 GB 遇root文件 静默报错,不说明 Trash文件夹 默认排除

Homebrew三天经历了什么

理论对比之外,已经有真实的生产事故。Homebrew在issue #23401里提出把构建流程从hdiutil迁移到diskutil image,PR #23414很快合并。结果CI流水线立刻卡死——diskutil image在无GUI的headless环境下遇到需要用户确认的许可协议(EULA),没有对应的处理方式,进程就这么挂在那里,不报错也不继续。两天后,Homebrew只能把迁移整个回滚,退回hdiutil

  • 风险.一个连Homebrew这种成熟项目都没扛住的迁移,意味着更多依赖hdiutil脚本化打包的中小团队,一旦跟风升级会遇到同样的静默卡死。
Homebrew 迁移事故时间线 提出迁移 issue #23401 PR合并上线 PR #23414 紧急回滚 CI因EULA卡死

苹果自己的文档也没对齐

再看一层更微妙的事实:这份"弃用"声明目前只出现在beta版man page里。苹果正式发布的macOS 27 release notes,列了一堆废弃项(比如加密HFS+ CoreStorage),唯独没提hdiutil。官方"Packaging Mac software for distribution"指南,现在仍然教开发者用hdiutil create -srcFolder打包分发。

三份文档,三种口径。这不是简单的疏漏,更像是苹果内部的工具团队、文档团队、发布说明团队各写各的,谁也没等谁对齐就把beta man page先放出去了。

一份连自己文档团队都没读过的弃用公告,先在用户的CI流水线里炸了。

谁该现在就当心

真正受影响的不是普通用户,是三类人:直接调用hdiutil API的第三方磁盘工具(比如作者曾参与开发的Knox这类应用)、跑自动化打包脚本的CI流水线、以及每天用hdiutil做增量备份的高级用户。diskutil目前默认强制排除~/.Trash,相当于隐性开启了-scrub,如果你的备份脚本依赖完整快照,升级之后可能悄悄丢数据而毫无提示。

  • 结论.GM版本发布前,先别把生产脚本或备份流程全量切到diskutil image,hdiutil目前仍是唯一稳定路径。

真正该盯的不是速度提升了多少,是苹果会不会在GM前把-puppetstrings、权限认证、headless许可协议这些缺口补上。工具迭代从来不稀奇,稀奇的是这次连"弃用"这两个字,苹果自己都没在三份文档里说清楚。