AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 797219
Accepted
lickdragon
lickdragon
Asked: 2016-08-17 13:31:17 +0800 CST2016-08-17 13:31:17 +0800 CST 2016-08-17 13:31:17 +0800 CST

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

  • 772

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

这是我认为我知道的:

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

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

quota btrfs
  • 4 4 个回答
  • 7780 Views

4 个回答

  • Voted
  1. Best Answer
    uhrm
    2016-09-18T03:04:30+08:002016-09-18T03:04:30+08:00

    使用选项-r和-e:

    btrfs qgroup show -pcre /path
    
    • 5
  2. princessgentoo
    2019-07-15T13:55:17+08:002019-07-15T13:55:17+08:00

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

    ./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
    
    • 5
  3. Evi1M4chine
    2017-10-18T08:57:45+08:002017-10-18T08:57:45+08:00

    正如我们所说,btrfs 在这方面被设计破坏了。

    btrfs-progs 目前没有显示哪个子卷有哪个配额的功能。您必须编写一个脚本(许多喜欢 btrfs 的人都会这样做),解析它输出的抽象配额组编号,并在它们下面列出这些配额组内的子卷。可以添加它,但是 btrfs 开发人员虔诚地拒绝这样做。

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

    如果 zfs 不会有如此疯狂的 RAM 要求(每 TB 1GB ......在单板 ARM 计算机上不是一个选项)和数据丢失的风险,由于不及早写入数据,由于设计用于具有崩溃保护的服务器,我会建议倾销 btrfs以利于它。

    • 3
  4. keithpjolley
    2021-12-31T17:57:31+08:002021-12-31T17:57:31+08:00

    五年后,这仍然是一件事吗?我曾经在/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
    ...
    

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

    • 0

相关问题

  • ext3 Linux 分区的配额检查

  • Windows 2008 中挂载点的配额和文件筛选问题

  • vsftpd 中的配额?

  • 您如何限制公司中网络存储的使用?

  • 如何为文件夹上的用户激活配额?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve