Linux repquota命令详解

repquota 命令用于报告磁盘配额的使用情况,显示用户和组的配额限制、实际使用量以及超出限制的情况。它是Linux磁盘配额管理系统中用于监控和报告的重要工具。

repquota 可以帮助系统管理员快速了解磁盘配额的使用情况,及时发现潜在的问题,并合理规划磁盘空间。

语法格式

repquota [选项] 文件系统...
repquota [选项] -a

文件系统可以是设备名(如 /dev/sda1)或挂载点(如 /home)。

功能说明

  • 配额报告:显示用户和组的磁盘配额使用情况
  • 详细统计:提供已用空间、软限制、硬限制、宽限时间等信息
  • 批量报告:支持同时报告多个文件系统的配额情况
  • 过滤输出:可以过滤只显示超出配额的用户或组
  • 多种格式:支持ASCII、HTML等多种输出格式

常用选项

选项 说明
-a, --all 报告 /etc/fstab 中所有启用了配额的文件系统
-u, --user 报告用户配额(默认)
-g, --group 报告组配额
-v, --verbose 显示详细的配额信息
-s, --human-readable 以人类可读的格式显示大小(K, M, G)
-t, --truncate-names 截断过长的用户名/组名
-n, --no-header 不显示表头信息
-o, --output 格式 指定输出格式:csv, html, xml
-F 格式 指定配额格式:vfsold、vfsv0、vfsv1
-h, --help 显示帮助信息
-V, --version 显示版本信息

输出字段说明

*** Report for user quotas on device /dev/sda1
Block grace time: 7days; Inode grace time: 7days
                        Block limits                File limits
User            used    soft    hard  grace    used    soft    hard  grace
-----------------------------------------------------------------------------
root      --   1024K   10240K  15360K           5       0       0
alice     +-   5120K   5120K   10240K  6days    50      100     200          3days
bob       -+   2048K   5120K   10240K           10      50      100   2days
charlie   ++   7680K   5120K   10240K  2days    150     100     200   1day
字段 说明
User/Group 用户名或组名
状态标志 --: 正常
+-: 超出块软限制
-+: 超出文件数软限制
++: 同时超出两者软限制
used 已使用的磁盘空间或文件数
soft 软限制(允许暂时超出的限制)
hard 硬限制(绝对不允许超出的限制)
grace 宽限时间剩余(超出软限制后)

使用示例

示例1:基本用法 - 报告文件系统配额

# 报告/home分区的用户配额
sudo repquota /home

# 报告指定设备的配额
sudo repquota /dev/sdb1

示例2:报告所有文件系统的配额

# 报告所有启用了配额的文件系统
sudo repquota -a

# 报告所有文件系统并显示人类可读的大小
sudo repquota -as

# 报告所有文件系统的组配额
sudo repquota -ag

示例3:人类可读格式输出

# 以人类可读格式显示配额
sudo repquota -s /home

# 详细模式+人类可读
sudo repquota -vs /home
*** Report for user quotas on device /dev/sda1
Block grace time: 7days; Inode grace time: 7days
                        Block limits                File limits
User            used    soft    hard  grace    used    soft    hard  grace
-----------------------------------------------------------------------------
root      --     1M      10M     15M           5       0       0
alice     +-     5M       5M     10M  6days    50      100     200          3days

示例4:过滤和格式化输出

# 只显示超出配额的条目
sudo repquota /home | grep -E "^[^ ]* [+-][+-]"

# 按使用量排序
sudo repquota /home | tail -n +4 | sort -k3 -nr

# 生成CSV格式报告
sudo repquota -o csv /home > quota_report.csv

# 生成HTML格式报告
sudo repquota -o html /home > quota_report.html

示例5:监控脚本 - 检查配额使用情况

#!/bin/bash
# 监控配额使用情况并发送警报

THRESHOLD=80  # 使用率阈值(百分比)
MOUNT_POINT="/home"
ALERT_EMAIL="admin@example.com"
LOG_FILE="/var/log/quota_monitor.log"

# 记录日志
log_message() {
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" >> "$LOG_FILE"
}

# 检查配额并发送警报
check_quotas() {
    log_message "开始检查配额使用情况"

    # 获取超出软限制的用户
    OVER_LIMIT=$(sudo repquota "$MOUNT_POINT" | grep -E "^[^ ]* [+-][+-]" | awk '{print $1}')

    if [ -n "$OVER_LIMIT" ]; then
        log_message "发现超出配额的账户: $OVER_LIMIT"

        # 发送邮件警报
        echo "以下用户已超出磁盘配额限制:" | mail -s "磁盘配额警报" "$ALERT_EMAIL"
        sudo repquota -s "$MOUNT_POINT" | mail -s "磁盘配额详情" "$ALERT_EMAIL"

        return 1
    else
        log_message "所有账户配额使用正常"
        return 0
    fi
}

