Listar todos os sistemas de arquivos e subvolumes btrfs no shell

11

Existe uma maneira conveniente de obter informações sobre todos os subvolumes do sistema de arquivos btrfs sem recorrer ao C, ou seja, no shell POSIX ?

/sys/fs/btrfscontém informações apenas em sistemas de arquivos, nada em subvolumes, então, atualmente, acabo montando todos os sistemas de arquivos em uma pasta temporária, digitalizando-os btrfs subvol liste analisando a saída resultante. Escusado será dizer que isso é bastante feio.

Isso ocorre com o kernel 3.16.x e o btrfs-progs v3.14.1 (do Ubuntu 14.10).

Abaixo está o script (feio) que estou usando atualmente. Sei que poderia obter as informações necessárias usando C puro, e provavelmente é isso que acabarei fazendo, mas estava pensando se havia uma maneira mais simples e elegante.

#!/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
fonte
Você acabou escrevendo um programa em C para isso? Tenho certeza de que outras pessoas achariam útil se você estiver disposto a compartilhar.
Etskinner #

Respostas:

2

/sys/fs/btrfsnão lista todos os sistemas de arquivos btrfs (por exemplo, não montados), testados no Debian / Ubuntu (4.14.0-1 / 4.10.0-42).
Eu usaria btrfs progs para procurá-los:

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

E como o btrfs progs pode listar subvolumes apenas do fs montado, seu script não está longe do que eu usaria:

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

Não testado no sistema de arquivos para vários dispositivos (raid-0/1/10/5/6)

baselab
fonte