hdiutil признан устаревшим в macOS 27. Его замена уже здесь

macOSTahoe ·
hdiutil признан устаревшим в macOS 27. Его замена уже здесь

Apple объявила hdiutil устаревшим в macOS 27 в пользу diskutil image. Эта команда уже есть на вашем Mac сегодня — и в ней отсутствуют вещи, которыми вы, вероятно, пользуетесь.

В man-странице macOS 27 Golden Gate появилась строка, которой раньше не было:

In macOS 27.0, hdiutil is deprecated. Use diskutil image instead for all disk image operations.

hdiutil — это способ создавать, монтировать, конвертировать и проверять образы дисков на Mac начиная с Mac OS X 10.0. Если вы когда-либо выпускали .dmg, писали скрипт для установщика, настраивали CI-задачу для сборки Mac-приложения или создавали зашифрованный контейнер, чтобы сохранить что-то в тайне — вы пользовались этой командой, напрямую или через что-то, что вызывало её за вас.

Вот момент, который упустило большинство публикаций на эту тему: замена не «в разработке». Она уже стоит на вашем Mac. Откройте Terminal на macOS 26 Tahoe прямо сейчас и выполните diskutil image. Команда ответит.

Главное

  • diskutil image уже работает на macOS 26. Проверено на macOS 26.5.2 (сборка 25F84). Вы можете мигрировать и тестировать скрипты уже сегодня, до выхода macOS 27.
  • Устаревший не значит удалённый. hdiutil по-прежнему работает в macOS 27. В первый день ничего не сломается. Но Apple подрезает эту утилиту уже семь лет, и man-страница документирует каждый шаг.
  • Набор команд стал значительно меньше. hdiutil предоставляет 23 команды. diskutil image — 5 подкоманд.
  • Нет detach. Смонтировать образ диска через diskutil image можно, а размонтировать — нет: это переехало в 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 под другими именами, несколько уже были признаны устаревшими много лет назад, а одна важная команда переехала в совершенно другой инструмент.

Разобраться, что есть что, — это и есть настоящая миграция, так что сделаем это по порядку.

Это не возникло на пустом месте

Прежде чем перейти к таблице миграции — немного контекста, из-за которого устаревание выглядит не таким внезапным. Man-страница hdiutil содержит раздел совместимости, который читается как семилетняя летопись того, как Apple сужала эту утилиту. Она есть на вашем Mac прямо сейчас — наберите man hdiutil и найдите заголовки версий:

macOS 10.15

  • Введено сжатие lzma в формате ULMO
  • Признана устаревшей поддержка двухвильчатых файлов в стиле OS 9 (hdiutil flatten/unflatten)
  • Удалена устаревшая команда hdiutil internet-enable и флаги подключения IDME

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 году, а не решение, принятое этим летом. Это важно для планирования: Apple убирает вещи из этой утилиты медленно и сначала объявляет о них в man-странице. hdiutil в macOS 27 устарел, но не исчез, и объявленной даты удаления нет.

Таблица миграции

Вот карта соответствий. Я протестировал каждый пункт на macOS 26.5.2.

Что нужно сделатьhdiutildiskutil image
Смонтировать образhdiutil attach x.dmgdiskutil image attach x.dmg
Размонтировать образhdiutil detach /dev/diskNОтсутствует в diskutil 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 реален

А вот это уже не переименование. Detach в diskutil image нет вообще:

$ 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. hdiutil — нет. Если вам нужен ASIF — а для дисков виртуальных машин на APFS это тот формат, к которому Apple последовательно подталкивает — 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].

Создание RAM-диска на macOS традиционно было неуклюжим двухшаговым процессом: hdiutil attach -nomount ram://<sectors>, а затем newfs_hfs или diskutil eraseVolume. Здесь это один аргумент задокументированного флага.

Он заметно быстрее

Джефф Джонсон из Lapcat Software в начале августа 2026 года провёл сравнительный тест обеих утилит, изучая устаревание, и зафиксировал, что diskutil image выполняет операцию create за 40–45 секунд против 110–115 секунд у hdiutil, при этом создавая образ меньшего размера. Это не погрешность округления. Для CI-задачи, собирающей образы диска на каждый коммит, разница ощутима.

Что реально сломается в ваших скриптах

Предупреждения об устаревании не ломают сборки. А вот эти вещи — сломают.

1. У -puppetstrings нет замены

Флаг -puppetstrings в hdiutil выводит машинно-читаемый прогресс — именно то, что нужно системе сборки. Джонсон отмечает его отсутствие как один из заметных пробелов. У diskutil image есть --plist для структурированных результатов, а прогресс он выводит в человекочитаемом виде, вот так:

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

Если у вас есть инструментарий, парсящий строки PERCENT: из вывода hdiutil, этому парсеру больше не за что зацепиться.

2. Несколько опций create просто исчезли

