Listen Sie alle btrfs-Dateisysteme und Subvolumes in der Shell auf

11

Gibt es eine bequeme Möglichkeit, Informationen zu allen Subvolumes von btrfs- Dateisystemen abzurufen, ohne auf C zurückzugreifen, dh in der POSIX-Shell ?

/sys/fs/btrfsEnthält nur Informationen zu Dateisystemen, nichts zu Subvolumes. Daher mounte ich derzeit alle Dateisysteme in einem temporären Ordner, scanne sie mit btrfs subvol listund analysiere dann die resultierende Ausgabe. Das ist natürlich ziemlich hässlich.

Dies ist mit einem 3.16.x Kernel und btrfs-progs v3.14.1 (ab Lager Ubuntu 14.10).

Unten ist das (hässliche) Skript, das ich gerade benutze. Ich weiß, dass ich die Informationen, die ich brauche, mit reinem C erhalten könnte, und das werde ich wahrscheinlich am Ende tun, aber ich habe mich gefragt, ob es einen einfacheren und eleganteren Weg gibt.

#!/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
quelle
Haben Sie dafür ein C-Programm geschrieben? Ich bin sicher, andere Leute würden es nützlich finden, wenn Sie bereit sind zu teilen.
Etskinner

Antworten:

2

/sys/fs/btrfslistet nicht alle btrfs-Dateisysteme auf (z. B. keine gemounteten), die unter Debian / Ubuntu (4.14.0-1 / 4.10.0-42) getestet wurden.
Ich würde btrfs progs verwenden, um sie zu durchsuchen:

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

Und da btrfs progs nur Subvolumes von gemounteten fs auflisten können, ist Ihr Skript nicht weit von dem entfernt, was ich verwenden würde:

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

Nicht gegen Dateisystem mit mehreren Geräten getestet (RAID-0 / 1/10/5/6)

Baselab
quelle