web-dev-qa-db-ja.com

レイジーアンマウントされたファイルシステム上のファイルをまだ使用しているプロセスを特定します

しばらく前に/dev/md127としてマウントされた/mnt/storage1 mdadm RAID0アレイがあります。ある時点で、bashセッションを開き、CWDを/mnt/storage1に変更しましたが、bashセッションはまだアクティブです。次に、アレイをアンマウントして破棄することにしました。

/# umount /mnt/storage1
Device or resource busy msg
/# umount -l /mnt/storage1
(Succeeded)
/# rmdir /mnt/storage1
(Succeeded)

/mnt/storage1が削除されたことを確認しました。 mount/dev/md127がマウントされていると表示しません。それでも、私が言及したbashセッションには、作業ディレクトリとして/mnt/storage1がまだあります。

/mnt/storage1# _

ここで、/ dev/md127配列を停止して破棄しようとすると、次のようになります。

/# mdadm --stop /dev/md127
mdadm: Cannot get exclusive access to /dev/md127:Perhaps a running process, mounted filesystem or active volume group?

lsofは、/ dev/md127または/ mnt/storage1のいずれかでまだ開いているファイルをリストしません

/# lsof |grep storage1
/# (No results)
/# lsof |grep md127
/# (No results)

まだ/mnt/storage1ディレクトリにあるbashプロセスによって開かれたファイルを一覧表示しようとしましたが、成功しませんでした(はい、3172はbashプロセスの正しいPIDです)

/# lsof -p 3172
COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF     NODE NAME
bash    3172 root  cwd    DIR   0,40       40      256 /
bash    3172 root  rtd    DIR    9,0     4096        2 /
bash    3172 root  txt    REG    9,0  1037528 10485776 /bin/bash
bash    3172 root  mem    REG    9,0    47600  1310937 /lib/x86_64-linux-gnu/libnss_files-2.23.so
bash    3172 root  mem    REG    9,0    47648  1310851 /lib/x86_64-linux-gnu/libnss_nis-2.23.so
bash    3172 root  mem    REG    9,0    93128  1310763 /lib/x86_64-linux-gnu/libnsl-2.23.so
bash    3172 root  mem    REG    9,0    35688  1310755 /lib/x86_64-linux-gnu/libnss_compat-2.23.so
bash    3172 root  mem    REG    9,0  2981280 16522333 /usr/lib/locale/locale-archive
bash    3172 root  mem    REG    9,0  1864888  1311188 /lib/x86_64-linux-gnu/libc-2.23.so
bash    3172 root  mem    REG    9,0    14608  1311189 /lib/x86_64-linux-gnu/libdl-2.23.so
bash    3172 root  mem    REG    9,0   167240  1311191 /lib/x86_64-linux-gnu/libtinfo.so.5.9
bash    3172 root  mem    REG    9,0   162632  1311181 /lib/x86_64-linux-gnu/ld-2.23.so
bash    3172 root  mem    REG    9,0    26258 16523837 /usr/lib/x86_64-linux-gnu/gconv/gconv-modules.cache
bash    3172 root    0u   CHR  136,0      0t0        3 /dev/pts/0
bash    3172 root    1u   CHR  136,0      0t0        3 /dev/pts/0
bash    3172 root    2u   CHR  136,0      0t0        3 /dev/pts/0
bash    3172 root  255u   CHR  136,0      0t0        3 /dev/pts/0

私はbashプロセスのCWDを取得しようとしましたが、これは間違った(?)結果をもたらしました:

/# pwdx 3172
3172: /

少しの間、どのプロセスがアレイの停止を妨げているのかわからないと仮定しましょう。どうすればそれを識別できますか?

この質問は https://superuser.com/questions/471327/how-to-force-mdadm-to-stop-raid5-array に関連しています-問題は数年間私を悩ませてきました今、私に再び起こったら、私はそれを適切に解決したいと思います。 bashセッションはまだ開いており、回答をテストする準備ができています:-)

この質問は、アレイを停止する方法ではなく、アレイからファイルをまだ使用しているプロセスを特定する方法/ファイルが破棄されないようにする方法に関するものであることに注意してください。

5
matt

怠惰にアンマウントされたファイルシステムへの参照の検索ページのように、lsofツールは非リストに表示されません-絶対パス(lsofの出力は不規則です)、さらに悪いことに、メモリマップのような他のファイルシステムの依存関係はリストされません。

回避策としては、/proc/*/mapsを確認する必要があります。これは、各プロセスに属するメモリマッピングを示し、マッピングの種類と、ファイルまたはパスの場合を示します。ただし、lsofのように、ファイルをホストしているファイルシステムがレイジーアンマウントされている場合、絶対パスは使用できません。

推奨されるスクリプトは次のとおりです。

!/bin/bash
cat /proc/*/maps 
  | awk '{print $6}'
  | grep -v '^/'         # remove absolute paths
  | grep -v '^$' 
  | grep -v '(deleted)' 
  | grep -v '^.vdso.$' 
  | grep -v '^.heap.$' 
  | grep -v '^.stack.$' 
  | grep -v '^.vsyscall.$' 
  | grep -v '^socket:$'

これは、既知の誤検知を取り除くのに役立ちます。

さらに、/proc/X/fd/*および/proc/X/cwdをチェックインすることもできます。

2
kenorb