쉘의 모든 btrfs 파일 시스템 및 서브 볼륨 나열 볼륨에는 아무것도 포함하지 않으므로 현재

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)