Как macOS видит диски: identifiers, контейнеры, тома
Главное, что надо уложить в голове, - в macOS есть три уровня сущностей, и diskutil оперирует всеми. Физический накопитель - это whole disk, например disk0. На нём лежит таблица разделов (обычно GPT), а внутри неё - слайсы: disk0s1, disk0s2 и так далее. А вот дальше начинается специфика APFS: один слайс может быть APFS-контейнером, и внутри этого контейнера живут тома (volumes), которые macOS показывает как отдельные виртуальные диски (synthesized) - disk3s1, disk3s2 и т.д. Тома внутри контейнера делят общее свободное место - это и есть фишка APFS, никаких жёстких границ как в HFS+.
Посмотрим вживую:
Код: Выделить всё
diskutil listКод: Выделить всё
/dev/disk0 (internal, physical):
#: TYPE NAME SIZE IDENTIFIER
0: GUID_partition_scheme *500.3 GB disk0
1: Apple_APFS_ISC Container disk1 524.3 MB disk0s1
2: Apple_APFS Container disk3 494.4 GB disk0s2
3: Apple_APFS_Recovery Container disk2 5.4 GB disk0s3
/dev/disk3 (synthesized):
#: TYPE NAME SIZE IDENTIFIER
0: APFS Container Scheme - +494.4 GB disk3
Physical Store disk0s2
1: APFS Volume Macintosh HD 10.9 GB disk3s1
2: APFS Snapshot com.apple.os.update-... 10.9 GB disk3s1s1
3: APFS Volume Macintosh HD - Data 280.4 GB disk3s5Подробности по конкретной сущности:
Код: Выделить всё
diskutil info disk3s5
Монтирование, форматирование и форматы файловых систем
Смонтировать и размонтировать том вручную:
Код: Выделить всё
diskutil mount disk3s5
diskutil unmount disk3s5
diskutil unmountDisk disk3 # размонтировать ВЕСЬ контейнер целикомТеперь форматирование диска mac. Базовая команда eraseDisk полностью стирает накопитель, ставит новую таблицу разделов и кладёт один пустой том:
Код: Выделить всё
diskutil eraseDisk ФОРМАТ ИМЯ СХЕМА ИДЕНТИФИКАТОРКод: Выделить всё
diskutil eraseDisk ExFAT SHUTTLE GPT disk4Код: Выделить всё
Started erase on disk4
Unmounting disk
Creating the partition map
Waiting for partitions to activate
Formatting disk4s2 as ExFAT (MS-DOS exFAT) with name SHUTTLE
Mounting disk
Finished erase on disk4Шпаргалка по форматам (первый аргумент eraseDisk/eraseVolume):
- APFS - дефолт для внутренних SSD и современных внешних. Снапшоты, клоны, общее место в контейнере.
- APFSX (Case-sensitive) - регистрозависимый вариант. Нужен редко (некоторые dev-окружения), но способен сломать софт, ждущий регистронезависимости.
- JHFS+ - Mac OS Extended (Journaled), он же HFS+. Для старых машин и Time Machine на HDD до недавних версий. На SSD проигрывает APFS.
- ExFAT - обмен с Windows/Linux, большие файлы.
- MS-DOS FAT32 - максимальная совместимость, лимит файла 4 ГБ.
Код: Выделить всё
diskutil eraseVolume ExFAT SCRATCH disk4s2Чтобы разбить диск mac на несколько физических разделов (например, под exFAT-кусок и под отдельную macOS), есть partitionDisk. Синтаксис - пары "формат имя размер", повторяющиеся:
Код: Выделить всё
diskutil partitionDisk disk4 GPT \
APFS "System" 200G \
ExFAT "Share" 100G \
FREE %noformat% RНо в мире APFS чаще тебе НЕ нужны физические разделы. Гораздо гибче добавить том в существующий контейнер - он займёт место динамически, не отрезая жёсткую квоту:
Код: Выделить всё
diskutil apfs addVolume disk3 APFS "Sandbox"Код: Выделить всё
diskutil apfs deleteVolume disk3s7Код: Выделить всё
diskutil apfs listFirst Aid из терминала: verifyVolume и repairVolume
Disk Utility.app -> First Aid под капотом гоняет fsck. Из CLI - то же самое, но скриптуемо и без капризов GUI. Проверка без изменений:
Код: Выделить всё
diskutil verifyVolume disk3s5Код: Выделить всё
diskutil repairVolume disk3s5Код: Выделить всё
Started file system repair on disk3s5 Macintosh HD - Data
Repairing file system
Checking the container superblock
Checking the EABlocks
Checking the snapshots
Verifying allocated space
The volume disk3s5 appears to be OK
File system repair completedОбразы дисков: hdiutil (.dmg и .sparseimage)
Образ диска - это файл, который система монтирует как настоящий том. Базовый инструмент - hdiutil. Терминология: образы attach (подключают) и detach (отключают), в отличие от mount/unmount для обычных томов - запомни эту пару, путаница тут частая.
Создать пустой растущий sparse-образ APFS на 10 ГБ (фактически займёт место только под данные):
Код: Выделить всё
hdiutil create -size 10g -type SPARSE -fs APFS -volname Vault ~/VaultКод: Выделить всё
hdiutil create -size 5g -encryption AES-256 -type SPARSE -fs APFS \
-volname Secrets ~/SecretsКод: Выделить всё
hdiutil attach ~/Vault.sparseimage
hdiutil detach /Volumes/VaultКод: Выделить всё
hdiutil create -srcfolder ~/MyApp -volname "MyApp" -format UDZO ~/MyApp.dmgКод: Выделить всё
hdiutil convert ~/Vault.sparseimage -format UDZO -o ~/Vault-ro.dmgКод: Выделить всё
hdiutil compact ~/Vault.sparseimageRAID и безопасное извлечение
macOS умеет программный AppleRAID через diskutil. Зеркало (RAID 1) из двух дисков:
Код: Выделить всё
diskutil appleRAID create mirror MyMirror JHFS+ disk4 disk5Код: Выделить всё
diskutil appleRAID listИ последнее, обыденное, но важное - безопасное извлечение. Не выдёргивай внешний диск, пока не отмонтировал, иначе словишь повреждение из-за несброшенного кеша записи:
Код: Выделить всё
diskutil eject disk4Типичные грабли
- Путаешь disk0s2 (физический слайс-контейнер) и disk3 (синтезированный контейнер). Команды apfs обычно хотят синтезированный disk3, а не слайс.
- eraseDisk на disk0 (внутреннем) - так стереть загрузочную систему нельзя из работающей macOS, и слава богу. Только Recovery + установщик.
- Имена с пробелами. Без кавычек "My Drive" diskutil поймёт как два аргумента и упадёт.
- Ждёшь, что sparse-образ сам ужмётся после удаления файлов. Нет - руками hdiutil compact.
- Принудительный unmount force на смонтированном для записи томе. Потеря данных. Сначала закрой процессы.
- exFAT для бэкапов и системных задач - не файловая система для прав POSIX и метаданных macOS, она только для голого обмена файлами.
Возьми ненужную флешку (всё на ней умрёт). Найди её идентификатор: diskutil list (ищи external, physical и свой объём - НЕ перепутай с disk0). Отформатируй в exFAT под Windows-обмен: diskutil eraseDisk ExFAT LAB GPT diskN. Посмотри результат: diskutil info diskNs2 - найди Mount Point и File System. Прогони проверку: diskutil verifyVolume diskNs2. Теперь сделай образ: hdiutil create -size 2g -type SPARSE -fs APFS -volname LABIMG ~/lab. Подключи: hdiutil attach ~/lab.sparseimage, скопируй туда файл, посмотри размер ~/lab.sparseimage, удали файл, отключи (hdiutil detach /Volumes/LABIMG) и ужми: hdiutil compact ~/lab.sparseimage - сравни размер до и после. В конце безопасно извлеки флешку: diskutil eject diskN.
Контрольные вопросы
- Чем отличается disk0s2 от disk3 в выводе diskutil list и почему addVolume адресуют контейнеру disk3, а не слайсу?
- Какой формат выберешь для внешнего SSD под обмен с Windows и почему не NTFS и не APFS?
- В чём разница между attach/detach и mount/unmount, и почему sparse-образ нужно compact?
- Почему серьёзный repairVolume системного тома делают из Recovery, а не из работающей macOS?
diskutil - это весь Disk Utility.app в одной командной строке: list и info для разведки, eraseDisk/eraseVolume для форматирования, partitionDisk и apfs addVolume чтобы разбить диск mac жёстко или гибко, verifyVolume/repairVolume вместо First Aid, appleRAID для зеркал и eject для безопасного извлечения. hdiutil закрывает образы: create, attach/detach, convert, compact. Запомни главное - APFS-контейнер с динамическими томами почти всегда лучше физических разделов, а exFAT+GPT - твой выбор для обмена с Windows. Дальше эти кирпичи лягут в скрипты подготовки парка машин.