Linux
如何輕鬆找出塊設備(或其一部分)是否以某種方式安裝
我想知道最簡單的方法是確定(沒有root權限)塊設備(比如
sdb
)或它的任何部分是否已安裝(以及它的哪一部分)。檢查
/proc/mounts
sdb 是不夠的,因為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),不同的程序可以對已安裝和未安裝的內容有不同的看法。在這裡,事情開始變得有點紅了。