我想使用 的功能umount -l
,然后尽可能安全地删除底层设备。
- 我无法
umount --force
卸载文件系统,因为它对新进程来说是不可见的。 - 我无法使用
lsof
打开文件的准确列表,因为文件系统对新进程变得不可见。 - 如果我使用
lsof
beforeumount -l
,则在两次调用之间存在打开新文件的竞争条件。
我正在测试一个解决方法:sync && blockdev --setro /dev/<device>
手册blockdev --setro
只说:
设置为只读。
手册页是否缺少某些内容?这似乎在--setro
设备上创建一个文件:
# mount /dev/loop0 mountpoint/
# blockdev --setro /dev/loop0
# echo test > mountpoint/f
# sync
# umount mountpoint
# mount /dev/loop0 mountpoint/
mount: /tmp/mountpoint: WARNING: device write-protected, mounted read-only.
# cat mountpoint/f
test
#
环境:
$ uname -a
Linux svelte 4.9.39-1-MANJARO #1 SMP PREEMPT Fri Jul 21 08:25:24 UTC 2017 x86_64 GNU/Linux
$ blockdev --version
blockdev from util-linux 2.30
答案1
我猜其blockdev --setro
工作原理类似于chmod
:它仅影响对象的未来开口。
但我可以为您的检测问题提供一个解决方法:
- 该值在延迟卸载后
/proc/$PID/cwd
更改为。/
- 所示进程的打开文件的路径
/proc/$PID/fd
向上移动到/
,例如/mnt/tmp/output
变为/output
。
所以你可以先用 cmd 过滤所有进程/
。其中可能存在误报,但速度非常快。下一步(不一定完整,但可能更快)是检查/proc/$PID/fd
所有这些进程中是否存在显示路径中不存在的文件。
完整但可能不那么快的检查是stat
对/proc/$PID/fd
.它显示了原始设备。因此,您可以在卸载之前检查该值以使事情变得更容易。