列出 shell 中的所有 btrfs 文件系统和子卷

mss*_*sch 12 shell btrfs

有没有一种方便的方法来获取有关所有btrfs文件系统子卷的信息,而无需求助于 C,即在POSIX shell 中

/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
Run Code Online (Sandbox Code Playgroud)

bas*_*lab 6

/sys/fs/btrfs未列出在 Debian / Ubuntu (4.14.0-1 / 4.10.0-42) 上测试的所有 btrfs 文件系统(例如未安装的文件系统)。
我会使用 btrfs progs 来搜索它们:

btrfs filesystem show | awk '/ path /{print $NF}'
Run Code Online (Sandbox Code Playgroud)

由于 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
Run Code Online (Sandbox Code Playgroud)

未针对多设备文件系统进行测试 (raid-0/1/10/5/6)