Block-Device即使在
即使在 blockdev --setro
之後設備仍可寫
我想使用 的功能
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
我猜它的
blockdev --setro
工作原理類似於chmod
:它只影響對象的未來開口。但我可以為您的檢測問題提供解決方法:
- 該
/proc/$PID/cwd
值/
在延遲解除安裝後更改為。- 顯示的程序打開文件的路徑上
/proc/$PID/fd
移到/
,例如/mnt/tmp/output
變成/output
。因此,您可以先使用 cmd 過濾所有程序
/
。其中可能存在誤報,但這非常快。下一步(不一定完整,但可能更快)是檢查/proc/$PID/fd
所有這些程序中是否存在顯示路徑中不存在的文件。完整但可能不是那麼快的檢查是
stat
對/proc/$PID/fd
. 它顯示了原始設備。因此,您可以在 umount 之前檢查此值以使事情變得更容易。