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