我有一个/dev/md127
mdadm RAID 0 阵列,不久前被安装为/mnt/storage1
.在某个时候,我打开了 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)
我什至尝试列出 bash 进程打开的文件,这些文件仍在目录中/mnt/storage1
,但没有成功(是的,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 会话仍然开放并准备测试您的答案:-)
请注意,这个问题不是关于如何停止数组,而是如何识别仍在使用数组中的文件/防止其被破坏的进程。
答案1
按照查找对延迟卸载文件系统的引用页面上,该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
。