diskutil eject: как извлекать диски из Терминала на Mac
Извлеките любой диск на Mac из Терминала с помощью diskutil — включая принудительное размонтирование тома, который не извлекается, и поиск того, что его удерживает, через lsof.
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: дескриптор файла и режим доступа.
rозначает чтение,w— запись,u— чтение/запись. Если вы видитеwилиu, что-то активно записывает на диск, и принудительное извлечение рискованно. - NAME: конкретный файл, к которому идёт обращение — это часто точно раскрывает, почему процесс там.
Частые виновники: mds (индексирование Spotlight), backupd (Time Machine), Dropbox, Google Drive, сам Finder. Смотрите наши подробные разборы про Spotlight, блокирующий извлечение и iCloud/Dropbox, мешающие извлечению, за целенаправленными решениями.
Завершение блокирующих процессов
Узнав PID блокирующего процесса, завершите его корректно:
kill 789
Это отправляет сигнал корректного завершения. Процесс получает возможность закрыть файлы и навести порядок. Дайте ему несколько секунд на выход, затем попробуйте извлечь диск снова.
Если он не отвечает на корректное завершение:
kill -9 789
Это принудительно завершает процесс немедленно. Процесс не успевает навести порядок. Используйте это как крайнюю меру — особенно для системных процессов.
Чтобы завершить все процессы, использующие конкретный том, одной командой:
sudo lsof -t /Volumes/YourDriveName | xargs kill
Флаг -t заставляет lsof выводить только PID, а xargs передаёт их в kill. Будьте осторожны: это завершает каждый процесс, использующий диск, в том числе те, что могут быть посреди важной работы.
Полный порядок устранения неполадок
Вот полная последовательность для диска, который не извлекается:
# Шаг 1: Попробуйте обычное извлечение
diskutil eject /Volumes/YourDriveName
# Шаг 2: Если не вышло, посмотрите, что блокирует
sudo lsof /Volumes/YourDriveName
# Шаг 3: Завершите мешающий процесс (замените PID реальным номером)
kill 12345
# Шаг 4: Попробуйте извлечь снова
diskutil eject /Volumes/YourDriveName
# Шаг 5: Если всё ещё заклинило, размонтируйте принудительно
diskutil unmountDisk force /dev/disk4
Большинство проблем решается на шаге 3. Найдите блокировщик, завершите его, извлеките чисто.
Полезные диагностические варианты
Проверьте, удерживает ли ваш диск именно 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 делает всё описанное выше автоматически. Она следит за вашими дисками, определяет каждый блокирующий процесс и даёт кнопку для завершения каждого из них в один клик. Та же информация, что вы получили бы из sudo lsof, наглядно показана прямо в строке меню — никаких команд для запоминания, никакого вывода для разбора.
За $9,99 вы получаете инструмент, который заменяет весь этот многошаговый процесс в Терминале одним кликом. Если вы сталкиваетесь с этой проблемой чаще раза в месяц, он окупится сэкономленным раздражением уже в первую неделю. Попробуйте Ejecta бесплатно 7 дней — Терминал не нужен.
Если вам не хочется каждый раз обращаться к Терминалу, Ejecta точно покажет, какой процесс блокирует ваш диск, — и позволит завершить его одним кликом прямо из строки меню.
Купить — $9.99