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

出力には、すべてのディスクとそのパーティションが表示されます。外付けドライブは disk4disk5 のように表示されます。内蔵ドライブは通常 disk0disk1 です。

外付けドライブだけをもっと見やすく一覧表示するには、次のようにします。

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: ファイルディスクリプタとアクセスモード。r は読み込み、w は書き込み、u は読み書きを意味します。wu が見える場合、何かがアクティブにドライブへ書き込んでおり、強制的に取り出すのは危険です。
  • NAME: アクセスされている具体的なファイル。これを見ると、そのプロセスがそこにいる理由がはっきりわかることがよくあります。

よくある原因は、mds(Spotlightのインデックス作成)、backupd(Time Machine)、DropboxGoogle Drive、そしてFinder自身です。個別の対処法は、Spotlightが取り出しを妨げる場合iCloud/Dropboxが取り出しを妨げる場合の詳しい解説をご覧ください。

妨げているプロセスを終了させる

妨げているプロセスのPIDがわかったら、まずは穏やかに終了させます。

kill 789

これは穏やかな終了シグナルを送ります。プロセスにはファイルを閉じて後始末をする機会が与えられます。数秒待って終了させてから、もう一度取り出しを試みてください。

穏やかなkillに反応しない場合は、次のようにします。

kill -9 789

これは即座の強制終了を行います。プロセスに後始末をする機会はありません。特にシステムプロセスに対しては、最後の手段として使ってください。

特定のボリュームを使っているすべてのプロセスを1つのコマンドで終了させるには、次のようにします。

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

何かがアクティブに書き込んでいるかを見るために、リアルタイムのディスクI/Oを監視します。

sudo fs_usage -f diskio | grep YourDriveName

これは継続的に実行され、起きているすべてのディスク操作をその場で表示します。Control-Cで停止します。lsof でプロセスが見えるものの、アクティブに書き込んでいるのか、それとも古いハンドルを保持しているだけなのか確信が持てないときに使ってください。

ターミナルが手間に見合わないとき

これらのコマンドは強力で、何度か使えば自然に身につきます。しかし、作業からターミナルのウィンドウへと切り替えること、つまり診断コマンドを実行し、技術的な出力を読み解き、どのPIDなら安全に終了させられるかを判断することには、確かなコストがあります。

Ejectaは、上記のすべてを自動で行います。ドライブを監視し、妨げているすべてのプロセスを特定し、それぞれをワンクリックで終了させるボタンを用意します。sudo lsof で得られるのと同じ情報を、メニューバーの中で視覚的に見せてくれるのです。覚えるコマンドも、読み解く出力もありません。

9.99ドルで、この一連の複数手順のターミナル作業をワンクリックに置き換えるツールが手に入ります。この問題に月に1回以上悩まされているなら、最初の1週間で、節約できたいら立ちのぶんだけ元が取れます。Ejectaを7日間無料でお試しください — ターミナルは要りません。

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

今すぐ購入 — $9.99