Listar todos os sistemas de arquivos e subvolumes btrfs no shell

10

Existe uma maneira conveniente de obter informações sobre todos os btrfs sistemas de arquivos subvolumes sem recorrer a C, ou seja, em shell POSIX ?

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

Isto é com um kernel 3.16.x e btrfs-progs v3.14.1 (no Ubuntu 14.10).

Abaixo está o script (feio) que estou usando atualmente. Eu sei que eu poderia obter a informação que eu preciso usando puro C, e isso é provavelmente o que eu vou acabar fazendo, mas eu queria saber 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
    
por mssch 31.03.2015 / 18:24

1 resposta

1

/sys/fs/btrfs não lista todo o sistema de arquivos btrfs (por exemplo, não montado), testado no Debian / Ubuntu (4.14.0-1 / 4.10.0-42). Eu usaria o btrfs progs para pesquisá-los:

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

E como os progs do btrfs podem listar subvolumes apenas de fs montados, 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 em sistemas de arquivos de vários dispositivos (raid-0/1/10/5/6)

    
por 19.12.2017 / 15:29

Tags