แสดงรายการระบบไฟล์ btrfs ทั้งหมดและไดรฟ์ย่อยในเชลล์


11

มีวิธีที่สะดวกที่จะได้รับข้อมูลเกี่ยวกับทุกbtrfs filesystems subvolumesโดยไม่ต้อง resorting C คือในPOSIX เปลือก ?

/sys/fs/btrfsมีข้อมูลเกี่ยวกับระบบไฟล์เท่านั้นไม่มีอะไรในไดรฟ์ย่อยดังนั้นขณะนี้ฉันสิ้นสุดการติดตั้งระบบไฟล์ทั้งหมดในโฟลเดอร์ temp สแกนพวกเขาด้วย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

คุณจบลงด้วยการเขียนโปรแกรม 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 progs สามารถแสดงรายการไดรฟ์ย่อยเท่านั้นที่ติดตั้ง 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)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.