# 检查高使用率
check_high_usage() {
    log_message "检查高使用率账户"

    # 检查使用率超过阈值的用户
    sudo repquota -s "$MOUNT_POINT" | tail -n +4 | while read line; do
        user=$(echo $line | awk '{print $1}')
        used=$(echo $line | awk '{print $2}' | sed 's/[^0-9.]//g')
        soft=$(echo $line | awk '{print $3}' | sed 's/[^0-9.]//g')

        if [ "$soft" != "0" ] && [ -n "$used" ] && [ -n "$soft" ]; then
            # 计算使用率
            if echo "$used" | grep -q "G"; then
                used_k=$(echo "$used" | sed 's/G//' | awk '{print $1 * 1024 * 1024}')
            elif echo "$used" | grep -q "M"; then
                used_k=$(echo "$used" | sed 's/M//' | awk '{print $1 * 1024}')
            else
                used_k=$(echo "$used" | sed 's/K//')
            fi

            if echo "$soft" | grep -q "G"; then
                soft_k=$(echo "$soft" | sed 's/G//' | awk '{print $1 * 1024 * 1024}')
            elif echo "$soft" | grep -q "M"; then
                soft_k=$(echo "$soft" | sed 's/M//' | awk '{print $1 * 1024}')
            else
                soft_k=$(echo "$soft" | sed 's/K//')
            fi

            if [ "$soft_k" -gt 0 ]; then
                usage=$((used_k * 100 / soft_k))
                if [ $usage -ge $THRESHOLD ]; then
                    log_message "用户 $user 配额使用率: $usage% (已用: $used, 限制: $soft)"
                fi
            fi
        fi
    done
}

# 主程序
main() {
    log_message "=== 配额监控开始 ==="

    if check_quotas; then
        echo "配额检查: 正常"
    else
        echo "配额检查: 发现超出限制的用户"
    fi

    check_high_usage

    log_message "=== 配额监控结束 ==="
    echo "监控完成,详情查看日志: $LOG_FILE"
}

main "$@"

示例6:定期生成配额报告

#!/bin/bash
# 定期生成配额报告

REPORT_DIR="/var/reports/quota"
DATE=$(date +%Y%m%d)

# 创建报告目录
mkdir -p "$REPORT_DIR"

# 生成文本报告
sudo repquota -as /home > "$REPORT_DIR/quota_report_${DATE}.txt"

# 生成HTML报告
echo "<html><head><title>磁盘配额报告 $DATE</title></head><body>" > "$REPORT_DIR/quota_report_${DATE}.html"
echo "<h1>磁盘配额报告</h1>" >> "$REPORT_DIR/quota_report_${DATE}.html"
echo "<h2>生成时间: $(date)</h2>" >> "$REPORT_DIR/quota_report_${DATE}.html"
echo "<pre>" >> "$REPORT_DIR/quota_report_${DATE}.html"
sudo repquota -as /home >> "$REPORT_DIR/quota_report_${DATE}.html"
echo "</pre></body></html>" >> "$REPORT_DIR/quota_report_${DATE}.html"

# 生成摘要报告
echo "=== 配额使用摘要 ===" > "$REPORT_DIR/quota_summary_${DATE}.txt"
echo "生成时间: $(date)" >> "$REPORT_DIR/quota_summary_${DATE}.txt"
echo "" >> "$REPORT_DIR/quota_summary_${DATE}.txt"
echo "超出配额的用户:" >> "$REPORT_DIR/quota_summary_${DATE}.txt"
sudo repquota /home | grep -E "^[^ ]* [+-][+-]" | awk '{print $1}' >> "$REPORT_DIR/quota_summary_${DATE}.txt"
echo "" >> "$REPORT_DIR/quota_summary_${DATE}.txt"
echo "使用率超过80%的用户:" >> "$REPORT_DIR/quota_summary_${DATE}.txt"
# 这里可以添加使用率计算逻辑

echo "报告已生成到: $REPORT_DIR/"

示例7:比较不同时间的配额使用

#!/bin/bash
# 比较配额使用变化

OLD_FILE="/var/reports/quota/quota_report_20231001.txt"
NEW_FILE="/var/reports/quota/quota_report_20231015.txt"
DIFF_FILE="/var/reports/quota/quota_diff.txt"

# 提取用户使用量
extract_usage() {
    grep -E "^[^ ]* +[-+][-+]?" "$1" | awk '{print $1, $2}' | sort
}

# 比较使用量
echo "=== 配额使用变化比较 ===" > "$DIFF_FILE"
echo "比较文件: $OLD_FILE 和 $NEW_FILE" >> "$DIFF_FILE"
echo "" >> "$DIFF_FILE"

