Liệt kê tất cả các hệ thống tập tin btrfs và subvolume trong shell


11

Có cách nào thuận tiện để lấy thông tin về tất cả các subvolume của hệ thống tập tin btrfs mà không cần dùng đến C, tức là trong vỏ POSIX không?

/sys/fs/btrfschỉ chứa thông tin trên các hệ thống tệp, không có gì trên các tệp con, vì vậy hiện tại tôi kết thúc việc gắn tất cả các hệ thống tệp trong thư mục tạm thời, quét chúng btrfs subvol list, sau đó phân tích kết quả đầu ra. Không cần phải nói, đó là khá xấu xí.

Đây là với kernel 3.16.xbtrfs-pross v3.14.1 (từ stock Ubuntu 14.10).

Dưới đây là tập lệnh (xấu) tôi hiện đang sử dụng. Tôi biết tôi có thể nhận được thông tin tôi cần bằng cách sử dụng C thuần túy và đó có lẽ là điều tôi sẽ làm, nhưng tôi tự hỏi liệu có cách nào đơn giản hơn, thanh lịch hơn không.

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

Bạn đã kết thúc việc viết một chương trình C cho việc này? Tôi chắc rằng những người khác sẽ thấy nó hữu ích nếu bạn sẵn sàng chia sẻ.
etskinner

Câu trả lời:


2

/sys/fs/btrfskhông liệt kê tất cả các hệ thống tập tin btrfs (ví dụ: không được gắn kết), được thử nghiệm trên Debian / Ubuntu (4.14.0-1 / 4.10.0-42).
Tôi sẽ sử dụng btrfs pross để tìm kiếm chúng:

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

Và vì các prog btrfs chỉ có thể liệt kê các subvolume của fs được gắn kết, tập lệnh của bạn không nằm xa những gì tôi sẽ sử dụng:

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

Không được kiểm tra đối với hệ thống tệp đa thiết bị (raid-0/1/10/5/6)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.