quotacheck 命令用于扫描文件系统的磁盘使用情况,并创建、检查和修复配额文件。它是Linux磁盘配额管理系统的重要组成部分,用于初始化配额文件或更新现有配额信息。
quotacheck 通常在首次启用配额或需要更新配额信息时使用。
quotacheck [选项] 文件系统...
quotacheck [选项] -a
文件系统可以是设备名(如 /dev/sda1)或挂载点(如 /home)。
| 选项 | 说明 |
|---|---|
| -a, --all | 扫描 /etc/fstab 中所有启用了配额的文件系统 |
| -c, --create-files | 创建新的配额文件(即使已存在也会覆盖) |
| -u, --user | 检查用户配额(默认) |
| -g, --group | 检查组配额 |
| -m, --no-remount | 不尝试以读写方式重新挂载文件系统 |
| -v, --verbose | 显示详细执行过程 |
| -f, --force | 强制检查,即使配额文件看起来已是最新 |
| -F 格式 | 指定配额格式:vfsold(旧版)、vfsv0、vfsv1 |
| -b, --backup | 在修改前备份配额文件 |
| -d, --debug | 启用调试模式 |
| -R, --exclude-root | 与 -a 一起使用时排除根文件系统 |
| --help | 显示帮助信息 |
| --version | 显示版本信息 |
# 为/home分区创建用户配额文件
sudo quotacheck -cuv /home
# 同时创建用户和组配额文件
sudo quotacheck -cuvg /home
选项说明:
-c:创建新的配额文件-u:处理用户配额-g:处理组配额-v:显示详细信息# 扫描/home分区,更新配额信息
sudo quotacheck -uv /home
# 扫描并更新所有启用了配额的文件系统
sudo quotacheck -avug
# 先为文件系统创建配额文件
sudo quotacheck -cuv /home
# 设置用户配额
sudo edquota username
# 启用配额
sudo quotaon /home
# 检查用户配额使用情况
sudo quotacheck -uv /home
# 使用vfsv1格式创建配额文件(推荐用于较新系统)
sudo quotacheck -cuv -F vfsv1 /home
# 查看支持的配额格式
sudo quotacheck --help | grep -A5 "quota format"
#!/bin/bash
# 完整的磁盘配额设置流程
# 1. 检查内核是否支持配额
echo "1. 检查内核配额支持..."
grep -i quota /boot/config-$(uname -r)
# 2. 安装配额工具(如果未安装)
echo "2. 安装配额工具..."
# Ubuntu/Debian
# sudo apt install quota
# CentOS/RHEL
# sudo yum install quota
# 3. 在/etc/fstab中启用配额
echo "3. 配置/etc/fstab..."
echo "示例:"
echo "/dev/sdb1 /home ext4 defaults,usrquota,grpquota 0 2"
# 4. 重新挂载文件系统
echo "4. 重新挂载文件系统..."
sudo mount -o remount /home
# 5. 创建配额文件
echo "5. 创建配额文件..."
sudo quotacheck -cuvg /home
# 6. 启用配额
echo "6. 启用配额..."
sudo quotaon -v /home
# 7. 设置用户配额
echo "7. 设置用户配额..."
# sudo edquota username
echo "配额设置完成!"
# 更新所有文件系统的配额信息
sudo quotacheck -avugm
# 强制更新所有配额文件系统
sudo quotacheck -avugf
# 排除根文件系统
sudo quotacheck -avugR
# 使用调试模式查看详细过程
sudo quotacheck -uvd /home
# 调试模式并创建新文件
sudo quotacheck -cuvd /home
# 备份配额文件
sudo quotacheck -buv /home
# 备份文件通常保存在:
# aquota.user.bak 和 aquota.group.bak
# 恢复配额文件(手动)
sudo cp /home/aquota.user.bak /home/aquota.user
sudo cp /home/aquota.group.bak /home/aquota.group
quotacheck 创建和维护以下文件:
| 文件名 | 格式 | 说明 |
|---|---|---|
| aquota.user | vfsv0/vfsv1 | 用户配额数据库文件 |
| aquota.group | vfsv0/vfsv1 | 组配额数据库文件 |
| quota.user | vfsold | 旧版用户配额文件(已过时) |
| quota.group | vfsold | 旧版组配额文件(已过时) |
原因:文件系统未在挂载时启用配额选项。
解决方案:
/etc/fstab 文件,在挂载选项中添加配额支持:
# 修改前
/dev/sdb1 /home ext4 defaults 0 2
# 修改后(添加usrquota和grpquota)
/dev/sdb1 /home ext4 defaults,usrquota,grpquota 0 2
sudo mount -o remount /home
sudo quotacheck -cuvg /home
原因:配额文件不存在,但文件系统已启用配额。
解决方案:创建配额文件:
# 创建配额文件
sudo quotacheck -cuvg /home
# 如果文件系统正在使用,使用-m选项
sudo quotacheck -cuvgm /home
解决方案:通过cron定时任务定期运行quotacheck:
# 编辑crontab
sudo crontab -e
# 添加以下行,每天凌晨3点更新配额信息
0 3 * * * /sbin/quotacheck -avug
# 或者每周日凌晨2点更新
0 2 * * 0 /sbin/quotacheck -avug
建议在系统负载较低时运行quotacheck,因为它可能需要扫描大量文件。
#!/bin/bash
# 自动配额检查和报告脚本
LOG_FILE="/var/log/quota_check.log"
MOUNT_POINT="/home"
log_message() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" >> "$LOG_FILE"
}
check_quota_files() {
local mount_point=$1
# 检查配额文件是否存在
if [ ! -f "$mount_point/aquota.user" ]; then
log_message "警告: $mount_point/aquota.user 不存在"
return 1
fi
if [ ! -f "$mount_point/aquota.group" ]; then
log_message "警告: $mount_point/aquota.group 不存在"
return 1
fi
return 0
}
main() {
log_message "开始配额检查"
# 检查挂载点
if ! mountpoint -q "$MOUNT_POINT"; then
log_message "错误: $MOUNT_POINT 未挂载"
exit 1
fi
# 检查配额文件
if ! check_quota_files "$MOUNT_POINT"; then
log_message "尝试创建配额文件..."
sudo quotacheck -cuvg "$MOUNT_POINT"
if [ $? -ne 0 ]; then
log_message "创建配额文件失败"
exit 2
fi
fi
# 更新配额信息
log_message "更新配额信息..."
sudo quotacheck -uvg "$MOUNT_POINT"
if [ $? -eq 0 ]; then
log_message "配额检查完成"
# 生成报告
echo "=== 配额使用报告 ==="
sudo repquota -a
else
log_message "配额检查失败"
exit 3
fi
}
main "$@"
#!/bin/bash
# 监控配额使用情况
# 配置
THRESHOLD=80 # 使用率阈值(百分比)
MOUNT_POINT="/home"
ALERT_EMAIL="admin@example.com"
# 获取配额信息
get_quota_info() {
sudo repquota "$MOUNT_POINT" | grep -E '^[a-z]' | while read line; do
user=$(echo $line | awk '{print $1}')
used=$(echo $line | awk '{print $3}')
soft=$(echo $line | awk '{print $4}')
if [ "$soft" != "0" ]; then
usage=$((used * 100 / soft))
if [ $usage -ge $THRESHOLD ]; then
echo "用户 $user 配额使用率: $usage% (已用: ${used}KB, 限制: ${soft}KB)"
fi
fi
done
}
# 发送警报
send_alert() {
local message=$1
echo "$message" | mail -s "配额使用警报" "$ALERT_EMAIL"
}
# 主程序
echo "检查配额使用情况..."
high_usage=$(get_quota_info)
if [ -n "$high_usage" ]; then
echo "发现高配额使用率:"
echo "$high_usage"
send_alert "$high_usage"
else
echo "所有用户配额使用正常"
fi
-m 选项可以避免quotacheck尝试重新挂载文件系统