diskutil eject: как извлекать диски из Терминала на Mac

Извлеките любой диск на Mac из Терминала с помощью diskutil — включая принудительное размонтирование тома, который не извлекается, и поиск того, что его удерживает, через lsof.

(Updated )

Finder сообщает, что диск используется. Но он не говорит, что именно его использует и что с этим делать. Терминал делает и то, и другое.

Короткий ответ: выполните diskutil eject /Volumes/YourDriveName, чтобы извлечь диск из Терминала. Если не получилось, используйте sudo lsof /Volumes/YourDriveName, чтобы увидеть, что блокирует извлечение, kill <PID>, чтобы остановить мешающий процесс, и затем извлеките диск снова. В крайнем случае diskutil unmountDisk force /dev/diskN принудительно отключит диск, но делайте это только тогда, когда ничего активно не записывается.

Если вы уверенно чувствуете себя в командной строке, Терминал — самый мощный способ справляться с упрямыми извлечениями дисков в macOS. А если пока не очень уверенно, эти команды — хорошая отправная точка.

Базовое извлечение через diskutil eject

Самый прямой способ извлечь внешний диск из Терминала на Mac:

diskutil eject /Volumes/YourDriveName

Замените YourDriveName на реальное имя вашего диска — точно так, как оно отображается в Finder. Если в имени есть пробелы, заключите его в кавычки:

diskutil eject "/Volumes/My Drive"

Это делает то же самое, что и нажатие кнопки извлечения в Finder. Если всё прошло успешно, диск размонтируется чисто, и на этом всё. Если же произошёл сбой, вы получите гораздо более информативное сообщение об ошибке, чем когда-либо даёт Finder.

Можно также размонтировать без извлечения (диск останется видимым в Дисковой утилите, но не будет смонтирован):

diskutil unmount /Volumes/YourDriveName

Разница важна для дисков с несколькими разделами. unmount убирает один том. eject убирает физическое устройство и все его тома сразу.

Поиск идентификатора диска через diskutil list

Прежде чем использовать более продвинутые команды, вам нужен идентификатор диска. Выведите список всех подключённых дисков:

diskutil list

В выводе показан каждый диск и его разделы. Ваш внешний диск будет чем-то вроде disk4 или disk5. Внутренние диски обычно disk0 и disk1.

Чтобы получить более удобный обзор только внешних дисков:

diskutil list external

Узнав идентификатор диска, вы также можете извлечь его, используя путь /dev/ вместо имени тома:

diskutil eject /dev/disk4

Это удобно, когда в имени тома есть необычные символы или когда том не смонтирован, но диск всё ещё подключён.

Как извлечь все внешние диски сразу

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

Использование diskutil для поиска и извлечения всех внешних дисков:

diskutil list external | grep -o 'disk[0-9]*$' | while read disk; do diskutil eject "/dev/$disk"; done

Или с помощью AppleScript из Терминала, что повторяет то, что делает Finder:

osascript -e 'tell application "Finder" to eject (every disk whose ejectable is true)'

Подход с AppleScript извлекает только те диски, которые Finder считает извлекаемыми — он пропускает загрузочный диск и сетевые тома, что обычно как раз то, что нужно.

Принудительное размонтирование, когда diskutil eject не срабатывает

Если обычное извлечение завершается ошибкой вроде «couldn’t unmount disk», выполните его принудительно:

diskutil unmount force /Volumes/YourDriveName

Или размонтируйте все тома на конкретном диске сразу:

diskutil unmountDisk force /dev/disk4

Принудительное размонтирование указывает macOS освободить том независимо от того, что его использует. Это более контролируемо, чем физическое отключение диска — система всё ещё сбрасывает кэши и уведомляет процессы — но она не ждёт, пока процессы корректно закроют файлы.

Используйте принудительное размонтирование, когда вы знаете, что ничего важного не записывается. Это эквивалент в командной строке принудительного извлечения из Дисковой утилиты. Прочитайте наше руководство о том, когда принудительное извлечение безопасно, а когда рискованно, прежде чем применять это к диску, который активно использовался.

Поиск того, что блокирует извлечение, с помощью lsof

Это команда, которая делает Терминал незаменимым при проблемах с извлечением:

lsof /Volumes/YourDriveName

lsof расшифровывается как «list open files» (список открытых файлов). Она показывает каждый процесс, у которого открыт файл на этом томе — имя процесса, идентификатор процесса (PID), пользователя, который его запустил, и какой файл открыт. (За подробным разбором флагов и приёмов lsof обратитесь к нашему руководству по команде lsof для пользователей Mac.)

Для полных результатов (включая системные процессы) запустите её с sudo:

sudo lsof /Volumes/YourDriveName

Без sudo вы видите только процессы, принадлежащие вашей учётной записи. Системные процессы вроде mds от Spotlight или backupd от Time Machine не появятся. С sudo вы видите всё, что действительно удерживает диск открытым.

Чтение вывода lsof

Вывод выглядит примерно так:

