Daftar semua filesystem btrfs dan subvolume di shell

11

Apakah ada cara mudah untuk mendapatkan informasi tentang semua subvolume sistem file btrfs tanpa menggunakan C, yaitu dalam shell POSIX ?

/sys/fs/btrfshanya berisi info tentang filesystem, tidak ada pada subvolume, jadi saat ini saya akhirnya memasang semua filesystem di folder temp, memindai dengan btrfs subvol list, lalu menguraikan output yang dihasilkan. Tak perlu dikatakan, itu cukup jelek.

Ini dengan kernel 3.16.x dan btrfs-progs v3.14.1 (dari stok Ubuntu 14.10).

Di bawah ini adalah skrip (jelek) yang saya gunakan saat ini. Saya tahu saya bisa mendapatkan info yang saya butuhkan menggunakan C murni, dan mungkin itulah yang akhirnya saya lakukan, tetapi saya bertanya-tanya apakah ada cara yang lebih sederhana, lebih elegan.

#!/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
sumber
Apakah Anda akhirnya menulis program C untuk ini? Saya yakin orang lain akan merasakan manfaatnya jika Anda bersedia berbagi.
etskinner

Jawaban:

2

/sys/fs/btrfstidak mencantumkan semua sistem file btrfs (mis. tidak dipasang satu), diuji pada Debian / Ubuntu (4.14.0-1 / 4.10.0-42).
Saya akan menggunakan prog btrfs untuk mencari mereka:

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

Dan karena prog btrfs dapat mendaftar hanya subvolume dari fs yang dipasang, skrip Anda tidak jauh dari apa yang akan saya gunakan:

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

Tidak diuji terhadap sistem file multi-perangkat (raid-0/1/10/5/6)

baselab
sumber