hdiutil 在 macOS 27 中被弃用,替代品早已上线

macOSTahoe ·
hdiutil 在 macOS 27 中被弃用,替代品早已上线

苹果在 macOS 27 中弃用了 hdiutil,转而使用 diskutil image。这个命令你的 Mac 今天就已经有了——但它缺少一些你可能正在用的功能。

macOS 27 Golden Gate 的 man 手册里,多了一行以前从未出现过的文字:

在 macOS 27.0 中,hdiutil 已被弃用。所有磁盘映像操作请改用 diskutil image。

自 Mac OS X 10.0 起,hdiutil 就是 Mac 上制作、挂载、转换和检查磁盘映像的方式。如果你曾经发布过 .dmg、写过安装脚本、搭建过打包 Mac 应用的 CI 任务,或者制作过用来保护隐私的加密容器,你就用过它——不管是直接使用,还是通过某个替你调用它的工具。

但大多数报道都漏掉了这一点:替代品不是「即将到来」,而是早已在你的 Mac 上。 现在就在 macOS 26 Tahoe 上打开终端,运行 diskutil image,它会响应。

核心要点

  • diskutil image 在 macOS 26 上已经能用。 已在 macOS 26.5.2(build 25F84)上验证。你现在就可以迁移并测试脚本,不必等 macOS 27 发布。
  • 弃用不等于移除。 hdiutil 在 macOS 27 中依然可用,第一天不会有任何东西被破坏。但苹果已经削减了它七年之久,man 手册记录了每一步。
  • 命令覆盖面小得多。 hdiutil 暴露了 23 个动词(verb),diskutil image 只暴露 5 个子命令。
  • 没有 detach。 你可以用 diskutil image 挂载(attach)磁盘映像,但不能用它卸载——卸载被移到了 diskutil eject。
  • 有些功能目前确实没有替代方案,包括 verify、compact 和 makehybrid。如果你的构建脚本用到了这些,现在还没有迁移路径。

第一步:在你自己的 Mac 上确认

这些话不要只听我说,一个命令就能验证:

diskutil image

在 macOS 26.5.2 上,它会打印:

OVERVIEW: Manipulate disk images (attach, create, etc)

USAGE: diskutil image [--verbose] [--stdinpassphrase] [--plist] <subcommand>

SUBCOMMANDS:
  attach                  Attach a disk image as a device.
  info                    Print info regarding a disk image.
  create                  Create a disk image. Either blank or from an existing
                          source (disk, disk image or folder).
  resize                  Resize a given image to a specified size if
                          applicable.
  chpass                  Change the passphrase of a given encrypted image.

五个子命令。现在把它和 hdiutil 提供的对比一下,直接摘自它自己的 man 手册:

Common verbs include attach, detach, verify, create, convert, and compact.

The rest of the verbs are currently: help, info, burn, checksum, chpass,
erasekeys, imageinfo, isencrypted, mountvol, unmount, plugins, udifrez,
udifderez, resize, segment, makehybrid, and pmap.

23 个动词对 5 个子命令,这个比例乍看之下很吓人,但也具有误导性,因为逐个动词硬碰硬地对比会得出错误的结论。hdiutil 的好几个动词只是换了个名字被并入了 diskutil image,还有几个早在多年前就已被弃用,另有一个重要的动词则整个搬到了另一个命令下。

厘清哪个对应哪个才是真正的迁移工作,下面我们就来认真过一遍。

这不是凭空出现的

在给出迁移对照表之前,先补充一些背景,让这次弃用看起来不那么突兀。hdiutil 的 man 手册里有一个「兼容性」章节,读起来就像是苹果七年来不断收窄这个工具的记录。这份记录此刻就在你的 Mac 上——运行 man hdiutil,搜索各个版本标题即可看到:

macOS 10.15

  • 在 ULMO 格式中引入 lzma 压缩
  • 弃用 OS 9 风格的双叉(dual-fork)文件支持(hdiutil flatten/unflatten)
  • 移除已弃用的 hdiutil internet-enable 命令和 IDME attach 标志

macOS 11.0

  • 移除对 DiskCopy42、DART 和 NDIF 格式的支持
  • 移除对 AppleSingle 和 MacBinary 编码的支持
  • 移除 OS 9 风格的双叉文件支持
  • 将新映像的默认文件系统改为 APFS

macOS 12.0

  • 弃用 UDBZ 格式(bzip2 压缩)
  • 弃用分段 UDIF 映像(hdiutil segment、-segmentSize)
  • 弃用 hdiutil udifrez/udifderez(嵌入和提取资源)

