Kabuktaki tüm btrfs dosya sistemlerini ve alt hacimlerini listele


11

Tüm btrfs dosya sistemleri alt birimleri hakkında C'ye başvurmadan, yani POSIX kabuğunda bilgi almanın uygun bir yolu var mı ?

/sys/fs/btrfsyalnızca dosya sistemlerinde bilgi içerir, alt hacimlerde hiçbir şey yoktur, bu yüzden şu anda tüm dosya sistemlerini geçici bir klasöre bağlayarak, bunları tararken btrfs subvol list, elde edilen çıktıyı ayrıştırır. Söylemeye gerek yok, bu oldukça çirkin.

Bu, 3.16.x çekirdeği ve btrfs-progs v3.14.1 (stok Ubuntu 14.10'dan ).

Aşağıda şu anda kullandığım (çirkin) komut dosyası var. Saf C kullanarak ihtiyacım olan bilgiyi alabileceğimi biliyorum ve muhtemelen bunu yapacağım, ama daha basit, daha zarif bir yol olup olmadığını merak ediyordum.

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

Bunun için bir C programı yazdınız mı? Eminim paylaşmaya istekli olursanız diğer insanlar bunu faydalı bulur.
etskinner

Yanıtlar:


2

/sys/fs/btrfsDebian / Ubuntu'da (4.14.0-1 / 4.10.0-42) test edilen tüm btrfs dosya sistemini (örneğin, monte edilmemiş olan) listelemez.
Onları aramak için btrfs progs kullanırım:

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

Ve btrfs progs sadece bağlı fs alt hacimlerini listeleyebildiğinden, komut dosyanız ne kullanacağımdan çok uzak değil:

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

Çok cihazlı dosya sistemine karşı test edilmedi (raid-0/1/10/5/6)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.