/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:]"
答案1
从/dev/mapper
路径中,获取磁盘名称的最简单方法应该是lsblk
按-s
相反顺序列出设备:
$ lsblk -sl -o NAME /dev/mapper/<name> | tail -1
sda
从这里最简单的方法可能是从 sysfs 检查removable
属性
$ cat /sys/block/sda/removable
0
但我建议在这里使用 UDisks,它会在 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