問題の発生USBドライブを抜いたり、ネットワーク共有を切断しようとしたりした際、Linuxがそれを拒否することがあります。クリーンにアンマウントされる代わりに、次のような見慣れたエラーが表示されます。
umount: /mnt/data: target is busy.
これはバグではなく、安全機能です。Linuxカーネルは、ファイルハンドルが開いたままだったり、アクティブなプロセスが存在したりするデバイスのアンマウントを防止します。もし、2GBのファイルの書き込み途中でシステムがアンマウントを許可してしまったら、ファイルシステムが破損する可能性が高いからです。これを解決するには、「ロック」を保持している特定のプロセスを見つけ、それを解放させる必要があります。
原因- ターミナルウィンドウのカレントディレクトリが、マウントポイントのサブフォルダ内にある。- メディアプレーヤーがドライブ上の動画ファイルを再生中である。- データベースやWebサーバーがディスクに直接ログを書き込んでいる。- Dockerコンテナがそのパスにマップされたボリュームを使用している。- NFSやSambaのネットワーク共有が、接続断により停止している。## エラーの解消方法### 1. 自分のターミナルを確認する複雑なコマンドを実行する前に、自分のシェルを確認してください。もし現在のターミナルで cd /mnt/data を実行していたら、そのウィンドウこそがアンマウントをブロックしている原因です。自分が中に立っている部屋を片付けたり、解体したりすることはできません。
ホームディレクトリに移動してから、再度試してください。
cd ~ sudo umount /mnt/data
2. 「lsof」でプロセスを特定する犯人がすぐに見つからない場合は、lsof(List Open Files)ユーティリティが探偵の役割を果たします。現在ドライブとやり取りしているすべてのプロセスを表示します。
sudo lsof +D /mnt/data
+D フラグはディレクトリを再帰的に検索します。次のような出力が表示されます。
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME python3 4567 linuxuser cwd DIR 8,1 4096 2 /mnt/data gio-mu 8910 linuxuser 4u REG 8,1 524288 15 /mnt/data/backup.tar.gz
PID(プロセスID)が必要な番号です。この例では、Pythonスクリプト(PID 4567)とシステムプロセス(PID 8910)がアクセスを保持しています。
3. 手軽な代替案:「fuser」システムに lsof がインストールされていない場合、fuser が強力な代替手段となります。これはほとんどのディストリビューションにプリインストールされており、ファイルやソケットを使用しているプロセスを見つけるために特別に作られています。
sudo fuser -v -m /mnt/data
```- `-v`: 詳細モードを有効にし、読みやすくします。- `-m`: マウントポイント全体のアクティビティをチェックします。**ACCESS** カラムは状況を示しています。`c` はプロセスがディレクトリ内にいることを意味し、`f` はファイルが読み書きのために開かれていることを意味します。
### 4. ブロックしているプロセスを停止するPIDが判明したら、まずはアプリケーションを正常に終了させてみてください。たとえば、PID 4567 が問題の場合:
sudo kill 4567
プロセスが反応しない場合は、強制終了させる「最終手段」を使用します。
sudo kill -9 4567
**警告:** `fuser` は `sudo fuser -k /mnt/data` コマンド一発で、ドライブを使用しているすべてのプロセスを強制終了できます。重要なデータが書き込まれていないことが確実な場合にのみ使用してください。
### 5. 「Lazy(遅延)」アンマウントゴーストプロセスやハングしたネットワークマウントなどでプロセスを終了できない場合は、遅延アンマウント(Lazy unmount)を使用します。これにより、ディレクトリツリーからファイルシステムが即座に切り離されますが、カーネルはプロセスが作業を終えるのを待ってからリソースを完全にクリーンアップします。
sudo umount -l /mnt/data
### 6. ネットワーク共有の強制アンマウント他の方法に応答しない、停止したNFSやSamba共有の場合、`-f` フラグを使用して強制的に接続を切断します。
sudo umount -f /mnt/data
## 結果の確認アクティブなマウントリストを確認して、ドライブが最終的に解除されたかチェックします。
mount | grep /mnt/data
コマンドが空の行を返せば、解除されています。また、`ls /mnt/data` を実行しても確認できます。外部ディスクの内容ではなく、メインドライブ上の下層のマウントポイントが表示されるため、フォルダは空になっているはずです。
## プロのヒント:削除済みファイルまれに、`lsof` で `(deleted)` とマークされたファイルが表示されることがあります。これは、アプリケーションがファイルを削除したものの、ハンドルを開いたままにしている場合に発生します。そのアプリケーションを再起動または終了させるまで、ディスク容量は解放されず、ドライブもアンマウントできません。

