シェル内のすべてのbtrfsファイルシステムとサブボリュームをリストする


11

Cに頼らずに、つまりPOSIXシェルで、すべてのbtrfsファイルシステムのサブボリュームに関する情報を取得する便利な方法はありますか?

/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/btrfsDebian / Ubuntu(4.14.0-1 / 4.10.0-42)でテストされたすべてのbtrfsファイルシステム(例:マウントされていないもの)をリストしていません。
私はそれらを検索するためにbtrfs progsを使用します:

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.