macOS 13.0

  • 移除 encrypted-encoding-version 选项;所有新的加密映像都使用版本 2

man 手册中还随文标注了:-passphrase 不安全、分段映像已弃用、UDBZ 已弃用。

把这些串起来看,macOS 27 的这次弃用只是一个大约始于 2019 年的进程的最后一步,而不是今年夏天临时做出的决定。这一点对做规划很重要:苹果对这个工具的移除向来是缓慢的,而且总是先在 man 手册中预告。macOS 27 中的 hdiutil 是被弃用,不是被移除,也没有公布任何移除日期。

迁移对照表

这是完整的对照地图。以下每一项我都在 macOS 26.5.2 上测试过。

你想做什么hdiutildiskutil image
挂载映像hdiutil attach x.dmgdiskutil image attach x.dmg
卸载映像hdiutil detach /dev/diskNdiskutil image 中没有 —— 改用 diskutil eject /dev/diskN
创建空白映像hdiutil create -size 1g -fs APFS x.dmgdiskutil image create blank --size 1g x.dmg
从文件夹创建映像hdiutil create -srcfolder ./dir x.dmgdiskutil image create from ./dir x.dmg
转换格式hdiutil convert in.dmg -format UDZO -o out.dmgdiskutil image create from in.dmg out.dmg --format UDZO
检查映像hdiutil imageinfo x.dmgdiskutil image info x.dmg
检查是否加密hdiutil isencrypted x.dmgdiskutil image info → Is Encrypted:
调整大小hdiutil resize -size 2g x.dmgdiskutil image resize
修改密码hdiutil chpass x.dmgdiskutil image chpass x.dmg
校验校验和hdiutil verify x.dmg无对应功能
压缩稀疏映像hdiutil compact x.sparsebundle无对应功能
制作混合/ISO 映像hdiutil makehybrid无对应功能
嵌入许可协议hdiutil udifrez无对应功能(已在 macOS 12 中弃用)
刻录到光盘介质hdiutil burn无对应功能

convert 的意外之处

早期评论中最常见的一个误解是「没有 convert 了」。其实是有的——只是换了个名字。

OVERVIEW: Create a disk image from an existing source (disk, disk image or
folder).

Source and destination disk image can be the same, which will perform the
conversion in place.

diskutil image create from 可以把磁盘映像作为源,所以它其实就是换了个名字的 hdiutil convert,而且还额外支持原地转换,这是 hdiutil convert 从来做不到的。如果你只是数动词数量而不去读帮助文本,就会误以为某个能力被砍掉了,而实际上它是被扩展了。

detach 的缺失是真的

这一个不是改名,diskutil image 里彻底没有 detach:

$ diskutil image detach /dev/disk12
Error: 2 unexpected arguments: 'detach', '/dev/disk12'
Usage: diskutil image [--verbose] [--stdinpassphrase] [--plist] <subcommand>

替代方案是顶层的 diskutil 命令:

$ diskutil eject /dev/disk12
Disk /dev/disk12 ejected

这样用没问题——但要注意它对脚本意味着什么。原本 hdiutil attach / hdiutil detach 那种干净的对称结构,变成了 diskutil image attach / diskutil eject,是同一个二进制文件下两个不同层级的子命令。任何把 attach 和 detach 配对使用的封装函数,都需要重新设计结构,而不是简单地查找替换。

迁移磁盘映像脚本

diskutil image 做得更好的地方

把这次变化说成纯粹的损失并不公平,有三件事是实实在在的改进。

ASIF:hdiutil 完全做不出来的格式

diskutil image 支持 Apple Sparse Image Format(ASIF)。hdiutil 不支持。如果你需要 ASIF——对于 APFS 上的虚拟机磁盘,这正是苹果一直在引导大家使用的格式——diskutil image 是唯一能生成它的工具。

值得了解一下这些格式列表:

create blank --format : RAW, ASIF, UDSB          (default RAW)
create from  --format : ASIF, RAW, UDRO, UDSB,
                        UDZO, ULFO, ULMO         (default ULFO)

它能通过 HTTP 挂载,还能直接制作 RAM 磁盘

来自 attach 的帮助文本:

Supports 'ram://<size>', file paths, http[s].

在 macOS 上制作 RAM 磁盘,传统上是件麻烦的两步操作:先 hdiutil attach -nomount ram://<sectors>,再执行 newfs_hfs 或 diskutil eraseVolume。而现在,这只是一个有文档说明的标志参数而已。

