Linux:umountを実行するときに、どのプロセスが「デバイスビジー」を引き起こしていますか?
lsof コマンド(開いているファイルを一覧表示する)を見ると、どのプロセスが何を開いているのかがわかります。時には注意を要することもありますが、多くの場合、Sudo lsof | grep (your device name here)
があなたのためにできるような単純なものです。
念のため...ターミナルからumountを呼び出しており、現在のディレクトリがマウントされたファイルシステムに属している場合があります。
fuser コマンドを使用する必要があります。
例えば。 fuser /dev/cdrom
は、/dev/cdrom
を使用してプロセスのpidを返します。
アンマウントしようとしている場合は、-k
スイッチを使用してこれらのプロセスを強制終了できます(man fuser
を参照)。
「losetup -a」を使用して、ファイルシステム上のファイルにマッピングされたオープンループデバイスを確認します。それらはlsofまたはfuserのいずれでも表示されません。
また、/etc/exports
。 NFS経由でマウントポイント内のパスをエクスポートしている場合、アンマウントしようとするとこのエラーが発生し、fuser
またはlsof
に何も表示されません。
lsof +f -- /mountpoint
(/ mountpointにマウントされたマウント上のファイルを使用するプロセスをリストします。マウントされたUSBスティックまたはCD/DVDを使用しているプロセスを見つけるのに特に役立ちます。
lsofとfuserは、特定のファイルを開いたままにするプロセスを見つける2つの方法です。 umountを成功させるだけの場合は、-fおよび-lオプションを調査する必要があります。
それがまさに「fuser -m/mount/point」が存在する理由です。
ところで、「fuser」や「lsof」がカーネルモジュールによってリソースが保持されていることを示すとは思いませんが、通常はその問題はありません。
lsofとfuserも私に何もくれませんでした。
すべての可能なディレクトリの名前を.oldに変更し、変更を加えるたびにシステムをリブートするプロセスの後、責任のある特定のディレクトリ(postfixに関連する)を見つけました。
SDCARDベースのルートファイルシステム(Sheevaプラグ)へのディスク書き込みを最小限に抑えるために、/ var/spool/postfixから/ disk2/pers/mail/postfix/varspoolへのシンボリックリンクを作成したことがあることが判明しました。
このシンボリックリンクを使用すると、postfixサービスとdovecotサービスを停止した後でも(ps auxとnetstat -tuanpの両方に関連するものは何も表示されませんでした)、/ disk2/persをアンマウントできませんでした。
Symlinkを削除し、/ disk2/pers /の新しいディレクトリを直接指すようにpostfixおよびdovecotの構成ファイルを更新すると、サービスを正常に停止してディレクトリをアンマウントできました。
次回は、次の出力をさらに詳しく見ていきます。
ls -lR /var | grep ^l | grep disk2
上記のコマンドは、ディレクトリツリー(ここでは/ varで始まる)内のすべてのシンボリックリンクを再帰的にリストし、特定のターゲットマウントポイント(ここではdisk2)を指す名前を除外します。
開いているファイルですべてのサービスとプロセスを停止した後でもデバイスをアンマウントまたは再マウントできない場合は、デバイスをビジー状態に保つスワップファイルまたはスワップパーティションがある可能性があります。これはfuser
またはlsof
には表示されません。スワップをオフにします:
Sudo swapoff -a
事前に確認して、スワップパーティションまたはスワップファイルの概要を次のように表示できます。
swapon -s
または:
cat /proc/swaps
コマンドSudo swapoff -a
を使用する代わりに、サービスまたはsystemd unitを停止してスワップを無効にすることもできます。例えば:
Sudo systemctl stop dphys-swapfile
または:
Sudo systemctl stop var-swap.swap
私の場合、書き込み用にファイルを開いた状態でサービスとプロセスを停止することに加えて、スワップをオフにする必要があったため、ルートパーティションでfsck
を実行せずに再起動します。これは、Raspbian Jessieを実行しているRaspberry Piで必要でした。
ファイルを開いているプロセスは、通常の原因です。それらを表示します。
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>/
ループバックマウントの場合は、次の出力も確認してください。
losetup -la
匿名iノード は、次の方法で作成できます。
open
with O_TMPFILE
)これらは最もわかりにくいタイプのポケモンであり、lsof
のTYPE
列にa_inode
として表示されます( lsof
manページ には記載されていません) 。
lsof +f -- /dev/<device>
には表示されないため、以下を行う必要があります。
lsof | grep a_inode
匿名iノードを保持しているプロセスの強制終了については、 現在のinotifyウォッチ(パス名、PID)を一覧表示 を参照してください。
アンマウントしようとしているファイルシステムにマウントされているファイルシステムは、target is busy
使用中のファイルに加えてエラー。 (たとえば、mount -o bind /dev /mnt/yourmount/dev
そこにchroot
を使用するため)
ファイルシステムにマウントされているファイルシステムを見つけるには、次を実行します。
mount | grep '/mnt/yourmount'
使用中のファイルを見つけるには、ここで他の人がすでに提案したアドバイスを使用してください。
lsof | grep '/mnt/yourmount'