iCloudやDropboxがドライブの取り出しを妨げるのを止める方法

クラウド同期サービスは、Macで外付けドライブの取り出しを妨げることで知られています。なぜドライブをつかんで離さないのか、そしてその回避方法を紹介します。

すべてのアプリを閉じました。すべて保存しました。取り出しをクリックすると、macOSはドライブがまだ使用中だと言います。lsof を実行すると、出力に birdcloudd、または Dropbox が見えます。クラウド同期サービスが、ドライブを人質に取っているのです。

これは、Macで取り出しに失敗する原因の中でも、最もよくあり、かつ最も理解されていないものの1つです。クラウド同期サービスはバックグラウンドで絶えず動いており、ファイルの変更を監視するように作られています。その監視のためにファイルハンドルが開かれ、ファイルハンドルが開いているとドライブは取り出せません。

同期サービスが取り出しを妨げる理由

クラウド同期サービスは、フォルダを監視して変更を見張ることで動作します。ファイルが作成、変更、削除されると、サービスはそれを検知してクラウドに同期します。こうした変更を検知するために、サービスは監視対象のディレクトリに対してファイルハンドルを開いたままにしたり、ファイルシステムのイベント監視を使ったりします。

問題は、監視対象のパスのいずれかが外付けドライブ上に存在するときに起こります。これは、いくつかの形で発生します。

意図的に同期フォルダをドライブに置いた場合。容量の都合でDropboxフォルダを外付けドライブに移したり、iCloud Driveで共有しているプロジェクトフォルダをそこに置いていたりするかもしれません。

アプリケーションがドライブ上にファイルを作成し、それを同期サービスが拾った場合。一部のアプリは、作業しているボリュームに、一時ファイルやキャッシュ、プロジェクトのメタデータを保存します。

Spotlightがドライブをインデックスし、そのインデックスデータを同期サービスが拾った場合。これは間接的ですが、実際に起こります。

iCloudの場合

macOSにおけるiCloudの同期デーモンは bird と呼ばれます(本当です)。同期処理の一部を担う cloudd も見かけるでしょう。これらのプロセスはシステムサービスとして動作し、終了させても自動的に再起動します。

bird がドライブを妨げている場合、それはそのボリューム上のファイルかフォルダを監視しています。よくあるきっかけは次のとおりです。

  • iCloudのデスクトップと書類フォルダ: この機能が有効で、外付けドライブがFinderの場所として表示されている場合、iCloudがそれに関連するパスをインデックスすることがあります。
  • プレビューとクイックルック: 外付けドライブのファイルをプレビューで開くと、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のファイルハンドルが残っていることがあります。

Dropboxの代わりにファイルを開いたままにするAppleの fileproviderd プロセスが見えることもあります。これは、Dropbox、OneDrive、Google Driveを含むすべてのFile Provider拡張を管理するシステムデーモンです。これらのサービスが監視しているボリュームに、追加のファイルハンドルを作ることがあります。

Dropboxで最も確実な方法は、取り出す前にDropboxアプリケーションを完全に終了することです。メニューバーのDropboxアイコンをクリックし、プロフィール画像をクリックして「終了」を選びます。ドライブを取り出したあとで、Dropboxを再び開きます。

Google DriveとOneDrive

Google Driveのデスクトップアプリ(Drive for Desktop)は、ファイル操作を通じて外付けドライブとやり取りできる仮想ドライブを作ります。Google Driveと外付けドライブの間でファイルをコピーした場合、Driveクライアントが参照を維持することがあります。

OneDriveはDropboxと似た挙動で、バックグラウンドでファイルを監視します。ファイルハンドルを保持することについては概しておとなしめですが、それでも取り出しを妨げることがあります。

どちらのサービスも、取り出す前にメニューバーのアイコンから一時停止または終了できます。

実践的なワークフロー

外付けドライブ上のファイルで日常的に作業し、クラウド同期サービスを使っているなら、取り出す前に同期を一時停止する習慣をつけましょう。

iCloudには手軽な一時停止ボタンはありませんが、システム設定 >「Apple ID」>「iCloud」>「iCloud Drive」で一時的にiCloud Driveを無効にできます。ただし、これはかなり手間のかかる方法です。

Dropboxでは、メニューバーのアイコンから同期を一時停止します。Dropboxアイコンをクリックし、プロフィールをクリックして「同期を一時停止」を選びます。

Google Driveでは、メニューバーのDriveアイコンをクリックして「同期を一時停止」を選びます。

一時停止したら、開いているファイルハンドルが閉じるまで数秒待ってから、ドライブを取り出します。

問題を未然に防ぐ

最もきれいな方法は、クラウドで同期するフォルダを外付けドライブに置かないことです。同期フォルダはMacの内蔵ストレージに置き、外付けドライブは同期の必要がないデータに使いましょう。

どうしても同期対象のコンテンツを外付けドライブに置く必要がある場合は、はっきりと分けてください。同期するファイルを1つのフォルダに、同期しないファイルを別のフォルダに置きます。取り出すときに、どの同期サービスを一時停止すればよいかがわかります。

iCloudに自動保存するアプリ(Pages、Numbers、Keynote、プレビュー)で外付けドライブのファイルを開くのは避けてください。少なくとも、取り出す前にそれらのアプリを閉じ、ファイルハンドルを解放する時間を少し与えましょう。

一時停止だけでは足りないとき

同期を一時停止し、アプリを終了したのに、それでもドライブが取り出せないことがあります。同期サービスが、一時停止後も残り続ける古いファイルハンドルを残していったのです。

これらのハンドルは、特定のプロセスを終了させて強制的に解放できます。

kill $(lsof -t /Volumes/YourDriveName)

これは、そのドライブを使っているすべてのプロセスを終了させます。乱暴ですが、効果的です。

Ejectaは、これをもっと外科的に処理します。クラウド同期デーモンを含め、どのプロセスがドライブをつかんでいるかを正確に特定し、それぞれを個別に終了させてくれます。ドライブにつながっているものをすべて終了させる代わりに、問題を起こしている bird プロセスだけ、あるいはDropboxのヘルパーだけを狙い撃ちできます。複数ある同期サービスのうち、どれが原因かわからないときに特に役立ちます。

クラウド同期と外付けドライブは、対立する必要はありません。必要なのは、舞台裏で何が起きているかを見通せるようにすることだけなのです。

毎回ターミナルを使いたくないなら、Ejectaがどのプロセスがドライブをブロックしているかを正確に表示します。しかもメニューバーから、ワンクリックでそのプロセスを終了できます。

今すぐ購入 — $9.99