Block-Device

即使在 blockdev --setro 之後設備仍可寫

  • August 12, 2017

我想使用 的功能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

我猜它的blockdev --setro工作原理類似於chmod:它只影響對象的未來開口。

但我可以為您的檢測問題提供解決方法:

  1. /proc/$PID/cwd/在延遲解除安裝後更改為。
  2. 顯示的程序打開文件的路徑上/proc/$PID/fd移到/,例如/mnt/tmp/output變成/output

因此,您可以先使用 cmd 過濾所有程序/。其中可能存在誤報,但這非常快。下一步(不一定完整,但可能更快)是檢查/proc/$PID/fd所有這些程序中是否存在顯示路徑中不存在的文件。

完整但可能不是那麼快的檢查是stat/proc/$PID/fd. 它顯示了原始設備。因此,您可以在 umount 之前檢查此值以使事情變得更容易。

引用自:https://unix.stackexchange.com/questions/385642