Linux命令-quotacheck(检查磁盘配额数据库)
Linux命令-quotacheck(检查磁盘配额数据库)
- 快速参考
- 命令语法
- 常用选项
- 工作原理
- 实战示例
- 1. 首次启用配额
- 2. 定期维护检查
- 3. 大型文件系统的检查策略
- 4. 故障恢复
- 5. XFS 配额检查(特殊)
- 6. 自动化配额检查
- 发行版差异
- 相关命令
- 总结
快速参考
quotacheck是 Linux 磁盘配额管理的关键工具,用于扫描文件系统并构建/修复配额数据库文件(aquota.user和aquota.group)。它在首次启用配额之前运行以初始化数据库,也在系统崩溃后运行以修复不一致的配额数据。简单来说,quotacheck回答的是"文件系统上每个用户当前实际用了多少空间"这个问题。
配额数据库就像一本"账本",
quotacheck就是"对账"的过程。系统崩了?配额数据乱了?运行quotacheck重新盘点一遍,确保配额限制是基于真实的存储使用情况。
命令语法
quotacheck [选项] 文件系统...常用选项
| 选项 | 功能 |
|---|---|
-c | 创建新的配额文件(覆盖旧的) |
-v | 详细输出(显示扫描过程) |
-u | 检查用户配额 |
-g | 检查组配额 |
-a | 检查所有挂载的文件系统(需有配额选项) |
-m | 不重新挂载为只读(在已挂载时强制检查) |
-f | 强制检查(即使配额已经启用) |
-R | 排除根文件系统 |
-M | 不创建新的配额文件(只报告情况) |
-n | 不扫描文件系统(使用缓存/内核数据) |
-i | 交互模式(询问确认) |
-d | 调试模式 |
-F | 指定配额格式(vfsold/vfsv0/vfsv1/rpc/xfs) |
工作原理
quotacheck 的扫描过程: 1. 遍历文件系统的每个 inode 2. 记录每个文件/目录的所有者(UID)和所属组(GID) 3. 汇总每个用户的:"总块数" 和 "总文件数" 4. 写入配额文件(aquota.user / aquota.group) 5. 更新内核配额子系统 ⚠️ 对于大型文件系统(TB 级),这个过程可能需要很长时间!实战示例
1. 首次启用配额
# 步骤1:准备 /etc/fstab(添加 usrquota,grpquota)$cat/etc/fstab|grepsda1UUID=abc123 / ext4 defaults,usrquota,grpquota01# 步骤2:重新挂载文件系统$sudomount-oremount /# 步骤3:验证挂载选项$mount|grep' / '/dev/sda1 on /typeext4(rw,relatime,usrquota,grpquota)# 步骤4:创建配额数据库文件(-c 创建,-u 用户,-g 组,-v 详细)$sudoquotacheck-cugv/ quotacheck: Scanning /dev/sda1[/]donequotacheck: Cannotstatold userquotafile/aquota.user: No suchfileor directory quotacheck: Cannotstatold groupquotafile/aquota.group: No suchfileor directory quotacheck: Checked15342directories and128567files quotacheck: Oldfilenot found. quotacheck: Oldfilenot found.# 步骤5:验证创建的配额文件$ls-l/aquota.* -rw-------1root root16384Jun1410:00 /aquota.group -rw-------1root root16384Jun1410:00 /aquota.user# 文件权限必须为 600(仅 root 可读写)$sudochmod600/aquota.user /aquota.group2. 定期维护检查
# 日常检查(不创建新文件,只更新)$sudoquotacheck-vug/ quotacheck: Scanning /dev/sda1[/]donequotacheck: Checked15350directories and128600files# 强制检查(即使配额已启用)$sudoquotacheck-f-vug/# 检查所有启用配额的文件系统$sudoquotacheck-avug# 调试模式(看更详细的输出)$sudoquotacheck-d-vug/# 检查时强制卸载文件系统(更安全但需停机)$sudoquotacheck-cugv/home# 仅报告不修改(-M)$sudoquotacheck-Mvug/# 会显示每个用户的用量,但不更新配额文件3. 大型文件系统的检查策略
# 对于大型文件系统(>1TB),quotacheck 可能运行数小时# 优化策略:# 1. 在系统启动时自动运行(在 /etc/rc.local 或 systemd 服务中)$cat>/etc/systemd/system/quotacheck.service<<'EOF' [Unit] Description=Filesystem Quota Check Before=quotaon.service ConditionPathExists=/aquota.user [Service] Type=oneshot ExecStart=/sbin/quotacheck -avug RemainAfterExit=yes [Install] WantedBy=multi-user.target EOF# 2. 挂载为只读后检查(避免数据变化)$sudomount-oremount,ro /data $sudoquotacheck-cugv/data $sudomount-oremount,rw /data# 3. 后台执行(nohup)$sudonohupquotacheck-avug>/tmp/quotacheck.log2>&1&# 4. 监控进度(通过查看日志)$tail-f/tmp/quotacheck.log# 5. 多个文件系统并行检查$sudoquotacheck-vug/home&$sudoquotacheck-vug/data&wait4. 故障恢复
# 场景1:系统崩溃后配额数据不一致# 修复流程:$sudoquotaoff-a# 先关闭配额$sudoquotacheck-cugv/# 重建配额数据库$sudoquotaon-a# 重新启用配额# 场景2:配额文件损坏$ls-l/aquota.user -rw-------1root root0Jun1410:00 /aquota.user# 文件大小 0!说明已损坏$sudoquotaoff /# 关闭配额$sudorm/aquota.user /aquota.group $sudoquotacheck-cugv/# 重新创建$sudoquotaon /# 场景3:显示 "Cannot get exact used space"# quotacheck 扫描时文件系统正在被写入# 解决方案:用 -m 选项(不重新挂载,但结果可能略有误差)$sudoquotacheck-m-vug/# 场景4:quota 命令报 "No quota format detected"# 重新创建配额文件$sudoquotaoff-a$sudoquotacheck-cugv/ $sudoquotaon-a5. XFS 配额检查(特殊)
# XFS 文件系统使用不同的配额机制# 配额数据存储在文件系统元数据中,不需要独立的 quota 文件# XFS 挂载选项$cat/etc/fstab|grepxfsUUID=xyz789 /data xfs defaults,uquota,gquota00# ^^^^^^ XFS 专属选项(不是 usrquota)# XFS 的 quotacheck 不需要 "-c" 创建文件# 只需挂载时指定配额选项$sudomount-ouquota,gquota /dev/sdb1 /data $sudoxfs_quota-x-c'report -u'/data# XFS 配额检查(检查自动进行,无需手动 quotacheck)$sudoxfs_quota-x-c'check'/data# XFS 会在挂载时自动检查配额一致性# 对比:# ext4: quotacheck -cugv 创建 aquota.user/aquota.group# XFS: 配额是文件系统的一部分,挂载时 uquota/gquota 自动激活6. 自动化配额检查
# 创建配额维护脚本$cat>/usr/local/sbin/quota_maintenance.sh<<'SCRIPT' #!/bin/bash set -e FS_LIST="/ /home /data" LOG="/var/log/quota_check.log" echo "=== $(date) ===" >> "$LOG" for fs in $FS_LIST; do if mount | grep -q "on $fs "; then has_quota=$(mount | grep "on $fs " | grep -oE '(usrquota|uquota|grpquota|gquota)') if [ -n "$has_quota" ]; then echo "Checking: $fs" >> "$LOG" quotacheck -avug "$fs" >> "$LOG" 2>&1 || { echo "ERROR: quotacheck failed on $fs" >> "$LOG" } else echo "Skip: $fs (no quota enabled)" >> "$LOG" fi else echo "Skip: $fs (not mounted)" >> "$LOG" fi done echo "Done." >> "$LOG" SCRIPT$sudochmod+x /usr/local/sbin/quota_maintenance.sh# 添加 cron 任务(每月 1 号 凌晨 2 点)$echo"0 2 1 * * root /usr/local/sbin/quota_maintenance.sh"|sudotee/etc/cron.d/quota-check发行版差异
| 文件系统 | 配额工具 | 配额文件位置 |
|---|---|---|
| ext2/3/4 | quota-tools | /aquota.user,/aquota.group |
| XFS | xfs_quota | 内部(元数据) |
| Btrfs | btrfs qgroup | 内部(元数据) |
| ZFS | zfs userspace | 内部(数据集属性) |
# 查看文件系统类型$df-T/ Filesystem Type 1K-blocks Used Available Use% Mounted on /dev/sda1 ext450858880305149122034396860% /相关命令
| 命令 | 功能 |
|---|---|
quotacheck | 创建/检查配额数据库 |
quotaon | 启用配额 |
quotaoff | 禁用配额 |
repquota | 报告配额使用 |
edquota | 编辑配额限制 |
setquota | 设置配额限制 |
xfs_quota | XFS 配额管理 |
总结
quotacheck是配额系统的"对账员":
-cugv:创建新的配额数据库(首次使用)-avug:检查所有文件系统-f:强制检查(配额已启用时)-m:不重新挂载(在线检查,结果可能不精确)
记住这个黄金流程:
sudoquotaoff-a# 关闭所有配额sudoquotacheck-cugv/# 重建配额数据库sudoquotaon-a# 重新启用配额XFS 用户注意:XFS 不需要
aquota.user文件,配额是文件系统的原生功能。用xfs_quota而不是quotacheck。