COMMAND   PID   USER   FD   TYPE   DEVICE   SIZE/OFF   NODE   NAME
mds       123   root   12r  REG    1,8      4096       789    /Volumes/MyDrive/.Spotlight-V100/...
Finder    456   aaron  15r  DIR    1,8      1024       2      /Volumes/MyDrive
Dropbox   789   aaron  8u   REG    1,8      8192       345    /Volumes/MyDrive/Projects/.dropbox

Столбцы, которые важнее всего:

  • COMMAND: имя процесса — это говорит вам, что блокирует извлечение.
  • PID: идентификатор процесса — вы используете его, чтобы завершить процесс при необходимости.
  • FD: FD описывает режим открытия файла: r для чтения, w для записи, u для обоих. Это не текущая активность и не доказательство отсутствия ожидающих записей на томе.
  • NAME: конкретный файл, к которому идёт обращение — это часто точно раскрывает, почему процесс там.

Частые виновники: mds (индексирование Spotlight), backupd (Time Machine), Dropbox, Google Drive, сам Finder. Смотрите наши подробные разборы про Spotlight, блокирующий извлечение и iCloud/Dropbox, мешающие извлечению, за целенаправленными решениями.

Завершение блокирующих процессов

Завершайте поддерживаемые приложения из строки меню. Системные процессы обрабатываются отдельно и могут требовать ожидания или выключения Mac. Сохраните работу, завершите копирование и резервное копирование и закройте приложения обычным способом перед повторным извлечением. Принудительное завершение или извлечение может привести к потере данных; Ejecta не подтверждает безопасность записи.

kill 789

Это отправляет сигнал корректного завершения. Процесс получает возможность закрыть файлы и навести порядок. Дайте ему несколько секунд на выход, затем попробуйте извлечь диск снова.

Если он не отвечает на корректное завершение:

kill -9 789

Принудительное завершение является крайней мерой. Оно может привести к потере несохранённой работы или прервать запись. Сначала сохраните работу и дождитесь окончания передачи. Имена процессов Spotlight не доказывают доступ только для чтения. Не завершайте mds или mds_stores принудительно ради освобождения диска. Подождите, закройте приложения и повторите обычное извлечение. Ejecta определяет эти процессы, но не предлагает обычное завершение системных процессов. Если диск остаётся заблокированным, сохраните всё и полностью выключите Mac перед отключением диска.

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

Полный порядок устранения неполадок

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

diskutil eject "/Volumes/YourDriveName"
sudo lsof "/Volumes/YourDriveName"

Имена процессов Spotlight не доказывают доступ только для чтения. Не завершайте mds или mds_stores принудительно ради освобождения диска. Подождите, закройте приложения и повторите обычное извлечение. Ejecta определяет эти процессы, но не предлагает обычное завершение системных процессов. Если диск остаётся заблокированным, сохраните всё и полностью выключите Mac перед отключением диска.

Имя процесса или список открытых файлов не доказывает отсутствие записи. Сохраните работу, завершите копирование и резервное копирование и закройте приложения обычным способом перед повторным извлечением. Принудительное завершение или извлечение может привести к потере данных; Ejecta не подтверждает безопасность записи.

Полезные диагностические варианты

Проверьте, удерживает ли ваш диск именно Spotlight:

lsof /Volumes/YourDriveName | grep mds

Выведите только уникальные имена процессов, блокирующих извлечение (без повторяющихся строк):

lsof /Volumes/YourDriveName | awk '{print $1}' | sort -u

Наблюдайте за дисковым вводом-выводом в реальном времени, чтобы понять, идёт ли активная запись:

sudo fs_usage -f diskio | grep YourDriveName

Эта команда работает непрерывно и показывает каждую дисковую операцию по мере её выполнения. Нажмите Control-C, чтобы остановить. Используйте её, когда lsof показывает процесс, но вы не уверены, активно ли он пишет или просто удерживает устаревший дескриптор.

Когда Терминал требует больше усилий, чем оно того стоит

Эти команды мощные, и после нескольких использований они становятся второй натурой. Но есть реальная цена переключения от работы к окну Терминала — запуск диагностических команд, разбор технического вывода, решение, какой PID безопасно завершить.

Ejecta: Ejecta предлагает бесплатную диагностику дисков без ограничения пробного периода. Платная лицензия открывает завершение и извлечение для поддерживаемых приложений, извлечение всех дисков и управление Time Machine. Системные процессы могут требовать ожидания, авторизации или выключения. Сначала сохраните работу и завершите передачу.

Без ограничений на число компьютеров или активаций. Запрос возврата в течение 30 дней.

Ejecta предлагает бесплатную диагностику дисков без ограничения пробного периода. Платная лицензия открывает завершение и извлечение для поддерживаемых приложений, извлечение всех дисков и управление Time Machine. Системные процессы могут требовать ожидания, авторизации или выключения. Сначала сохраните работу и завершите передачу.

Купить - $29 $9.99