Wyświetla listę wszystkich systemów plików i podwoluminów btrfs w powłoce

11

Czy istnieje wygodny sposób na uzyskanie informacji o wszystkich podwoluminach systemów plików btrfs bez uciekania się do C, tj. W powłoce POSIX ?

/sys/fs/btrfszawiera informacje tylko o systemach plików, nic o podwoluminach, więc obecnie kończę montowanie wszystkich systemów plików w folderze tymczasowym, skanowanie ich btrfs subvol list, a następnie analizowanie wynikowego wyniku. Nie trzeba dodawać, że jest to dość brzydkie.

Dzieje się tak z jądrem 3.16.xi btrfs-progs v3.14.1 (z magazynu Ubuntu 14.10).

Poniżej znajduje się (brzydki) skrypt, którego aktualnie używam. Wiem, że mogę uzyskać informacje, których potrzebuję, używając czystego C, i prawdopodobnie tak właśnie skończę, ale zastanawiałem się, czy istnieje prostszy, bardziej elegancki sposób.

#!/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
mssch
źródło
Czy napisałeś do tego program C? Jestem pewien, że innym osobom przyda się, jeśli chcesz się podzielić.
etskinner

Odpowiedzi:

2

/sys/fs/btrfsnie wyświetla wszystkich systemów plików btrfs (np. niezainstalowanych), przetestowanych na Debianie / Ubuntu (4.14.0-1 / 4.10.0-42).
Używałbym progów btrfs do ich przeszukiwania:

btrfs filesystem show | awk '/ path /{print $NF}'

A ponieważ programy btrfs mogą wyświetlać podobjętości tylko zamontowanych plików fs, twój skrypt nie jest daleki od tego, czego bym użył:

#!/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

Nie testowano na systemie plików z wieloma urządzeniami (raid-0/1/10/5/6)

baselab
źródło