如何显示 btrfs 子卷的配额限制?

如何显示 btrfs 子卷的配额限制?

我无法确定如何获取当前在 btrfs 子卷上设置的配额限制。 btrfs wiki 上的配额似乎没有显示这一点。

我认为我知道的是:

  • 设定配额:btrfs qgroup limit 21G /path
  • 检查已用空间:btrfs qgroup show /path

但是如何检查已经设置的限制?

答案1

使用选项-r-e

btrfs qgroup show -pcre /path

答案2

我创建了一个简单的脚本,它将显示指定路径中每个子卷的配额限制以及已用空间。语法非常简单:

./quota.sh path

要打印所有子卷的已用空间,请使用 -a 标志:

./quota.sh path -a

不要忘记给脚本添加执行权限。

脚本:


#! /bin/sh
volumes=$(btrfs subvolume list  $1 | cut -d " " -f 9 )
snapshots=$(btrfs subvolume list -s  $1 | cut -d " " -f 14 )
regsnap=$(echo $snapshots | sed 's/ /,/g')
normalv=$(echo $volumes | sed "s/\($regsnap\)//g" )

if [ ! -z "$snapshots" ] ; then
    echo SNAPSHOTS
for p in $snapshots; do 
    quot=$(btrfs qgroup show -rF $1/$p | tail -1)
    if [ -z $2 ]; then
        (echo $quot | grep -q none) || echo $p $quot
    else
     [ "$2" == "-a" ] && echo $p $quot
    fi
done
fi

if [ ! -z "$normalv" ] ; then
    echo SUBVOLUMES
for p in $normalv; do 
    quot=$(btrfs qgroup show -rF $1/$p | tail -1)
    if [ -z $2 ]; then
        (echo $quot | grep -q none) || echo $p $quot
    else
     [ "$2" == "-a" ] && echo $p $quot
    fi
done

fi

它将首先打印传统子卷,然后打印快照卷。示例输出:

SNAPSHOTS
apple 0/258 1.32MiB 16.00KiB 20.00MiB
SUBVOLUMES
citrus/orange 0/256 1.32MiB 16.00KiB 20.00MiB

答案3

正如我们所说,btrfs 在这方面的设计是有缺陷的。

btrfs-progs 中目前没有功能可以显示哪个子卷具有哪个配额。您必须编写一个脚本(许多迷恋 btrfs 的人都这样做),来解析它输出的抽象配额组编号,并在其下方列出这些配额组中的子卷。可以添加它,但 btrfs 开发人员坚决拒绝这样做。

更糟糕,不仅无法显示子卷当前使用了多少配额。这就是为什么df只显示总可用空间。 这是不可能做到的根本这源于 btrfs 的核心设计。这是因为子卷的工作方式类似于快照。也就是说,要找出子卷中有多少数据,您必须扫描整个文件系统,找到链接到该子卷/快照的所有文件,然后将它们加起来。就像命令一样du。这需要很多时间。我完全不知道 btrfs 是如何知道配额已满的……IRC 频道无法为我提供任何答案。(他们忙于捍卫他们脆弱的过度膨胀的自尊心。)明智的做法是,每次添加或删除数据时更改子卷计数器。这肯定是 btrfs 知道它已满的方式。至少我不知道其他方法。但我不知道他们为什么会选择将这些可用信息保留为基本上是军事保守的国家机密……

如果 zfs 没有如此疯狂的 RAM 需求(每 TB 1GB……在单板 ARM 计算机上没有这种选择),并且由于没有及早写入数据而存在数据丢失的风险,因为它是为具有崩溃保护功能的服务器设计的,我建议放弃 btrfs对其有利。

答案4

五年过去了,这还是个问题?我过去常常在 下列出文件系统的配额/volume1。就我的需求而言,这是静态的,我计划在下游美化数据,因此这里的格式非常简单。

#!/bin/sh

if [ "$( id -u )" -ne 0 ]
then
    echo "ERROR: ${0}: must be run by root"
    exit 1
fi

echo "path  total   used"
for path in $( find /volume1 -maxdepth 1 -mindepth 1 -type d \! -name @\* | sort )
do
    btrfs qgroup show -pcref --raw "${path}" 2>/dev/null    \
    | sed 's#$# '"${path}"'#'
done    \
| awk 'BEGIN {OFS="\t"}
    /^[0-9]/ {print $NF,$2,$4}'

对我来说这会打印出来:

path    total   used
/volume1/prj_alpha  2529345417216   9853079650304
/volume1/prj_beta   28144091136 1099511627776
/volume1/prj_delta  2261620924416   3298534883328
/volume1/prj_epsilon    565468360704    1099511627776
/volume1/prj_gamma  37339127808 107374182400
...

我知道这可以变得更具可读性,但我将在后面的步骤中做到这一点,而不是在这里。为此,我只需要非常一致且易于解析的输出。

相关内容