sb deviceをumount /run/media/theDrive
でアンマウントしたいのですが、drive is busy
エラーが発生します。
デバイスにアクセスしているプロセスまたはプログラムを確認するにはどうすればよいですか?
使用する lsof | grep /media/whatever
マウントを使用しているものを見つける。
また、umount -l
(レイジーumount)。クリーンアップ中に新しいプロセスがドライブを使用しないようにします。
ほとんどの場合、使用するのに最適なコマンドは lsof (“liです。 stopenfイル」)。
lsof +f -- /media/usb0
どこ /media/usb0
は、アンマウントするUSBドライブまたはその他のファイルシステムのマウントポイントです。 +f --
は、後続の引数をマウントポイントとして扱うようにlsofに指示します。常にではありませんが、通常は独自に管理するため、lsof /media/usb0
も機能します。これにより、開いているファイル(リンクされていないファイルも含む)、メモリマップファイル、現在のディレクトリ、およびその他のあいまいな使用法が見つかります。他のユーザーのプロセスに関する情報を取得するには、rootとしてコマンドを実行する必要があります(lsof
をrootとして実行する必要があるuniceがあると思います)。
Lsofが見つけられない用途があります。これらはリムーバブルメディアでは一般的ではありません。以下が含まれます:
/foo
の場合/foo/bar
はマウントポイントです。/foo
の場合/foo/bar
は、マウントされたブロックデバイスまたはループマウントされた通常のファイル、またはLinuxバインドマウントのソースである場合。ピンチで機能する別のコマンドは、fuserです。これは、デバイス上でファイルが開いているプロセスのPIDのみを一覧表示します。
fuser -m /media/usb0
ファイルが開いているプロセスが通常の原因です。それらを表示します。
_lsof +f -- <mountpoint or device>
_
_/dev/<device>
_ではなく_/mountpoint
_を使用することには利点があります。マウントポイントは_umount -l
_の後に消えるか、オーバーレイマウントによって非表示になる場合があります。
fuser
も使用できますが、lsof
の方が便利な出力です。ただし、fuser
は、ドラマを引き起こしているプロセスを強制終了して、自分の生活を続けることができる場合に役立ちます。
_<mountpoint>
_上のファイルを一覧表示します(上記の警告を参照):
_fuser -vmM <mountpoint>
_
ファイルを書き込み用に開いているプロセスのみを対話的に強制終了します。
_fuser -vmMkiw <mountpoint>
_
読み取り専用(_mount -o remount,ro <mountpoint>
_)を再マウントした後、残りのすべてのプロセスを強制終了しても安全です(r)。
_fuser -vmMk <mountpoint>
_
犯人はカーネルそのものかもしれません。 umount
を実行しようとしているファイルシステムにマウントされている別のファイルシステムは、問題を引き起こします。確認する:
_mount | grep <mountpoint>/
_
ループバックマウントの場合( thanks Stephen Kitt )、次の出力も確認してください:
_losetup -la
_
匿名のiノード は次の方法で作成できます。
open
with _O_TMPFILE
_)これらは最もわかりにくいタイプのポケモンであり、lsof
のTYPE
列に_a_inode
_として表示されます(これは lsof
に文書化されていません)マンページ )。
これらは_lsof +f -- /dev/<device>
_には表示されないため、以下を行う必要があります。
_lsof | grep a_inode
_
匿名のiノードを保持しているプロセスの強制終了については、次を参照してください: 現在のinotify監視(パス名、PID)をリストする 。
inotify
ウォッチ(Linux)このコメント は、inotify
がアンマウントを妨げるべきではない理由を説明していますが、 このメモ は、それがする状況を説明します:
アンマウントは
vx_softcnt_flush()
呼び出しでハングする可能性があります。ハングが発生するのは、inotifyウォッチが_i_count
_変数をインクリメントし、inotifyウォッチャーが保留を解除するまで_v_os_hold value
_が上昇したままになるためです。
Peterが言ったようにlsof
を使用することができます。あるいは、これらすべてを殺してアンマウントしたいだけの場合は、おそらく次のようにすることができます。
fuser -Mk /mnt/path
umount /mnt/path
GNOMEを使用している場合、Nautilus経由でアンマウントすると、ドライブをまだ使用しているプロセスと、ドライブが使用しているファイルを示すメッセージが表示されます。
(少なくとも)OpenBSDの場合:
$ fstat /mnt/mountpoint
例(doas
を使用してfstat
をrootとして実行すると、自分のプロセスしか表示されないため):
$ doas fstat /usr/ports
USER CMD PID FD MOUNT INUM MODE R/W SZ|DV NAME
_pbuild make 15172 wd /usr/ports 3923598 drwxrwxr-x r 1536 /usr/ports/
_pbuild make 40034 wd /usr/ports 3923598 drwxrwxr-x r 1536 /usr/ports/
この場合、ユーザー/usr/ports
が2つのmake
プロセスの実行を完了するまで、_pbuild
をアンマウントできません。