macOS 的命令行工具 hdiutil 用於操作磁碟映像。在最新的 macOS 27 Golden Gate Beta 版本中,其 man hdiutil 的「WHAT'S NEW」部分有如下說明:

在 man 頁面的頂部還有一則「DEPRECATION NOTICE」,列出了 diskutil 中 hdiutil 子命令的替代方案。

hdiutil 的大部分選項似乎在 diskutil 中被保留了下來,只是名稱不同。然而,一些 hdiutil 選項卻遺失了,例如 -puppetstrings:

此外,一些特定於 hdiutil create -srcfolder 的選項也遺失了:

我嘗試在 Golden Gate 上比較 hdiutil 和 diskutil,方法是備份使用者家目錄,這是我每天在我的 MacBook Pro 上使用 macOS Sequoia 進行的操作。首先:

平均耗時約 110 到 115 秒。

需要注意的是,hdiutil 會觸發認證提示,因為其中一個檔案,令人惱火的是,它屬於 root 使用者。從終端機輸出中可以看到:

磁碟映像的創建會繼續進行,並在輸入管理員憑證後成功完成。

這直接失敗了,並且儘管使用了 verbose 選項,卻沒有告知原因。

幸運的是,我猜到了原因,就是那個 root 擁有的檔案。與 hdiutil 不同,diskutil 不會觸發認證提示。因此,我必須刪除那個 root 擁有的檔案才能讓 diskutil 工作。

同樣,也不是特別 verbose。然而,在磁碟映像創建過程中,進度百分比確實會原地更新,所以它某種程度上替代了 hdiutil -puppetstrings 選項。

好消息是 diskutil 的速度顯著提升,平均耗時約 40 到 45 秒完成,比 hdiutil 快了一分多鐘。此外,diskutil 生成的 dmg 檔案也更小,為 2.8 GB,而 hdiutil 生成的是 2.89 GB。

我掛載了兩個磁碟映像,並使用 FileMerge 應用程式(內嵌在 Xcode 應用程式中)進行比較。除了在兩次命令行調用之間的幾分鐘內自然修改的幾個檔案外,主要區別在於 hdiutil 的磁碟映像包含了 ~/.Trash/ 資料夾,而 diskutil 的磁碟映像則沒有。換句話說,diskutil 的行為就像啟用了 hdiutil 的 -scrub 選項一樣。

所以看來 Golden Gate 中的 diskutil 還需要一些工作:

總之,我不明白為什麼 hdiutil 需要被棄用,而相同的功能將在 diskutil 中繼續存在。出於某種原因,Apple 似乎決心破壞長久以來的工作流程和腳本。多年前我實際上開發過一個名為 Knox 的應用程式,它直接調用 hdiutil。如果 hdiutil 從 macOS 中移除,那將會完全破壞這樣的應用程式。

順帶一提,Golden Gate 上的 hdiutil 和 diskutil 仍然存在我去年部落格文章中提到的那個錯誤:macOS Sequoia 上無法存取的 .bnnsir 檔案。幾天前,我收到了關於我提交給 Apple 的錯誤報告「hdiutil create 處理 Siri CoreSpeech .bnnsir 檔案時發生複製錯誤」(FB17162985) 的一個荒謬更新。儘管我提供了 Apple 100% 可靠的重現步驟,他們卻問我這個問題是否還發生在最新的 Beta 版本中,如果發生了,我就應該提交一個 iOS sysdiagnose。是的,Apple 要求為一個 macOS 錯誤提交 iOS sysdiagnose。毫無疑問,最新的 Golden Gate Beta 版本並沒有神奇地修復這個錯誤。