しばらく前に/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セッションはまだ開いており、回答をテストする準備ができています:-)
この質問は、アレイを停止する方法ではなく、アレイからファイルをまだ使用しているプロセスを特定する方法/ファイルが破棄されないようにする方法に関するものであることに注意してください。
怠惰にアンマウントされたファイルシステムへの参照の検索ページのように、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
をチェックインすることもできます。