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