शेल में सभी btrfs फाइल सिस्टम और सबवोल्यूम्स को सूचीबद्ध करें


11

क्या POSIX शेल में C का सहारा लिए बिना सभी btrfs filesystems सबवॉल्म्स पर जानकारी प्राप्त करने का एक सुविधाजनक तरीका है ?

/sys/fs/btrfsइसमें केवल फाइलसिस्टम पर जानकारी होती है, सबवोल्यूम पर कुछ भी नहीं होता है, इसलिए वर्तमान में मैं सभी फाइल सिस्टम को एक अस्थायी फ़ोल्डर में माउंट कर रहा हूं, उन्हें स्कैन कर रहा हूं btrfs subvol list, फिर परिणामी आउटपुट को पार्स कर रहा हूं । कहने की जरूरत नहीं है, कि काफी बदसूरत है।

यह 3.16.x कर्नेल और btrfs-progs v3.14.1 (स्टॉक उबंटू 14.10 से) के साथ है।

नीचे (बदसूरत) स्क्रिप्ट है जो मैं वर्तमान में उपयोग कर रहा हूं। मुझे पता है कि मुझे वह जानकारी मिल सकती है जिसकी मुझे शुद्ध सी का उपयोग करने की आवश्यकता है, और शायद यही वह है जिसे मैं समाप्त करूंगा, लेकिन मैं सोच रहा था कि क्या कोई सरल, अधिक सुरुचिपूर्ण तरीका था।

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

क्या आपने इसके लिए C प्रोग्राम लिखना समाप्त किया? मुझे यकीन है कि यदि आप साझा करने के इच्छुक हैं तो अन्य लोग इसे उपयोगी पाएंगे।
एटकिनर

जवाबों:


2

/sys/fs/btrfsडेब्रियन / उबंटू (4.14.0-1 / 4.10.0-42) पर परीक्षण किए गए सभी btrfs फाइलसिस्टम (उदाहरण के लिए माउंटेड एक) को सूचीबद्ध नहीं करता है।
मैं उन्हें खोजने के लिए btrfs progs का उपयोग करूंगा:

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

मल्टी-डिवाइस फाइल सिस्टम के खिलाफ परीक्षण नहीं किया गया (छापे -० / १ / १० / ५ / ६)

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.