repquota 命令用于报告磁盘配额的使用情况,显示用户和组的配额限制、实际使用量以及超出限制的情况。它是Linux磁盘配额管理系统中用于监控和报告的重要工具。
repquota 可以帮助系统管理员快速了解磁盘配额的使用情况,及时发现潜在的问题,并合理规划磁盘空间。
repquota [选项] 文件系统...
repquota [选项] -a
文件系统可以是设备名(如 /dev/sda1)或挂载点(如 /home)。
| 选项 | 说明 |
|---|---|
| -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 | 宽限时间剩余(超出软限制后) |
# 报告/home分区的用户配额
sudo repquota /home
# 报告指定设备的配额
sudo repquota /dev/sdb1
# 报告所有启用了配额的文件系统
sudo repquota -a
# 报告所有文件系统并显示人类可读的大小
sudo repquota -as
# 报告所有文件系统的组配额
sudo repquota -ag
# 以人类可读格式显示配额
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
# 只显示超出配额的条目
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
#!/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 "$@"
#!/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/"
#!/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"
#!/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
原因:文件系统未启用配额或配额文件不存在。
解决方案:
mount | grep "/home"
# 应该显示包含usrquota或grpquota选项
ls -la /home/aquota.user /home/aquota.group
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
quotacheck 来更新xfs_quota -c "report" 而不是 repquota-s 选项时会转换为人类可读格式