Список усіх файлових систем і підпунктів btrfs в оболонці


11

Є зручний спосіб отримати інформацію про всі Btrfs файлових систем , подоб'емах , не вдаючись до C, тобто в POSIX оболонці ?

/sys/fs/btrfsмістить інформацію лише про файлові системи, нічого про підпункти, тому зараз я закінчую встановлення всіх файлових систем у темп-папці, скануючи їх 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)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.