Bash
通過 bash 腳本確定給定路徑是否在可移動設備上,即使已加密
/path/to/directory/
是在加密卷內指向任意深度的路徑。在 bash 腳本中,我需要確定與此路徑相關的塊設備是否是可移動設備。我正在使用 Arch Linux。我查看了很多類似的問題(例如下面列出的問題和其他問題),但沒有找到合適的答案:
- linux - 如何確定哪個 sd* 是 USB?- Unix 和 Linux 堆棧交換
- bash - 如何知道 /dev/sdX 是連接的 USB 還是 HDD?- Unix 和 Linux 堆棧交換
- mount - 我如何知道 USB 記憶棒的設備路徑?- 詢問 Ubuntu
這是我正在使用的範例:
findmnt -n -o SOURCE --target /path/to/directory/ /dev/mapper/luksdev[/@subvolume] findmnt -D --target /path/to/directory SOURCE FSTYPE SIZE USED AVAIL USE% TARGET /dev/mapper/luksdev[/@subvolume] btrfs 4.5T 203.5G 4.3T 4% /path/to/directory df -P /path/to/directory/ | awk 'END{print $1}' /dev/mapper/luksdev
--target
(如果路徑不是確切的掛載點,則似乎需要findmnt 參數。)如果腳本可以確定與
/dev/sda1
關聯的塊設備(例如 )/dev/mapper/luksdev
,我會更進一步:udevadm info --query=all --name=/dev/sda1 | grep ID_BUS | grep "=usb" E: ID_BUS=usb
但我認為並非所有可移動設備都是 USB,對吧?
順便說一句,我可以使用特定於 BTRFS 的方法,如果這樣可以更容易的話。我確實檢查了:
btrfs - 在加密文件系統上查找根文件系統的物理塊設備?- Unix 和 Linux 堆棧交換
編輯:根據 Vojtech Trefny 的回答,這就是我所擁有的:
mapper_path=$(findmnt -n -o SOURCE --target /path/to/directory/ | cut -d [ -f 1) mydev=$(lsblk -sl -o NAME /${mapper_path} | tail -n 1) drive_name=$(udisksctl info -b /dev/${mydev} | grep "Drive:" | cut -d"'" -f2) drive_name=$(echo $drive_name | sed -e 's|/org/freedesktop/UDisks2/drives/||') udisksctl info -d ${drive_name} | grep "\sRemovable:" | cut -d":" -f2 | tr -d "[:blank:]"
從
/dev/mapper
路徑中,獲取磁碟名稱的最簡單方法應該lsblk
是以-s
相反的順序列出設備:$ lsblk -sl -o NAME /dev/mapper/<name> | tail -1 sda
從這裡開始最簡單的方法可能是
removable
從 sysfs 檢查屬性$ cat /sys/block/sda/removable 0
但我建議在這裡使用 UDisk,它會在 sysfs 資訊之上進行一些額外的檢查,所以我認為 sysfs 對於某些可移動設備可能是錯誤的。您可以使用
busctl
通過 DBus 與 UDisk 進行通信,也可以使用udisksctl
grep 從輸出中進行通信。$ busctl get-property org.freedesktop.UDisks2 /org/freedesktop/UDisks2/block_devices/sda org.freedesktop.UDisks2.Block Drive o "/org/freedesktop/UDisks2/drives/<drive_name>" $ busctl get-property org.freedesktop.UDisks2 /org/freedesktop/UDisks2/drives/<drive_name> org.freedesktop.UDisks2.Drive Removable b false
或者
$ udisksctl info -b /dev/sda | grep "Drive:" | cut -d"'" -f2 /org/freedesktop/UDisks2/drives/<drive_name> $ udisksctl info -d <drive_name> | grep "\sRemovable:" | cut -d":" -f2 | tr -d "[:blank:]" false