Elenca tutti i filesystem e i sottovolumi btrfs nella shell


11

C'è un modo conveniente per ottenere informazioni su tutti i sottovolumi dei filesystem btrfs senza ricorrere a C, cioè nella shell POSIX ?

/sys/fs/btrfscontiene informazioni solo sui filesystem, niente sui sottovolumi, quindi attualmente finisco per montare tutti i filesystem in una cartella temporanea, scansionandoli con btrfs subvol list, quindi analizzando l'output risultante. Inutile dire che è abbastanza brutto.

Questo è con un kernel 3.16.xe btrfs-progs v3.14.1 (dallo stock Ubuntu 14.10).

Di seguito è riportato lo (brutto) script che sto attualmente utilizzando. So che potrei ottenere le informazioni di cui ho bisogno usando la C pura, ed è probabilmente quello che finirò per fare, ma mi chiedevo se ci fosse un modo più semplice ed 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

Hai finito per scrivere un programma C per questo? Sono sicuro che altre persone lo troverebbero utile se sei disposto a condividere.
etskinner,

Risposte:


2

/sys/fs/btrfsnon elenca tutti i filesystem btrfs (es. non montato), testati su Debian / Ubuntu (4.14.0-1 / 4.10.0-42).
Vorrei usare i prog di btrfs per cercarli:

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

E poiché i prog di btrfs possono elencare solo sottovolumi di fs montati, il tuo script non è lontano da quello che vorrei usare:

#!/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 testato contro filesystem multi-dispositivo (raid-0/1/10/5/6)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.