Linux

如何輕鬆找出塊設備(或其一部分)是否以某種方式安裝

  • December 2, 2020

我想知道最簡單的方法是確定(沒有root權限)塊設備(比如sdb)或它的任何部分是否已安裝(以及它的哪一部分)。

檢查/proc/mountssdb 是不夠的,因為sdb它的分區之一可能被 LVM 使用。您可以檢查/sys/block/sdb/sdb*/holders/,但您會得到dm-x必須解析為/dev/mapper名稱才能檢查的條目/proc/mounts。可能,但如果有更簡單的解決方案……(不應該需要root權限)

這本質上是檢查一整袋極端案例的問題。

  • 驅動器可以出現在 /proc/mounts
  • 驅動器可以用作交換*(使用 /proc/swaps)*
  • 驅動器可以是活動 LVM pv 的一部分*(使用 pvdisplay)*
  • 驅動器可以是 dm-mapper RAID 組的一部分*(使用 /proc/mdstat)*
  • 應用程序可以直接訪問驅動器(例如,Oracle 支持直接寫入驅動器或分區而不是文件系統)(使用 fuser)
  • 虛擬機可以直接訪問驅動器*(使用 fuser)*
  • 驅動器可以被環回設備引用(例如:mount /dev/sda -o offset=1M /foo(使用 losttup -a)

這些只是我用一分半鐘的時間想出來的例子。我敢肯定還有十幾個。

我認為最後一個例子是最有趣的,很少有人知道。它允許您在不使用分區的情況下掛載文件系統。只需指定起始偏移量,Linux 就會透明地創建一個環回設備。上面的範例產生以下結果:

# cat /proc/mounts
...
/dev/loop0 /foo ext4 relatime,data=ordered 0 0

# losetup -a
/dev/loop0 [0005]:2048 (/dev/sda), offset 1048576

為什麼要這麼做?通常,它涉及以前出現嚴重錯誤的情況。

還要記住,使用主線中的命名空間功能(請參閱unshare),不同的程序可以對已安裝和未安裝的內容有不同的看法。在這裡,事情開始變得有點紅了。

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