В своём материале Джонсон перечисляет -[no]crossdev, -[no]scrub, -[no]anyowners, -skipunreadable, -[no]atomic и -copyuid как не имеющие аналога. Если вы собираете образы из папок контролируемым образом — установщики, криминалистические копии, всё, где важна точность владельца файлов или их набора — внимательно изучите этот список. -skipunreadable и -copyuid в частности критичны для некоторых сборочных скриптов.

3. Поведение очистки изменилось незаметно

Джонсон сообщает, что diskutil image автоматически исключает временные файлы вроде папок корзины, ведя себя так, будто -scrub всегда включён. hdiutil очищал только по запросу. Если содержимое вашего образа должно быть побайтово идентично исходной директории, это молча даст другой результат.

4. Обработка прав доступа тихо отказывает

Это то, что я бы протестировал первым делом. Джонсон обнаружил, что там, где hdiutil при столкновении с файлами, принадлежащими root, запрашивал аутентификацию, diskutil image не запрашивает ничего и просто завершается с ошибкой. Скрипт, который раньше приостанавливался для ввода учётных данных, теперь создаст неполный образ и, в зависимости от вашей обработки ошибок, может даже отрапортовать об успехе.

Если вы собираете образы из директорий, содержащих файлы, которыми вы не владеете, проверяйте результат, а не доверяйте коду завершения.

5. Логирование стало более скудным

Подробный вывод diskutil image менее детален, чем у 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 Silicon охватывает сопутствующий инструментарий, а руководство по мастерству Terminal — основы командной строки, на которые опираются эти скрипты.

Проверка содержимого образа диска

Разобранный пример от начала до конца

Вот полный цикл, выполненный на 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, и выбора алгоритма нет — это скорее упрощение, чем потеря: старую версию шифрованного кодирования Apple убрала ещё в macOS 13.

Флаг --stdinpassphrase — тот, что стоит использовать в любом скрипте. Собственная man-страница hdiutil предупреждает, что -passphrase небезопасен — по вполне обычной причине: пароль в командной строке виден в таблице процессов любому пользователю этой машины.

Если вы полагаетесь на образы дисков ради приватности, а не только удобства, стоит прочитать наше руководство по безопасности и приватности Mac — там объясняется, чем зашифрованный образ отличается от FileVault: они решают разные задачи, и зашифрованный .dmg ничего не защищает, пока он смонтирован.

Для чего образы дисков всё ещё нужны

Стоит задаться вопросом, почему всё это вообще важно — ведь «образ диска» звучит как пережиток прошлого, а инструментарий вокруг него незаметно оказывается критичным сразу в нескольких местах.

Распространение приложений. .dmg остаётся стандартным способом распространять Mac-приложение вне App Store. Сжатый образ только для чтения, содержащий бандл приложения и символическую ссылку на /Applications — привычная пользователям схема «перетащи, чтобы установить». Каждый такой образ собирает скрипт, вызывающий инструмент работы с образами дисков.

Зашифрованные контейнеры. Зашифрованный .dmg — это портативное самодостаточное хранилище, которое монтируется как том и работает на любом Mac без специального ПО. В отличие от FileVault, который защищает весь диск в состоянии покоя, зашифрованный образ защищает конкретный набор файлов, который можно перемещать — на USB-флешку, в облачное хранилище, коллеге.

Диски виртуальных машин. Именно здесь важен ASIF, и именно здесь становится очевидным направление, в котором движется Apple.

Sparsebundle для сетевого резервного копирования. Time Machine, выполняя резервное копирование на сетевой ресурс, хранит бэкап внутри sparsebundle — образа диска, разбитого на множество маленьких файлов-«полос», чтобы синхронизировать нужно было только изменившиеся полосы. Любой, кто обслуживал такой бэкап, запускал hdiutil compact, чтобы освободить место от удалённых полос.

Криминалистика и архивирование. Блочный образ тома с контрольной суммой — это способ сохранить точное состояние диска. hdiutil verify — способ впоследствии это подтвердить.

Если сопоставить этот список с таблицей миграции, становится видно, что пробелы совпадают с конкретными сообществами, а не случайны. Разработчики приложений теряют механизм лицензионных соглашений и -puppetstrings. Пользователи резервного копирования и sparsebundle теряют compact. Пользователи архивирования и криминалистики теряют verify. У всех, кто занимается рутинной работой create-convert-attach, всё в порядке.

ASIF: формат, который умеет создавать только новый инструмент

Apple Sparse Image Format — самый явный сигнал того, зачем Apple хочет увести людей от hdiutil, потому что hdiutil в принципе не может его создать.

