macOS 27 Golden Gate 最新beta的hdiutil man page里,苹果加了一句话:这个工具已被弃用,以后磁盘映像操作请统一改用diskutil image。用了二十多年的老命令,就这么被beta文档判了缓刑。
有开发者拿两者做了实测:同样打包一个用户主目录,diskutil image比hdiutil快了一分钟出头(约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这类容错选项,在新工具里也还没出现。
Homebrew三天经历了什么
理论对比之外,已经有真实的生产事故。Homebrew在issue #23401里提出把构建流程从hdiutil迁移到diskutil image,PR #23414很快合并。结果CI流水线立刻卡死——diskutil image在无GUI的headless环境下遇到需要用户确认的许可协议(EULA),没有对应的处理方式,进程就这么挂在那里,不报错也不继续。两天后,Homebrew只能把迁移整个回滚,退回hdiutil。
- 风险.一个连Homebrew这种成熟项目都没扛住的迁移,意味着更多依赖
hdiutil脚本化打包的中小团队,一旦跟风升级会遇到同样的静默卡死。
苹果自己的文档也没对齐
再看一层更微妙的事实:这份"弃用"声明目前只出现在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许可协议这些缺口补上。工具迭代从来不稀奇,稀奇的是这次连"弃用"这两个字,苹果自己都没在三份文档里说清楚。
