Bash

通過 bash 腳本確定給定路徑是否在可移動設備上,即使已加密

  • October 10, 2020

/path/to/directory/是在加密卷內指向任意深度的路徑。在 bash 腳本中,我需要確定與此路徑相關的塊設備是否是可移動設備。我正在使用 Arch Linux。

我查看了很多類似的問題(例如下面列出的問題和其他問題),但沒有找到合適的答案:

這是我正在使用的範例:

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 進行通信,也可以使用udisksctlgrep 從輸出中進行通信。

$ 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

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