web-dev-qa-db-ja.com

Linuxでは、どのプロセスがブロックデバイスを使用しているかをどのように判断できますか?

LVMボリュームグループに移行するサーバーにディスクがあります。以前は、従来のDOSディスクパーティションhdb[1-5]を使用していました。

すべてのファイルシステムをhdbからアンマウントし、hdbを使用してスワップをシャットオフし、デバイス上の小さいVGをすでに削除し、fdiskを使用してパーティションを再作成し、既存のパーティションを削除し、2つのパーティションを作成しました、しかしそれを書き出すと、Linuxはパーティションテーブルの再読み込みを拒否しました。 hdparm -zレポートを使用して再試行します:BLKRRPART failed: Device or resource busy.

次の場所をチェックして、デバイスとそのパーティションがどこにもリストされていないことを確認しました。

  • / proc/swaps
  • / proc/mdadm
  • 'pvs'コマンドからの出力
  • 'mount'コマンドからの出力
  • / etc/mtab
  • lsof | grep hdb

しかし、cat /proc/partitionsはまだパーティションをリストし、hdparm -z /dev/hdbはまだデバイスをビジーにします。

私が見逃しているもの、またはブロックデバイスにまだ保持されているものを見つけるためにまだ知らない秘密の場所はありますか?さらに重要なことに、パーティションテーブルをリロードできるように、保留を解除するにはどうすればよいですか?

FWIW、この特定のケースでは、心配することなくサーバーを再起動するだけで済みますが、これは以前に私を悩ませていました。もっと良い方法があるかどうか知りたいです。

(編集:より正確な表現を追加)(編集:詳細の再パーティション化)

更新:私はpartprobe /dev/hdbを使用しましたが、状況が変わりました。/dev/ hdb1で、/ deb/hdb [3-5]がなくなり、partprobeがError: Error informing the kernel about modifications to partition /dev/hdb1 -- Device or resource busy. <-特にhdb1について報告しています。 。 hdb1は、以前はLVMボリュームグループ(VG)の物理ボリューム(PV)でしたが、再パーティション化する前にvgremove + pvremovedemに隣接していました......

更新2:FWIW、私はまだこの問題を修正していません。幸い、緊急ではありません。 partprobeが新しいAPI呼び出しを使用していることを知りました。そのため、以前は何かを行っているように見えました。デバイスが与えられた場合、それがメジャー/マイナー番号であり、どのリソース(カーネルまたはユーザースペース)がそれを使用しているかを把握するための簡単で効果的な方法をまだ見つけていません。何か案は?

4
Jason

フューザーを使用してみてください

fuser -vam /dev/hdb1
3
Eddy

Eddyのfuser -vam /dev/hdb1の例は本質的に正しいものでしたが、完全性に欠けていました。私の場合、データを保持しているパーティションがLVMにあるraid1アレイの最後のドライブから誰かからファイルを回復しているときに、同様の問題が発生しました。

この場合、ドライブを調べるためにphotorecを開始し、ボリュームグループがあることを確認してから、photorecを実行しているターミナルを閉じました。私には知られていないが、photorecはまだ/dev/mapper/vg0-lv0を保持していた。したがって、将来的にはfuserを使用してみてください。ただし、/dev/mapper/の内容については

fuser -vam /dev/mapper/*

これはおそらく最善の答えではありませんが、使用しようとしているブロックデバイスに何らかの方法でマップされる可能性のある/ dev /の下のファイルをチェックすることを忘れないでください。

1
user80311

コマンドmountの出力は何ですか。これがあなたの状況に当てはまるかどうかはわかりませんが、私は bind mounts を何度か使用したことがあります。バインドマウントからソースファイルシステムをアンマウントしても、バインドマウントはアンマウントされません。この場合、mountの出力は、何が起こっているのかを知らせるのにあまり役立ちません。

0
Zoredache

lsofはあなたが探しているコマンドです。通常は、マウントポイントを使用してgrepにパイプする必要があります。

lsof | grep varは、パスまたはファイル名に「var」が含まれているファイルを開いているすべてのプロセスを一覧表示します

0
3dinfluence