Як не дати iCloud і Dropbox блокувати витягнення диска

Хмарні служби синхронізації сумно відомі тим, що заважають витягувати зовнішні диски на Mac. Ось чому вони тримаються за ваші диски і як це обійти.

Ви закрили всі програми. Ви все зберегли. Ви натискаєте «витягнути», а macOS каже, що диск досі використовується. Ви запускаєте lsof і бачите у виводі bird, cloudd або Dropbox. Хмарна служба синхронізації тримає ваш диск у заручниках.

Це одна з найпоширеніших і найменш зрозумілих причин невдалого витягнення на Mac. Хмарні служби синхронізації постійно працюють у фоні й створені так, щоб стежити за змінами у файлах. Це стеження означає відкриті дескриптори файлів, а відкриті дескриптори файлів означають, що ваш диск не витягнеться.

Чому служби синхронізації блокують витягнення

Хмарні служби синхронізації працюють, спостерігаючи за змінами в папках. Коли файл створюється, змінюється або видаляється, служба виявляє це й синхронізує зміну з хмарою. Щоб виявляти ці зміни, служба підтримує відкриті дескриптори файлів або використовує спостерігачів за подіями файлової системи в каталогах, за якими стежить.

Проблема виникає, коли будь-який зі шляхів, за якими ведеться стеження, розташований на вашому зовнішньому диску. Це може статися кількома способами.

Ви свідомо зберегли синхронізовану папку на диску. Можливо, ви перемістили папку Dropbox на зовнішній диск задля місця, або тримаєте там папку проєкту, спільну через iCloud Drive.

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

Spotlight проіндексував ваш диск, а служба синхронізації підхопила дані індексу. Це непрямий шлях, але він трапляється.

Конкретно про iCloud

Демон синхронізації iCloud у macOS називається bird (так, справді). Ви також побачите cloudd, який обробляє частину операцій синхронізації. Ці процеси працюють як системні служби й перезапускаються автоматично, якщо ви їх завершите.

Якщо bird блокує ваш диск, він стежить за файлом або папкою на цьому томі. Поширені причини:

  • iCloud для робочого столу та документів: якщо ця функція увімкнена, а ваш зовнішній диск відображається як розташування у Finder, iCloud може індексувати пов’язані з ним шляхи.
  • Перегляд і QuickLook: відкриття файлу із зовнішнього диска у програмі «Перегляд» може створити синхронізовані з iCloud посилання на нещодавні файли.
  • Pages, Numbers або Keynote: ці програми за замовчуванням автоматично зберігають дані в iCloud. Якщо ви відкрили документ зі свого зовнішнього диска, програма може підтримувати зв’язок між локальним файлом і посиланням в iCloud.

Щоб перевірити, чи саме iCloud вас блокує:

lsof /Volumes/YourDriveName | grep -i bird
lsof /Volumes/YourDriveName | grep -i cloudd

Конкретно про Dropbox

Dropbox ще агресивніший щодо стеження за файлами. На сучасних версіях macOS клієнт Dropbox використовує фреймворк Apple File Provider (старіший підхід із розширенням ядра було визнано застарілим у macOS 12.3), щоб стежити за операціями файлової системи в реальному часі.

Якщо ваша папка Dropbox або будь-яка синхронізована з Dropbox папка розташована на зовнішньому диску, Dropbox підтримуватиме постійні з’єднання з цим томом. Навіть файли, які давно синхронізувалися, можуть мати дескриптори Dropbox для цілей стеження.

Ви також можете побачити, як процес Apple fileproviderd тримає файли відкритими від імені Dropbox. Це системний демон, який керує всіма розширеннями File Provider, зокрема Dropbox, OneDrive і Google Drive. Він може створювати додаткові дескриптори файлів на томах, за якими стежать ці служби.

Найнадійніший підхід із Dropbox: повністю завершіть програму Dropbox перед витягненням. Натисніть піктограму Dropbox у рядку меню, клацніть своє фото профілю й виберіть «Вийти». Після витягнення диска знову відкрийте Dropbox.

Google Drive і OneDrive

Застосунок Google Drive для комп’ютера (Drive for Desktop) створює віртуальний диск, який може взаємодіяти з вашими зовнішніми дисками через файлові операції. Якщо ви копіювали файли між Google Drive і своїм зовнішнім диском, клієнт Drive може підтримувати посилання.

OneDrive поводиться подібно до Dropbox, із фоновим стеженням за файлами. Загалом він менш агресивно тримає дескриптори файлів, але все одно може блокувати витягнення.

Обидві служби можна призупинити або завершити з їхніх піктограм у рядку меню перед витягненням.

Практичний робочий процес

Якщо ви регулярно працюєте з файлами на зовнішніх дисках і користуєтеся хмарними службами синхронізації, виробіть звичку призупиняти синхронізацію перед витягненням.

Для iCloud немає зручної кнопки паузи, але ви можете тимчасово вимкнути iCloud Drive у Системних налаштуваннях > Apple ID > iCloud > iCloud Drive. Утім, це доволі радикально.

Для Dropbox призупиніть синхронізацію з піктограми в рядку меню. Натисніть піктограму Dropbox, клацніть свій профіль і виберіть «Призупинити синхронізацію».

Для Google Drive натисніть піктограму Drive у рядку меню й виберіть «Призупинити синхронізацію».

Після призупинення зачекайте кілька секунд, доки закриються відкриті дескриптори файлів, а потім витягніть диск.

Як запобігти проблемі

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

Якщо вам конче потрібно тримати синхронізований вміст на зовнішньому диску, чітко його розділіть. Помістіть синхронізовані файли в одну папку, а несинхронізовані — в іншу. Коли треба буде витягнути диск, ви знатимете, яку службу синхронізації призупинити.

Уникайте відкриття файлів зі свого зовнішнього диска програмами, які автоматично зберігають дані в iCloud (Pages, Numbers, Keynote, «Перегляд»). Або принаймні закривайте ці програми й дайте їм мить, щоб вивільнити дескриптори файлів, перед витягненням.

Коли призупинення недостатньо

Іноді ви призупинили синхронізацію, завершили програми, а диск усе одно не витягується. Служба синхронізації залишила застарілий дескриптор файлу, який зберігається навіть після призупинення.

Ви можете примусово вивільнити ці дескриптори, завершивши конкретний процес:

kill $(lsof -t /Volumes/YourDriveName)

Це завершує кожен процес, що використовує диск. Підхід агресивний, але дієвий.

Ejecta робить це точніше. Застосунок визначає, які саме процеси тримають ваш диск, зокрема демони хмарної синхронізації, і дає змогу завершувати їх по одному. Замість того щоб завершувати все, що під’єднане до диска, ви можете націлитися лише на процес bird чи лише на допоміжний процес Dropbox, який спричиняє проблему. Це особливо корисно, коли ви не впевнені, яка саме з кількох служб синхронізації є винуватцем.

Хмарна синхронізація та зовнішні диски не приречені на конфлікт. Вам просто потрібна видимість того, що відбувається за лаштунками.

Якщо ви не хочете щоразу користуватися Терміналом, Ejecta покаже вам, який саме процес блокує ваш диск, — і дасть завершити його одним кліком прямо з рядка меню.

Купити — $9.99