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


11

是否有一种便捷的方法来获取所有btrfs文件系统子卷上的信息而无需使用C,即在POSIX shell中

/sys/fs/btrfs仅包含有关文件系统的信息,不包含有关子卷的信息,因此当前我最终将所有文件系统装入temp文件夹,使用进行扫描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's

Answers:


2

/sys/fs/btrfs没有列出在Debian / Ubuntu(4.14.0-1 / 4.10.0-42)上测试的所有btrfs文件系统(例如未挂载的文件系统)。
我会使用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)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.