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