bashスクリプトを介して特定のパスがリムーバブルデバイス(暗号化されている場合でも)にあることを確認する

bashスクリプトを介して特定のパスがリムーバブルデバイス(暗号化されている場合でも)にあることを確認する

/path/to/directory/暗号化されたボリューム内のすべての深さへのパス。 Bashスクリプトでは、このパスに関連付けられているブロックデバイスが次のものであることを確認する必要があります。移動可能機器。私はアーチ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:]"

ベストアンサー1

/dev/mapperパスからディスク名を取得する最も簡単な方法は、デバイスを逆順lsblkにリストすることです。-s

$ lsblk -sl -o NAME /dev/mapper/<name> | tail -1
sda

ここで最も簡単な方法は、おそらくsysfsでremovableプロパティをチェックすることです。

$ cat /sys/block/sda/removable
0

ただし、ここではsysfs情報に加えていくつかの追加チェックを実行するUDiskを使用することをお勧めします。したがって、一部のリムーバブルデバイスでは、sysfsが間違っている可能性があると思います。 DBusを使用してbusctlUDiskと通信したり、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

おすすめ記事