diskutil eject: Macのターミナルからドライブを取り出す方法
diskutilを使ってMacのドライブをターミナルから取り出す方法。取り出せないボリュームの強制マウント解除や、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 は1つのボリュームを外します。eject は物理デバイスと、そのすべてのボリュームを一度に外します。
diskutil list でドライブの識別子を見つける
より高度なコマンドを使う前に、ドライブの識別子が必要です。接続中のすべてのディスクを一覧表示します。
diskutil list
出力には、すべてのディスクとそのパーティションが表示されます。外付けドライブは disk4 や disk5 のように表示されます。内蔵ドライブは通常 disk0 と disk1 です。
外付けドライブだけをもっと見やすく一覧表示するには、次のようにします。
diskutil list external
ディスクの識別子がわかれば、ボリューム名の代わりに /dev/ のパスを使って取り出すこともできます。
diskutil eject /dev/disk4
これは、ボリューム名に特殊な文字が含まれている場合や、ボリュームはマウントされていないのにディスクがまだ接続されている場合に便利です。
すべての外付けドライブを一度に取り出す方法
すべての外付けドライブを1つのコマンドで取り出したい場合、2つの方法があります。
diskutil を使ってすべての外付けディスクを見つけ、取り出す方法です。
diskutil list external | grep -o 'disk[0-9]*$' | while read disk; do diskutil eject "/dev/$disk"; done
あるいは、Finderの動作を再現する、ターミナルからのAppleScriptを使う方法です。
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(開いているファイルの一覧)」の略です。そのボリューム上でファイルを開いているすべてのプロセスを、プロセス名、プロセスID(PID)、実行しているユーザー、開いているファイルとともに表示します。(lsof のフラグやパターンを集中的に解説したものは、Macユーザーのためのlsofコマンドガイドをご覧ください。)
システムプロセスを含めた完全な結果を得るには、sudo を付けて実行します。
sudo lsof /Volumes/YourDriveName
sudo なしでは、自分のユーザーアカウントが所有するプロセスしか表示されません。Spotlightの mds やTime Machineの backupd のようなシステムプロセスは現れません。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: プロセスID。必要に応じてプロセスを終了させるのに使います。
- FD: FDはファイルを開いたモードを示します。rは読み取り、wは書き込み、uは両方です。現在の動作を示すものではなく、ボリュームに未完了の書き込みがない証拠にはなりません。
- NAME: アクセスされている具体的なファイル。これを見ると、そのプロセスがそこにいる理由がはっきりわかることがよくあります。
よくある原因は、mds(Spotlightのインデックス作成)、backupd(Time Machine)、Dropbox、Google Drive、そしてFinder自身です。個別の対処法は、Spotlightが取り出しを妨げる場合とiCloud/Dropboxが取り出しを妨げる場合の詳しい解説をご覧ください。
妨げているプロセスを終了させる
対応アプリをメニューバーから終了できます。システムプロセスは別の扱いとなり、待機やMacのシステム終了が必要な場合があります。 作業を保存し、コピーとバックアップを完了させ、アプリを通常の方法で終了してから取り出しを再試行してください。 Ejectaは書き込みの安全性を保証しません。
kill 789
これは穏やかな終了シグナルを送ります。プロセスにはファイルを閉じて後始末をする機会が与えられます。数秒待って終了させてから、もう一度取り出しを試みてください。
穏やかなkillに反応しない場合は、次のようにします。
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
何かがアクティブに書き込んでいるかを見るために、リアルタイムのディスクI/Oを監視します。
sudo fs_usage -f diskio | grep YourDriveName
これは継続的に実行され、起きているすべてのディスク操作をその場で表示します。Control-Cで停止します。lsof でプロセスが見えるものの、アクティブに書き込んでいるのか、それとも古いハンドルを保持しているだけなのか確信が持てないときに使ってください。
ターミナルが手間に見合わないとき
これらのコマンドは強力で、何度か使えば自然に身につきます。しかし、作業からターミナルのウィンドウへと切り替えること、つまり診断コマンドを実行し、技術的な出力を読み解き、どのPIDなら安全に終了させられるかを判断することには、確かなコストがあります。
Ejecta: Ejectaのドライブ診断は無料で、試用期間の制限はありません。有料ライセンスで対応アプリの終了・取り出し、すべて取り出す操作、Time Machineの操作が使えます。システムプロセスでは待機、認証、システム終了が必要な場合があります。先に保存し、転送を完了してください。
Macの台数や有効化回数の制限はありません。 返金の申請は購入から30日以内。
Ejectaのドライブ診断は無料で、試用期間の制限はありません。有料ライセンスで対応アプリの終了・取り出し、すべて取り出す操作、Time Machineの操作が使えます。システムプロセスでは待機、認証、システム終了が必要な場合があります。先に保存し、転送を完了してください。
今すぐ購入 -関連記事
MacでUSBメモリを安全に取り出す方法
MacでUSBメモリを取り出すあらゆる方法と、macOSが「ディスクは使用中」だと言って取り出させてくれないときの対処法を解説します。
Macで外付けハードドライブを見つけて開いて使う方法
外付けハードドライブをMacに接続し、Finderで見つけ、ファイルを開き、安全に取り外すまで。初めての人や困っている人向けの分かりやすいガイドです。
外付けドライブを接続するとMacが遅くなる理由
外付けドライブを接続しただけでシステム全体が遅くなるのはおかしな話ですが、実際にはよく起こります。その裏側で何が起きているのか、そしてどう対処すればよいのかを解説します。
macOSのディスクのアクセス権と外付けドライブを理解する
アクセス権の問題は、Macで外付けドライブにアクセスしたり、変更したり、取り出したりするのを妨げることがあります。macOSのアクセス権が取り外し可能なストレージとどう関わるのかを解説します。