速度明显更快

Lapcat Software 的 Jeff Johnson 在 2026 年 8 月初调查这次弃用时对两者做了基准测试,测得 diskutil image 完成一次创建操作只需 40 到 45 秒,而 hdiutil 需要 110 到 115 秒,而且生成的映像更小。这不是四舍五入级别的差异。对于每次提交都要构建磁盘映像的 CI 任务来说,这个差异是有实际意义的。

你的脚本真正会被破坏的地方

弃用警告不会破坏构建,但下面这些会。

1. -puppetstrings 没有替代方案

hdiutil 的 -puppetstrings 标志会输出可供机器解析的进度信息,这正是构建系统需要的东西。Johnson 指出它的缺失是一个值得注意的空白。diskutil image 有 --plist 用于输出结构化的结果,但它打印的进度是人类可读的,形如:

[5% completed] [79% completed] [98% completed] [100% completed]
test.dmg created

如果你有工具专门解析 hdiutil 输出的 PERCENT: 行,那这个解析器现在无从下手。

2. 好几个 create 选项直接消失了

Johnson 在文章中列出了 -[no]crossdev、-[no]scrub、-[no]anyowners、-skipunreadable、-[no]atomic 和 -copyuid,这些都没有对应项。如果你是以精细可控的方式从文件夹构建映像——比如安装程序、取证快照,或者任何需要精确控制文件所有权或包含哪些文件的场景——请仔细看这份清单。尤其是 -skipunreadable 和 -copyuid,对某些打包脚本来说是关键依赖。

3. 清理(scrubbing)行为发生了静默变化

Johnson 报告说,diskutil image 会自动排除临时文件(比如回收站文件夹),表现得就像 -scrub 始终处于开启状态。而 hdiutil 只有在被要求时才会清理。如果你期望映像内容与源目录逐字节一致,这个行为会在你毫不知情的情况下生成一个不同的映像。

4. 权限处理会静默失败

这是我会第一个测试的问题。Johnson 发现,当遇到 root 拥有的文件时,hdiutil 会触发身份验证提示,而 diskutil image 不会提示,只是直接失败。原本会暂停等待凭据输入的脚本,现在会生成一个不完整的映像,而且取决于你的错误处理方式,它甚至可能报告成功。

如果你构建映像的目录中包含不属于你的文件,请务必校验输出结果,而不要只相信退出码。

5. 日志信息更少

diskutil image 的详细输出(verbose output)不如 hdiutil 详尽。等到凌晨三点构建失败时,你才会体会到这一点。

如何在不破坏 macOS 26 支持的前提下完成迁移

我们大多数人都得在一段时间内同时支持两者。好消息是——也是这整篇文章最实用的一点——你不需要按系统版本分支判断,因为 diskutil image 在 macOS 26 上也存在。

检测能力,而不是检测版本:

#!/bin/bash
# Prefer diskutil image; fall back to hdiutil where unavailable.

if diskutil image --help >/dev/null 2>&1; then
  USE_DISKUTIL=1
else
  USE_DISKUTIL=0
fi

make_image_from_folder() {
  local src="$1" dst="$2"
  if [ "$USE_DISKUTIL" -eq 1 ]; then
    diskutil image create from "$src" "$dst" --format UDZO
  else
    hdiutil create -srcfolder "$src" -format UDZO "$dst"
  fi
}

attach_image() {
  local img="$1"
  if [ "$USE_DISKUTIL" -eq 1 ]; then
    diskutil image attach "$img" --nobrowse
  else
    hdiutil attach "$img" -nobrowse
  fi
}

detach_device() {
  # Note the asymmetry: detach is NOT under `diskutil image`.
  local dev="$1"
  if [ "$USE_DISKUTIL" -eq 1 ]; then
    diskutil eject "$dev"
  else
    hdiutil detach "$dev"
  fi
}

然后校验输出结果,因为静默差异都藏在这里:

# Compare what actually landed in the image against the source.
diskutil image attach build.dmg --nobrowse --mountPoint /tmp/verify_mnt
diff -rq ./src /tmp/verify_mnt/src
diskutil eject /tmp/verify_mnt

这一步 diff -rq 我不会跳过。考虑到始终开启的清理行为和静默的权限失败,「成功构建出的映像」和「内容符合你预期的映像」并不是一回事。

