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

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

すべての情報を便利に入手する方法はありますか?BTFSファイルシステムサブボリューム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

ベストアンサー1

/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)

おすすめ記事