bash 스크립트를 통해 특정 경로가 이동식 장치(암호화된 경우에도)에 있는지 확인

bash 스크립트를 통해 특정 경로가 이동식 장치(암호화된 경우에도)에 있는지 확인

/path/to/directory/암호화된 볼륨 내의 모든 깊이에 대한 경로입니다. Bash 스크립트에서 이 경로와 연결된 블록 장치가 다음인지 확인해야 합니다.이동할 수 있는장비. 저는 아치 리눅스를 사용하고 있습니다.

비슷한 질문(예: 아래 나열된 질문 및 기타 질문)을 많이 살펴봤지만 적절한 답변을 찾지 못했습니다.

내가 사용하는 것의 예는 다음과 같습니다.

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

관련 정보