即使在“blockdev --setro”之后设备也可写

即使在“blockdev --setro”之后设备也可写

我想使用 的功能umount -l,然后尽可能安全地删除底层设备。

  • 我无法umount --force卸载文件系统,因为它对新进程来说是不可见的。
  • 我无法使用lsof打开文件的准确列表,因为文件系统对新进程变得不可见。
  • 如果我使用lsofbefore umount -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:它仅影响对象的未来开口。

但我可以为您的检测问题提供一个解决方法:

  1. 该值在延迟卸载后/proc/$PID/cwd更改为。/
  2. 所示进程的打开文件的路径/proc/$PID/fd向上移动到/,例如/mnt/tmp/output变为/output

所以你可以先用 cmd 过滤所有进程/。其中可能存在误报,但速度非常快。下一步(不一定完整,但可能更快)是检查/proc/$PID/fd所有这些进程中是否存在显示路径中不存在的文件。

完整但可能不那么快的检查是stat/proc/$PID/fd.它显示了原始设备。因此,您可以在卸载之前检查该值以使事情变得更容易。

相关内容