Linux quotacheck命令详解

quotacheck 命令用于扫描文件系统的磁盘使用情况,并创建、检查和修复配额文件。它是Linux磁盘配额管理系统的重要组成部分,用于初始化配额文件或更新现有配额信息。

quotacheck 通常在首次启用配额或需要更新配额信息时使用。

使用前提
  • 内核必须支持磁盘配额功能
  • 文件系统必须在挂载时启用配额选项
  • 通常需要root权限执行

语法格式

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 显示版本信息

使用示例

示例1:为文件系统创建初始配额文件

# 为/home分区创建用户配额文件
sudo quotacheck -cuv /home

# 同时创建用户和组配额文件
sudo quotacheck -cuvg /home

选项说明:

  • -c:创建新的配额文件
  • -u:处理用户配额
  • -g:处理组配额
  • -v:显示详细信息

示例2:扫描并更新配额信息

# 扫描/home分区,更新配额信息
sudo quotacheck -uv /home

# 扫描并更新所有启用了配额的文件系统
sudo quotacheck -avug

示例3:检查指定用户配额

# 先为文件系统创建配额文件
sudo quotacheck -cuv /home

# 设置用户配额
sudo edquota username

# 启用配额
sudo quotaon /home

# 检查用户配额使用情况
sudo quotacheck -uv /home

示例4:使用特定配额格式

# 使用vfsv1格式创建配额文件(推荐用于较新系统)
sudo quotacheck -cuv -F vfsv1 /home

# 查看支持的配额格式
sudo quotacheck --help | grep -A5 "quota format"

示例5:完整的配额设置流程

#!/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 "配额设置完成!"

示例6:批量处理所有配额文件系统

# 更新所有文件系统的配额信息
sudo quotacheck -avugm

# 强制更新所有配额文件系统
sudo quotacheck -avugf

# 排除根文件系统
sudo quotacheck -avugR

示例7:调试模式

# 使用调试模式查看详细过程
sudo quotacheck -uvd /home

# 调试模式并创建新文件
sudo quotacheck -cuvd /home

示例8:备份和恢复配额文件

# 备份配额文件
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 旧版组配额文件(已过时)

常见问题和解决方案

原因:文件系统未在挂载时启用配额选项。

解决方案:

  1. 编辑 /etc/fstab 文件,在挂载选项中添加配额支持:
    # 修改前
    /dev/sdb1  /home  ext4  defaults  0  2
    
    # 修改后(添加usrquota和grpquota)
    /dev/sdb1  /home  ext4  defaults,usrquota,grpquota  0  2
  2. 重新挂载文件系统:
    sudo mount -o remount /home
  3. 重新运行 quotacheck:
    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,因为它可能需要扫描大量文件。

在脚本中使用quotacheck

示例1:自动配额检查和报告

#!/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 "$@"

示例2:配额监控脚本

#!/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

注意事项

  • quotacheck 通常需要在文件系统未使用时运行,否则可能导致数据不一致
  • 运行 quotacheck 前,建议确保文件系统已启用配额选项(在/etc/fstab中配置)
  • 对于大型文件系统,quotacheck 可能需要较长时间完成扫描
  • 使用 -m 选项可以避免quotacheck尝试重新挂载文件系统
  • 生产环境中建议在系统负载较低时运行quotacheck
  • 配额文件必须位于文件系统根目录,且文件系统必须支持配额
  • XFS文件系统使用不同的配额工具(xfs_quota),而不是quotacheck
  • 定期运行 quotacheck 可以确保配额信息的准确性

相关命令

  • quotaon - 启用磁盘配额
  • quotaoff - 禁用磁盘配额
  • edquota - 编辑用户/组配额
  • repquota - 报告配额使用情况
  • quota - 显示用户配额限制和使用情况
  • xfs_quota - XFS文件系统的配额工具
  • mount - 挂载文件系统(可启用配额选项)