# 使用join比较差异
join -a1 -a2 -o 0,1.2,2.2 -e "N/A" <(extract_usage "$OLD_FILE") <(extract_usage "$NEW_FILE") | while read user old_usage new_usage; do
    if [ "$old_usage" != "$new_usage" ] && [ "$old_usage" != "N/A" ] && [ "$new_usage" != "N/A" ]; then
        echo "用户 $user: $old_usage -> $new_usage" >> "$DIFF_FILE"
    fi
done

echo "比较完成,结果保存在: $DIFF_FILE"

示例8:集成到系统监控中

#!/bin/bash
# 系统监控脚本中的配额检查部分

# 检查配额状态
check_system_quota() {
    echo "=== 磁盘配额状态检查 ==="

    # 检查哪些文件系统启用了配额
    echo "启用了配额的文件系统:"
    mount | grep -E "(usrquota|grpquota)" | awk '{print $3}'

    echo ""
    echo "配额使用摘要:"

    # 检查每个文件系统的配额状态
    for mount_point in $(mount | grep -E "(usrquota|grpquota)" | awk '{print $3}'); do
        echo "文件系统: $mount_point"

        # 统计超出配额的用户数
        over_count=$(sudo repquota "$mount_point" 2>/dev/null | grep -c -E "^[^ ]* [+-][+-]")
        if [ $over_count -gt 0 ]; then
            echo "  警告: 有 $over_count 个用户超出配额"
        else
            echo "  正常: 所有用户均在配额限制内"
        fi

        # 统计总用户数
        user_count=$(sudo repquota "$mount_point" 2>/dev/null | tail -n +4 | wc -l)
        echo "  总监控用户数: $user_count"
    done

    echo ""
    echo "详细配额报告:"
    sudo repquota -as 2>/dev/null | head -20
}

# 将配额检查集成到系统健康检查中
system_health_check() {
    echo "系统健康检查 - $(date)"
    echo "=========================="

    # 检查磁盘空间
    echo "1. 磁盘空间检查:"
    df -h

    echo ""

    # 检查配额状态
    echo "2. 磁盘配额检查:"
    check_system_quota

    echo ""

    # 其他系统检查...
    # echo "3. 内存使用检查:"
    # free -h
}

system_health_check

常见问题和解决方案

原因:文件系统未启用配额或配额文件不存在。

解决方案:

  1. 检查文件系统是否启用了配额:
    mount | grep "/home"
    # 应该显示包含usrquota或grpquota选项
  2. 检查配额文件是否存在:
    ls -la /home/aquota.user /home/aquota.group
  3. 如果配额文件不存在,创建它们:
    sudo quotacheck -cuvg /home
    sudo quotaon /home

解决方案:使用grep和awk过滤输出:

# 只显示超出配额的用户
sudo repquota /home | grep -E "^[^ ]* [+-][+-]"

# 显示使用量最大的前10个用户
sudo repquota /home | tail -n +4 | sort -k3 -nr | head -10

# 显示使用率超过80%的用户
sudo repquota -s /home | tail -n +4 | while read line; do
    user=$(echo $line | awk '{print $1}')
    used=$(echo $line | awk '{print $2}')
    soft=$(echo $line | awk '{print $3}')
    # 计算使用率的脚本逻辑...
done

解决方案:使用cron定时任务自动化监控:

# 编辑crontab
sudo crontab -e

# 添加以下行,每天凌晨1点运行配额检查
0 1 * * * /usr/sbin/repquota -as /home > /var/log/quota_daily.log

# 每周一凌晨2点生成详细报告
0 2 * * 1 /usr/sbin/repquota -as -o html /home > /var/www/html/quota_report.html

# 每小时检查一次,发现超出配额时发送警报
0 * * * * /path/to/quota_alert_script.sh

创建一个监控脚本 quota_alert_script.sh

#!/bin/bash
# quota_alert_script.sh
OVER_USERS=$(sudo repquota /home | grep -E "^[^ ]* [+-][+-]" | awk '{print $1}')
if [ -n "$OVER_USERS" ]; then
    echo "以下用户超出磁盘配额:$OVER_USERS" | mail -s "磁盘配额警报" admin@example.com
fi

注意事项

  • repquota 需要root权限才能读取配额文件
  • 配额文件可能不是实时更新的,可能需要运行 quotacheck 来更新
  • XFS文件系统使用 xfs_quota -c "report" 而不是 repquota
  • repquota 的输出可能包含大量用户,建议使用过滤选项获取关键信息
  • 宽限时间(grace time)是超出软限制后允许的宽限期,超过后会禁止进一步写入
  • 软限制和硬限制的单位通常是KB,但使用 -s 选项时会转换为人类可读格式
  • 定期运行 repquota 可以帮助预测磁盘空间需求,提前进行容量规划
  • 在生产环境中,建议自动化配额监控和报告

相关命令