如果你正在从零搭建 Mac 开发环境,我们的 Apple 芯片开发环境搭建指南 涵盖了周边工具链,终端精通指南 则涵盖了这些脚本所依赖的 Shell 基础知识。

校验磁盘映像内容

一个完整的实操示例

下面是在 macOS 26.5.2 上完整跑一遍的实际过程,你看到的是真实输出,而不是事后重构的内容。

从文件夹创建映像:

$ mkdir -p src && echo "hello" > src/file.txt
$ diskutil image create from src --format UDZO test.dmg
[5% completed] [79% completed] [98% completed] [99% completed] [100% completed]
test.dmg created

检查它:

$ diskutil image info test.dmg
Image Format: UDZO
Format Description: UDIF read-only compressed image (zlib)

	Identity Info:
		UUID: 061189CB-7502-4EA6-BFE3-424442C16D10

	Size Info:
		Empty Bytes: 3437056
		Total Bytes: 4233216

	Compression Info:
		Compressed Bytes: 4124
		Compression Type: zlib

	Encryption Info:
		Is Encrypted: 0

	Master Checksum Info:
		Checksum Type: crc32
		Checksum Value: c4 e3 90 4b

注意 info 把原来由 hdiutil imageinfo、isencrypted 以及部分 checksum 分别提供的信息合并到了一起。它报告的是存储的校验和值——并不会去验证它。这正是 hdiutil verify 缺失所留下的空白。

挂载它:

$ diskutil image attach test.dmg
/dev/disk12  	GUID_partition_scheme
/dev/disk13s1	Apple_APFS_Volume    	/Volumes/src

卸载它——用另一个命令:

$ diskutil eject /dev/disk12
Disk /dev/disk12 ejected

加密映像

如果你把磁盘映像当作加密容器使用,操作机制很直接,但可用选项变少了。

# Create an encrypted blank image
diskutil image create blank --encrypt --size 10g --volumeName Vault vault.dmg

# Provide the passphrase on stdin rather than interactively
printf '%s' "$PASSPHRASE" | diskutil image create blank --encrypt --stdinpassphrase \
  --size 10g --volumeName Vault vault.dmg

# Change the passphrase later
diskutil image chpass vault.dmg

文档中说明 --encrypt 使用 AES-256,且没有算法可选——这是一种简化,而不是损失,因为苹果早在 macOS 13 中就已经移除了旧版的加密编码版本。

在任何脚本里都应该使用 --stdinpassphrase 标志。hdiutil 自己的 man 手册就警告过 -passphrase 不安全,原因很简单:命令行里的密码在进程表中对机器上的所有用户都是可见的。

如果你依赖磁盘映像是为了隐私而不仅仅是方便,值得读一读我们的 Mac 安全与隐私指南,了解加密映像相对于 FileVault 处于什么位置——它们解决的是不同的问题,而且加密的 .dmg 在挂载状态下不提供任何保护。

磁盘映像现在还有什么用

值得问一句这一切为什么重要,因为「磁盘映像」听起来像是个过时的老古董,但围绕它的工具链却在好几个地方悄悄承担着关键作用。

应用分发。 .dmg 仍然是在 App Store 之外分发 Mac 应用的标准方式。一个压缩的只读映像,里面装着应用包和一个指向 /Applications 的符号链接,就是用户熟悉的「拖拽安装」惯例。每一个这样的映像,都是由某个脚本调用磁盘映像工具构建出来的。

加密容器。 加密的 .dmg 是一个便携的、自包含的保险库,挂载后就是一个卷,在任何 Mac 上都能直接用,不需要额外软件。和保护整块静态磁盘的 FileVault 不同,加密映像保护的是一组特定的文件,你可以把它带着到处走——拷到 U 盘上、存进云盘、发给同事。

虚拟机磁盘。 这正是 ASIF 派上用场、也是苹果方向意图变得明显的地方。

用于网络备份的 sparsebundle。 时间机器(Time Machine)备份到网络目标时,会把备份存放在一个 sparsebundle 里——一种被拆分成许多小「band」文件的磁盘映像,这样只有发生变化的 band 才需要同步。维护过这类备份的人都运行过 hdiutil compact,用来从已删除的 band 中回收空间。

取证与归档。 带校验和的卷级块镜像,是保存磁盘精确状态的方式。而 hdiutil verify 是日后确认它完好无损的方式。

把这份清单对照迁移表看,就会发现这些空白并不是随机分布的,而是精准对应到特定人群。应用开发者失去了许可协议机制和 -puppetstrings。备份和 sparsebundle 用户失去了 compact。归档和取证用户失去了 verify。而做常规创建-转换-挂载工作的人,一切照常。

