宝塔面板不支持磁盘配额,需手动配置linux原生quota:确认ext4/xfs文件系统→挂载时添加usrquota参数→用quotacheck初始化aquota.user→edquota设www用户硬限制→计划任务监控告警。

宝塔面板本身不提供磁盘配额(quota)功能,想防写满必须绕过面板,直接用 Linux 原生 quota 工具 + 计划任务做主动拦截。这不是“点几下就能开”的功能,而是要手动启用、挂载参数、初始化数据库、分配配额,且只对 ext4/xfs 有效。
确认文件系统是否支持 quota
运行 df -T / 或 df -T /www,看 Type 列是不是 ext4 或 xfs。如果是 overlay、tmpfs、btrfs 或云盘常见 virtio_blk(未格式化为 ext4/xfs),quota 直接不可用。很多轻量云服务器默认用 overlayfs 启动,这种情况下配额方案从第一步就失败,别往下试了。
若确认是 ext4:检查当前挂载是否带 usrquota 和/或 grpquota 参数,运行 mount | grep " $(df . | tail -1 | awk '{print $1}') ",输出里没看到 usrquota 就得改 /etc/fstab 并重挂载。
启用并初始化 quota 数据库
配额不是开个开关就行,它依赖两个二进制数据库文件:aquota.user 和 aquota.group,必须在目标分区根目录下生成,且需 root 权限运行初始化命令。
- 对
/www分区启用用户配额:先确保已按上一步加好usrquota挂载参数,再运行quotacheck -cuv /www(-c创建新数据库,-u用户级,-v显示过程) - 若提示
quotacheck: Cannot stat() mounted device /dev/vda1: No such file or directory,说明/dev/vda1没在/proc/mounts里正确映射 —— 这常见于某些 OpenVZ 或容器环境,quota本质不可用 - 初始化成功后,
/www/aquota.user文件会自动出现,权限应为600,属主root;若手动创建或复制,quota会拒绝加载
给宝塔相关用户设硬限制(hard limit)
宝塔网站运行实际用的是 www 用户(Nginx)或各 PHP-FPM 池定义的用户(如 www、www-data、或站点独立用户)。不能只设 root 或面板用户,那毫无意义。
用 edquota -u www 编辑该用户的配额:
- 第一列
blocks是磁盘空间(KB),第二列inodes是文件数;设硬限制(hards)才真正阻断写入,软限制(softs)只告警 - 例如限制
www用户最多用 5GB 空间:blocks行的 hard 列填5242880(5×1024×1024) - 保存退出后立即生效,无需重启服务;但已有超出配额的文件不会被删,只是新写入会报
Disk quota exceeded - 验证是否生效:切到
www用户(sudo -u www bash),执行dd if=/dev/zero of=/www/testfile bs=1M count=1024,超限时会失败
用计划任务定期检查配额状态并告警
配额开了 ≠ 万事大吉。Linux 不主动通知谁快超了,得靠脚本+计划任务兜底。
在宝塔【计划任务】中添加一个每天执行的 Shell 脚本:
#!/bin/bash
# 检查 /www 下 www 用户配额使用率
USAGE=$(quota -u www | awk 'NR==3 {print $3}') 2>/dev/null
LIMIT=$(quota -u www | awk 'NR==3 {print $4}') 2>/dev/null
if [ -n "$USAGE" ] && [ -n "$LIMIT" ] && [ "$LIMIT" != "0" ]; then
PERCENT=$((USAGE * 100 / LIMIT))
if [ $PERCENT -gt 85 ]; then
echo "$(date): /www quota usage ${PERCENT}% for user www" | mail -s "ALERT: Quota near limit" admin@yourdomain.com
fi
fi
注意点:
-
quota -u www输出格式依赖 locale,中文系统可能字段偏移,建议先手动跑一次确认NR==3是否真对应 usage/limit 行 - 邮件发送需提前配置好系统
mail命令(如安装ssmtp或mailutils),否则日志里只有 “send-mail: not found” - 别依赖宝塔自带的“日志清理工具”来替代配额 —— 它只删旧文件,不拦新写入;而配额是在内核层掐断 write() 系统调用,更底层也更可靠
真正容易被忽略的是:配额只管“谁写的”,不管“写哪”。如果 PHP 程序用 shell_exec('touch /tmp/xxx') 绕过 /www 写临时文件,配额完全无效。所以必须配合 open_basedir 和严格目录权限做双重约束。











