Liste tous les systèmes de fichiers et sous-volumes btrfs dans le shell

11

Existe-t-il un moyen pratique d'obtenir des informations sur tous les sous-volumes des systèmes de fichiers btrfs sans recourir au C, c'est-à-dire dans le shell POSIX ?

/sys/fs/btrfscontient des informations uniquement sur les systèmes de fichiers, rien sur les sous-volumes, donc actuellement je finis par monter tous les systèmes de fichiers dans un dossier temporaire, en les analysant avec btrfs subvol list, puis en analysant la sortie résultante. Inutile de dire que c'est assez moche.

C'est avec un noyau 3.16.x et btrfs-progs v3.14.1 (du stock Ubuntu 14.10).

Voici le script (moche) que j'utilise actuellement. Je sais que je pourrais obtenir les informations dont j'ai besoin en utilisant du C pur, et c'est probablement ce que je finirai par faire, mais je me demandais s'il y avait une manière plus simple et plus élégante.

#!/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
la source
Avez-vous fini par écrire un programme C pour cela? Je suis sûr que d'autres personnes le trouveraient utile si vous êtes prêt à partager.
etskinner

Réponses:

2

/sys/fs/btrfsne répertorie pas tous les systèmes de fichiers btrfs (par exemple non montés), testés sur Debian / Ubuntu (4.14.0-1 / 4.10.0-42).
J'utiliserais les progs btrfs pour les rechercher:

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

Et comme les progs btrfs ne peuvent lister que les sous-volumes de fs montés, votre script n'est pas loin de ce que j'utiliserais:

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

Non testé contre le système de fichiers multi-périphérique (raid-0/1/10/5/6)

baselab
la source