Перечислите все файловые системы btrfs и их части в оболочке

11

Есть ли удобный способ получить информацию обо всех подсистемах файловых систем btrfs, не прибегая к C, то есть в оболочке POSIX ?

/sys/fs/btrfsсодержит информацию только о файловых системах, ничего о подобъемах, поэтому в настоящее время я монтирую все файловые системы во временную папку, сканирую их btrfs subvol listи затем анализирую полученный результат. Излишне говорить, что это довольно некрасиво.

Это с ядром 3.16.x и btrfs-progs v3.14.1 (из стандартной Ubuntu 14.10).

Ниже приведен (уродливый) скрипт, который я сейчас использую. Я знаю, что могу получить информацию, которая мне нужна, используя чистый C, и это, вероятно, то, чем я в конечном итоге буду заниматься, но мне было интересно, есть ли более простой и элегантный способ.

#!/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
источник
Вы в конечном итоге написали программу на C для этого? Я уверен, что другие люди сочтут это полезным, если вы захотите поделиться.
etskinner

Ответы:

2

/sys/fs/btrfsне перечисляет все файловые системы btrfs (например, не смонтированные), протестированные в Debian / Ubuntu (4.14.0-1 / 4.10.0-42).
Я бы использовал проги btrfs для их поиска:

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

А поскольку проги btrfs могут перечислять подобъемы только смонтированного fs, ваш сценарий находится недалеко от того, что я бы использовал:

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

Не тестируется на файловой системе с несколькими устройствами (raid-0/1/10/5/6)

baselab
источник