POSIX 쉘 에서 C를 사용하지 않고 모든 btrfs 파일 시스템 하위 볼륨 에 대한 정보를 얻는 편리한 방법이 있습니까?
/sys/fs/btrfs
는 파일 시스템에만 정보를 포함하고 하위 볼륨에는 아무것도 포함하지 않으므로 현재 모든 파일 시스템을 임시 폴더에 마운트하고로 스캔 btrfs subvol list
한 다음 결과 출력을 구문 분석합니다. 말할 것도없이, 그것은 상당히 추악합니다.
이것은 3.16.x 커널과 btrfs-progs v3.14.1 (재고 우분투 14.10부터)입니다.
아래는 현재 사용중인 (추악한) 스크립트입니다. 나는 순수한 C를 사용하여 필요한 정보를 얻을 수 있다는 것을 알고 있으며, 아마도 내가 결국 할 일이지만, 더 단순하고 우아한 방법이 있는지 궁금합니다.
#!/bin/bash
for i in /sys/fs/btrfs/*[!features]; do
device="/dev/$(basename $i/devices/*)"
mountpoint=/var/lib/btrfs/tmp/mnt/$(basename "$i")
[ -d "$mountpoint" ] || mkdir "$mountpoint"
grep -qs $mountpoint /proc/mounts
[ $? -ne 0 ] && mount -v "$device" "$mountpoint"
while read -r subvol; do
# whatever you want
done < <(btrfs subvolume list "$mountpoint")
umount $mountpoint
rmdir $mountpoint
done
답변
/sys/fs/btrfs
데비안 / 우분투 (4.14.0-1 / 4.10.0-42)에서 테스트 된 모든 btrfs 파일 시스템 (예 : 마운트되지 않은 시스템)을 나열하지는 않습니다.
btrfs progs를 사용하여 검색합니다.
btrfs filesystem show | awk '/ path /{print $NF}'
그리고 btrfs progs는 마운트 된 fs의 하위 볼륨 만 나열 할 수 있으므로 스크립트는 내가 사용하는 것과 멀지 않습니다.
#!/bin/bash
readarray -t btdev < <(sudo btrfs filesystem show | awk '/ path /{print $NF}' )
for i in "${btdev[@]}"; do
device="${i}"
mountpoint=/var/lib/btrfs/tmp/mnt/$(basename "$i")
[ -d "$mountpoint" ] || mkdir "$mountpoint"
grep -qs $mountpoint /proc/mounts
[ $? -ne 0 ] && mount -v "$device" "$mountpoint"
while read -r subvol; do
# whatever you want
done < <(btrfs subvolume list "$mountpoint")
umount $mountpoint
rmdir $mountpoint
done
다중 장치 파일 시스템에 대해 테스트되지 않았습니다 (raid-0 / 1 / 10 / 5 / 6)