Утилита командной строки hdiutil в macOS используется для работы с образами дисков. В разделе WHAT'S NEW страницы man hdiutil последней бета-версии macOS 27 Golden Gate появилась запись:

In macOS 27.0, hdiutil is deprecated. Use diskutil image instead for all disk image operations. diskutil image provides subcommands for attach, create, resize, info, and chpass. ASIF (Apple Sparse Image Format) images are only supported by diskutil image and are not supported by hdiutil.

В начале man-страницы также появилось уведомление об устаревании (DEPRECATION NOTICE), в котором перечислены соответствующие замены подкоманд hdiutil на diskutil.

Большинство опций hdiutil, судя по всему, сохранились в diskutil, хотя и под другими именами. Однако некоторые опции отсутствуют, например -puppetstrings:

provide progress output that is easy for another program to parse. PERCENTAGE outputs can include the value -1 which means hdiutil is performing an operation that will take an indeterminate amount of time to complete. Any program trying to interpret hdiutil's progress should use -puppetstrings.

Также отсутствуют некоторые опции, специфичные для hdiutil create -srcfolder:

-[no]crossdev
-[no]scrub
-[no]anyowners
-skipunreadable
-[no]atomic
-copyuid

Было проведено сравнение hdiutil и diskutil на Golden Gate путём создания резервной копии домашней папки пользователя — операции, которая ежедневно выполняется на MacBook Pro с macOS Sequoia. Сначала команда для старой утилиты:

time hdiutil create -encryption -format UDZO -noatomic -noscrub -srcfolder /Users/stupiduser -stdinpass -verbose /Users/Shared/hdiutil.dmg

Выполнение заняло в среднем от 110 до 115 секунд.

Важный момент: hdiutil вызывает запрос аутентификации, потому что один из файлов, как назло, принадлежит пользователю root. Из вывода терминала:

copy-helper[2598:97396] uid 501 does not have ownership of /Users/stupiduser/Library/Group Containers/group.com.apple.secure-control-center-preferences/Library/Preferences/group.com.apple.secure-control-center-preferences.av.plist - setting needAuth to YES
Scanning…
Error 80 (Authentication error).
/Users/stupiduser/Library/Group Containers/group.com.apple.secure-control-center-preferences/Library/Preferences/group.com.apple.secure-control-center-preferences.av.plist: Authentication error

Создание образа диска продолжается и успешно завершается после ввода учётных данных администратора.

Теперь новый способ:

time diskutil image --stdinpassphrase --verbose create --encrypt from --format UDZO /Users/stupiduser /Users/Shared/diskutil.dmg

Команда просто завершается с ошибкой и, несмотря на флаг подробного вывода, не объясняет причину.

[100% completed]
Error: Failed to create disk image: The operation couldn't be completed. Operation not permitted

К счастью, причину удалось угадать — тот самый файл, принадлежащий root. В отличие от hdiutil, diskutil не запрашивает аутентификацию. Пришлось удалить файл, принадлежащий root, чтобы diskutil заработал.

[100% completed]
/Users/Shared/diskutil.dmg created

Опять же, вывод не особо подробный. Однако процент выполнения обновляется прямо на месте во время создания образа, так что некое подобие замены опции -puppetstrings из hdiutil всё же присутствует.

Хорошая новость в том, что diskutil оказался значительно быстрее — в среднем от 40 до 45 секунд, более чем на минуту быстрее hdiutil. Кроме того, итоговый файл dmg от diskutil получился меньше — 2,8 ГБ против 2,89 ГБ у hdiutil.

Оба образа диска были смонтированы и сравнены с помощью приложения FileMerge (встроенного в Xcode). Помимо нескольких файлов, естественным образом изменившихся за несколько минут между запусками команд, главное отличие заключалось в том, что образ от hdiutil включал папку ~/.Trash/, а образ от diskutil — нет. Иными словами, diskutil вёл себя так, будто у hdiutil была включена опция -scrub.

-[no]scrub do [not] skip temporary files when imaging a volume. Scrubbing is the default when the source is the root of a mounted volume. Scrubbed items include trashes, temporary directories, swap files, etc.

Похоже, что diskutil в Golden Gate ещё нуждается в доработке:

  1. Улучшить подробное логирование
  2. Обрабатывать проблемы с правами доступа к файлам
  3. Добавить опцию -[no]scrub

В заключение остаётся непонятным, зачем понадобилось объявлять hdiutil устаревшим, если та же функциональность продолжит жить в diskutil. Похоже, Apple намеренно ломает многолетние рабочие процессы и скрипты. Много лет назад пришлось работать над приложением Knox, которое напрямую обращается к hdiutil. Если бы hdiutil удалили из macOS, это полностью сломало бы подобное приложение.

Кстати, и hdiutil, и diskutil в Golden Gate по-прежнему страдают от бага, о котором писали ранее — о недоступности файлов .bnnsir в macOS Sequoia. Пару дней назад пришло абсурдное обновление по багрепорту, поданному в Apple, — «hdiutil create copy error with Siri CoreSpeech .bnnsir files» (FB17162985). Несмотря на предоставленные Apple 100% воспроизводимые шаги, там спросили, актуальна ли проблема в последней бета-версии, и если да — предложили отправить iOS sysdiagnose. Да, Apple запросила iOS sysdiagnose для бага в macOS. И, конечно же, последняя бета Golden Gate баг магическим образом не исправила.