Разреженный образ занимает место на диске только под те блоки, которые реально содержат данные. 100-гигабайтный разреженный образ, содержащий 10 ГБ файлов, займёт около 10 ГБ на диске и будет расти по мере добавления данных. Старые форматы UDSP (разреженный образ) и UDSB (sparsebundle) делали то же самое, но с известными проблемами: sparsebundle фрагментируется на тысячи файлов-полос, и оба формата исторически плохо возвращали освободившееся место — именно поэтому и существовал 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 новый, и такой образ не откроется на более старой macOS или на чём-либо, что не является Mac. Для диска ВМ или локального рабочего тома это неважно. Для всего, что вы передаёте другому человеку, используйте UDZO и сохраняйте совместимость.

Где это вписывается в конвейер распространения

Если вы распространяете Mac-приложение вне App Store, шаг с образом диска находится в середине цепочки, и стоит увидеть, куда именно ложится изменение.

#!/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. Подпись, нотаризация и степлирование не затронуты — они работают с готовым образом и им всё равно, каким инструментом он был создан.

В реальном конвейере стоит учесть две вещи. Во-первых, проверяйте, что подготовленное содержимое попало в образ корректно — из-за описанных выше молчаливой очистки и поведения с правами доступа diff -rq между $STAGE и смонтированным результатом — дешёвая страховка. Во-вторых, если ваш текущий скрипт встраивает лицензионное соглашение через 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, который Apple признала устаревшим ещё в macOS 12 и у которого нет аналога в diskutil image.

Решение: замены не существует. Продолжайте использовать hdiutil для этого шага, пока он доступен, и планируйте способ распространения, не зависящий от встроенного соглашения. Об этом предупреждали четыре года — стоит иметь в виду, если вы узнаёте об этом только сейчас.

Часто задаваемые вопросы

hdiutil всё ещё работает в macOS 27?

Да. Он устарел, но не удалён. Устаревание — это сигнал Apple о намерении и запуск отсчёта, а не функциональное изменение. Ничто из того, что работает сегодня, не перестанет работать после установки macOS 27.

Когда hdiutil реально удалят?

Apple не сообщала. Судя по истории самой man-страницы, паттерн Apple с этой утилитой таков: признать функцию устаревшей в одном релизе и удалить её на один или несколько мажорных релизов позже — так было и с internet-enable, и с поддержкой двухвильчатых файлов OS 9, на каждую ушёл минимум полный цикл. Любой, кто называет вам конкретную версию удаления, просто гадает.

Можно ли использовать diskutil image на macOS 26 Tahoe?

Да, и это самый полезный факт в этой статье. Проверено на macOS 26.5.2 (сборка 25F84). Вы можете мигрировать скрипты и тестировать их прямо сейчас, на той ОС, которой уже пользуетесь, не дожидаясь macOS 27.

Является ли diskutil image полноценной заменой hdiutil?

Нет, пока не является. У verify, compact, makehybrid и burn нет аналога, и несколько опций create, отвечающих за точный контроль включаемых файлов, отсутствуют. Для стандартного сценария — создание, конвертация, монтирование, проверка, изменение размера, шифрование — она полноценна.

Зачем Apple это сделала?

Apple не публиковала обоснования. Наблюдаемые факты таковы: diskutil image быстрее по бенчмаркам, создаёт образы меньшего размера, поддерживает более новый формат ASIF, который hdiutil создавать не умеет, и предоставляет значительно меньший набор команд. Объединение работы с образами дисков внутри diskutil вместе с остальным управлением хранилищем — логичное направление. Это трактовка имеющихся фактов, а не заявление Apple.

Сломается ли моё приложение, если оно вызывает hdiutil через shell?

Не в macOS 27. Но планировать переход стоит уже сейчас — и использовать проверку возможностей, чтобы один и тот же код работал в обоих случаях, что проще, чем кажется, именно потому что новая команда уже есть на macOS 26.

Заключение

Заголовок — «25-летнюю команду Terminal отправляют на покой» — правдив, но вводит в заблуждение сразу в обе стороны. Он преуменьшает изменение для всех, чьи сборочные скрипты используют verify, compact, makehybrid или тонко настраиваемые опции create, потому что для них сегодня пути вперёд нет. И он же преувеличивает изменение для всех остальных, потому что hdiutil по-прежнему работает в macOS 27, Apple не объявила даты удаления, а устаревание — это последний шаг сужения, которое документировалось в собственной man-странице утилиты начиная с macOS 10.15.

По-настоящему полезно знать вот что: замена — не дело будущего. diskutil image уже стоит на вашем Mac прямо сейчас, на macOS 26, и create, attach, info, resize и chpass в ней работают. Эту миграцию можно сделать во вторник после обеда, на той ОС, что у вас уже есть, проверить её через diff -rq — и больше об этом не думать.

Просто помните, что detach находится не там, где вы ожидаете.

Похожие материалы: Мастерство Terminal на macOS, настройка среды разработки на Apple Silicon и шифрованные тома HFS+ убирают из macOS 28.