Listar todos los sistemas de archivos btrfs y subvolúmenes en shell

11

¿Hay alguna manera conveniente de obtener información sobre todos los subvolúmenes de sistemas de archivos btrfs sin recurrir a C, es decir, en el shell POSIX ?

/sys/fs/btrfscontiene información solo sobre sistemas de archivos, nada sobre subvolúmenes, por lo que actualmente termino montando todos los sistemas de archivos en una carpeta temporal, escaneándolos btrfs subvol listy luego analizando la salida resultante. No hace falta decir que eso es bastante feo.

Esto es con un kernel 3.16.x y btrfs-progs v3.14.1 (del stock Ubuntu 14.10).

A continuación se muestra el script (feo) que estoy usando actualmente. Sé que podría obtener la información que necesito usando C puro, y eso es probablemente lo que terminaré haciendo, pero me preguntaba si había una manera más simple y 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
fuente
¿Terminaste escribiendo un programa en C para esto? Estoy seguro de que otras personas lo encontrarían útil si estás dispuesto a compartir.
etskinner

Respuestas:

2

/sys/fs/btrfsno enumera todos los sistemas de archivos btrfs (por ejemplo, uno no montado), probado en Debian / Ubuntu (4.14.0-1 / 4.10.0-42).
Usaría btrfs progs para buscarlos:

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

Y dado que los programas btrfs pueden enumerar subvolúmenes solo de fs montados, su script no está lejos de lo que usaría:

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

No probado contra el sistema de archivos de múltiples dispositivos (raid-0/1/10/5/6)

baselab
fuente