ASIF:只有新工具能生成的格式

Apple Sparse Image Format(ASIF)是苹果想让大家离开 hdiutil 的最明确信号,因为 hdiutil 根本无法生成它。

稀疏映像只占用实际写入了数据的块所对应的磁盘空间。一个存放了 10GB 文件的 100GB 稀疏映像,在磁盘上大约只占 10GB,随着数据增加而增长。旧的 UDSP 稀疏映像和 UDSB sparsebundle 格式也是这么做的,但存在众所周知的问题:sparsebundle 会碎裂成成千上万个 band 文件,而且这两种格式历来在回收空间上表现不佳——这正是 hdiutil compact 必须存在的原因。

ASIF 是针对 APFS 设计的,而不是被硬装在它上面的附加层,这样就能让文件系统自身的稀疏文件支持来完成工作,而不必由映像格式去模拟。在实践中,这个收益在虚拟化场景中体现得最明显:一台虚拟机的虚拟磁盘就是一个巨大的、大部分为空且不断变化的文件——这恰恰是最能拖垮旧格式的场景。

你今天就可以创建一个:

# A 100GB ASIF image that occupies only what it uses
diskutil image create blank --format ASIF --size 100g \
  --volumeName VMDisk vmdisk.asif

# Convert an existing image to ASIF
diskutil image create from old.dmg new.asif --format ASIF

注意格式是根据文件扩展名推断的——create blank 默认使用 RAW,「除非映像路径带有 .asif 或 .sparsebundle 扩展名」。把文件命名对就已经足够;同时再传一个 --format 参数,只是双重保险。

代价是可移植性。ASIF 是新格式,ASIF 映像无法在较旧的 macOS 上打开,也无法在非 Mac 的设备上打开。对于虚拟机磁盘或本地工作卷来说,这无关紧要。但对于任何要交给别人的东西,请使用 UDZO,保留兼容性。

这一变化在分发流水线中的位置

如果你在 App Store 之外分发 Mac 应用,磁盘映像这一步位于整条链路的中间环节,值得看看这次变化具体落在哪里。

#!/bin/bash
set -euo pipefail

APP="build/MyApp.app"
DMG="dist/MyApp.dmg"
STAGE="$(mktemp -d)"

# 1. Sign the app bundle (unchanged by any of this)
codesign --force --options runtime --timestamp \
  --sign "Developer ID Application: Example Inc (TEAMID123)" \
  "$APP"

# 2. Stage the contents the user will see
cp -R "$APP" "$STAGE/"
ln -s /Applications "$STAGE/Applications"

# 3. Build the image — the step this article is about
diskutil image create from "$STAGE" "$DMG" --format UDZO

# 4. Sign the image itself
codesign --force --timestamp \
  --sign "Developer ID Application: Example Inc (TEAMID123)" \
  "$DMG"

# 5. Notarize and staple
xcrun notarytool submit "$DMG" --keychain-profile "AC_NOTARY" --wait
xcrun stapler staple "$DMG"

rm -rf "$STAGE"

只有第 3 步发生了变化。签名、公证和装订(stapling)都不受影响——它们作用于最终生成的映像,不关心是哪个工具生成的。

在实际流水线中有两件事要留意。第一,校验暂存内容是否正确落地,因为前面提到的静默清理和权限行为——在 $STAGE 和挂载结果之间做一次 diff -rq,是成本很低的保险措施。第二,如果你现在的脚本用 hdiutil udifrez 嵌入了许可协议,这一步没有替代方案,而且自 macOS 12 起就已被弃用。在它还能用的时候继续用 hdiutil 完成这一步,同时规划一个替代方案。

常见问题排查

提示「diskutil image: command not found」或子命令无法识别

问题:你所在的 macOS 版本低于 26,image 这个动词在该版本上不存在。

解决方案:使用前面展示的能力检测,而不要凭假设判断。在缺少该子命令的系统上,diskutil image --help >/dev/null 2>&1 会返回非零值,这是一个可靠的分支判断依据。不要去检测 sw_vers——你真正关心的是这个子命令是否存在。

映像构建成功,但缺少文件

问题:可能有两个原因。要么是 diskutil image 跳过了以你的用户身份无法读取的文件,且没有弹出身份验证提示;要么是它始终开启的清理行为移除了 hdiutil 原本会保留的内容。

解决方案:挂载生成结果,用 diff -rq 和源目录做对比。如果是因为所有权导致文件缺失,就以必要的权限运行构建,而不是指望会弹出提示。不要只依赖退出码。

CI 中的进度解析失效了

问题:-puppetstrings 在 diskutil image 中没有对应功能,所以原本解析 hdiutil 机器可读进度信息的脚本现在无内容可读。

解决方案:改用 --plist 获取结构化结果,并把进度信息当作不可用来处理。如果你的 CI 确实需要进度信息,那这一步继续用 hdiutil 是完全合理的做法——它只是被弃用,没有被移除,也没有公布移除日期。

无法卸载——「resource busy」

问题:有东西仍然占用着这个卷,这个行为和以前一样。

解决方案:用 lsof +D /Volumes/YourVolume 找出占用者,然后再执行 diskutil eject。Spotlight 索引和杀毒软件扫描是常见的元凶;用 --nobrowse 挂载可以让卷不出现在 Finder 中,从而避免部分这类情况。

带许可协议的 .dmg 无法再构建

问题:许可协议机制依赖 hdiutil udifrez,而苹果早在 macOS 12 中就已弃用这个命令,且 diskutil image 没有对应功能。

解决方案:没有替代路径。在它还存在的时候继续用 hdiutil 完成这一步,同时规划一种不依赖内嵌协议的分发方式。这件事其实已经预告了四年——如果你是现在才第一次发现,值得知道这一点。

常见问题

hdiutil 在 macOS 27 中还能用吗?

能用。它只是被弃用,不是被移除。弃用是苹果在传递意图、开始倒计时,而不是功能上的变化。今天能正常工作的东西,安装 macOS 27 后不会停止工作。

hdiutil 到底什么时候会被真正移除?

苹果没有说明。从 man 手册自己的历史来看,苹果对这个工具的一贯模式是:先在某个版本中弃用某项功能,再过一个或多个大版本之后才移除——internet-enable 和 OS 9 双叉支持各自都用了至少一整个周期。任何给你一个具体移除版本号的人,都是在猜。

我能在 macOS 26 Tahoe 上使用 diskutil image 吗?

可以,而且这是这篇文章里最有用的一个事实。已在 macOS 26.5.2(build 25F84)上验证过。你现在就可以在自己正在使用的系统上迁移并测试脚本,而不必等到 macOS 27。

diskutil image 能完全替代 hdiutil 吗?

目前还不能。verify、compact、makehybrid 和 burn 都没有对应功能,还有几个用来精确控制包含哪些文件的 create 选项也不存在。但对于常规路径——创建、转换、挂载、检查、调整大小、加密——它是完整的。

苹果为什么要这么做?

苹果没有公布具体原因。可以观察到的是,diskutil image 在基准测试中更快、生成的映像更小、支持 hdiutil 无法生成的新版 ASIF 格式,而且命令覆盖面小得多。把磁盘映像处理整合进 diskutil,和其余存储管理功能放在一起,是一个说得通的方向。但这只是基于现有证据的解读,不是苹果官方的说法。

如果我的应用调用 shell 执行 hdiutil,会出问题吗?

在 macOS 27 中不会。但还是应该规划迁移——并且使用能力检测,让同一套代码路径同时覆盖两者,这件事做起来比听上去容易,正因为新命令已经存在于 macOS 26 上。

结语

「一个用了 25 年的终端命令要退休了」——这个标题式的说法是真实的,但在两个方向上都具有误导性。对于构建脚本用到 verify、compact、makehybrid 或那些精细化 create 选项的人来说,它低估了这次变化的影响,因为这些功能今天确实无路可走。而对其他所有人来说,它又高估了影响,因为 hdiutil 在 macOS 27 中依然可用,苹果没有公布任何移除日期,而这次弃用只是一场收窄进程的最后一步——这个过程自 macOS 10.15 起就已被记录在这个工具自己的 man 手册里。

真正有价值的信息是:替代品不在未来,而是此刻就在你的 Mac 上。在 macOS 26 上,diskutil image 已经可用,create、attach、info、resize 和 chpass 都能正常工作。你可以在某个普通的周二下午,在你现在用的系统上完成这次迁移,用 diff -rq 校验一下,然后就不用再操心这件事了。

只是要记住,detach 不在你以为的地方。

相关阅读:macOS 终端精通指南、Apple 芯片开发环境搭建指南,以及 macOS 28 中加密 HFS+ 卷即将被弃用。