本文目录导读:

在Linux系统中,通过Shell脚本设置用户磁盘配额主要涉及以下步骤:
基础环境准备
检查并安装配额工具
#!/bin/bash # 安装配额工具(CentOS/RHEL) yum install -y quota # 或Ubuntu/Debian apt-get install -y quota
检查内核支持
if [ -f /proc/config.gz ]; then
zcat /proc/config.gz | grep CONFIG_QUOTA
else
grep QUOTA /boot/config-$(uname -r)
fi
启用配额的文件系统
修改/etc/fstab
#!/bin/bash MOUNT_POINT="/home" # 在挂载选项中添加usrquota和grpquota sed -i "s|\($MOUNT_POINT.*defaults\)|\1,usrquota,grpquota|" /etc/fstab
重新挂载文件系统
mount -o remount $MOUNT_POINT
完整配额设置脚本
#!/bin/bash
# ===== 配置参数 =====
MOUNT_POINT="/home" # 配额应用的文件系统
USER_NAME="testuser" # 目标用户
SOFT_LIMIT="500M" # 软限制
HARD_LIMIT="600M" # 硬限制
INODE_SOFT="10000" # 文件数软限制
INODE_HARD="12000" # 文件数硬限制
GRACE_PERIOD="7" # 宽限期(天)
# ===== 颜色输出 =====
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m'
# ===== 函数定义 =====
log_info() {
echo -e "${GREEN}[INFO]${NC} $1"
}
log_warn() {
echo -e "${YELLOW}[WARN]${NC} $1"
}
log_error() {
echo -e "${RED}[ERROR]${NC} $1"
}
# 检查是否为root用户
check_root() {
if [ "$EUID" -ne 0 ]; then
log_error "请使用root用户运行此脚本"
exit 1
fi
}
# 检查配额是否已启用
check_quota_enabled() {
if mount | grep "$MOUNT_POINT" | grep -q "usrquota"; then
log_info "用户配额已启用"
return 0
else
log_warn "用户配额未启用,正在启用..."
return 1
fi
}
# 启用配额支持
enable_quota() {
# 备份fstab
cp /etc/fstab /etc/fstab.backup.$(date +%Y%m%d_%H%M%S)
# 添加配额选项
sed -i "s|\($MOUNT_POINT.*defaults\)|\1,usrquota,grpquota|" /etc/fstab
# 重新挂载
mount -o remount $MOUNT_POINT
# 创建配额数据库
quotacheck -cug $MOUNT_POINT
# 启用配额
quotaon -v $MOUNT_POINT
log_info "配额支持已启用"
}
# 设置用户配额
set_user_quota() {
local user=$1
local soft=$2
local hard=$3
local inode_soft=$4
local inode_hard=$5
# 检查用户是否存在
if ! id "$user" &>/dev/null; then
log_error "用户 $user 不存在"
return 1
fi
# 转换大小格式
convert_size() {
local size=$1
case $size in
*G|*g) echo $((${size%[Gg]} * 1024 * 1024)) ;;
*M|*m) echo $((${size%[Mm]} * 1024)) ;;
*K|*k) echo ${size%[Kk]} ;;
*) echo $size ;;
esac
}
soft_blocks=$(convert_size $soft)
hard_blocks=$(convert_size $hard)
# 设置磁盘配额
setquota -u $user $soft_blocks $hard_blocks $inode_soft $inode_hard $MOUNT_POINT
if [ $? -eq 0 ]; then
log_info "用户 $user 配额设置成功"
log_info " 磁盘限制: 软限制=$soft, 硬限制=$hard"
log_info " 文件限制: 软限制=$inode_soft, 硬限制=$inode_hard"
return 0
else
log_error "用户 $user 配额设置失败"
return 1
fi
}
# 设置宽限期
set_grace_period() {
local days=$1
# 设置宽限期(秒)
local seconds=$((days * 24 * 60 * 60))
setquota -t $seconds $seconds $MOUNT_POINT
if [ $? -eq 0 ]; then
log_info "宽限期设置为 $days 天"
return 0
else
log_error "宽限期设置失败"
return 1
fi
}
# 查看配额信息
show_quota_info() {
local user=$1
echo "=========================================="
echo "用户 $user 的磁盘配额信息"
echo "=========================================="
quota -u $user
echo ""
echo "详细报告:"
repquota -a | grep $user
}
# 批量设置用户配额
batch_set_quota() {
local user_file=$1
if [ ! -f "$user_file" ]; then
log_error "用户列表文件 $user_file 不存在"
return 1
fi
while IFS=',' read -r user soft hard inode_soft inode_hard; do
# 跳过注释和空行
[[ $user =~ ^#.*$ ]] && continue
[[ -z $user ]] && continue
set_user_quota "$user" "$soft" "$hard" "$inode_soft" "$inode_hard"
done < "$user_file"
}
# ===== 主函数 =====
main() {
check_root
echo "===== 磁盘配额设置脚本 ====="
# 检查并启用配额
if ! check_quota_enabled; then
enable_quota
fi
# 设置单个用户配额
echo ""
log_info "正在设置用户 $USER_NAME 的配额..."
set_user_quota "$USER_NAME" "$SOFT_LIMIT" "$HARD_LIMIT" "$INODE_SOFT" "$INODE_HARD"
# 设置宽限期
log_info "正在设置宽限期..."
set_grace_period "$GRACE_PERIOD"
# 显示配额信息
show_quota_info "$USER_NAME"
echo ""
log_info "配额设置完成"
}
# 执行主函数
main
其他实用脚本
检查配额使用情况
#!/bin/bash
# 配额监控脚本
THRESHOLD=80 # 使用率阈值百分比
echo "时间: $(date)"
echo "磁盘配额使用情况检查:"
repquota -a | while read line; do
# 检查用户配额使用率
if echo "$line" | grep -qE "^[a-z]"; then
user=$(echo "$line" | awk '{print $1}')
used=$(echo "$line" | awk '{print $3}')
soft=$(echo "$line" | awk '{print $4}')
if [ -n "$soft" ] && [ "$soft" != "0" ]; then
usage=$((used * 100 / soft))
if [ "$usage" -ge "$THRESHOLD" ]; then
echo "警告: 用户 $user 磁盘使用率已达 ${usage}%"
# 可以添加邮件通知
# echo "用户 $user 磁盘配额使用率: ${usage}%" | mail -s "磁盘配额警告" admin@example.com
fi
fi
fi
done
删除用户配额
#!/bin/bash
delete_user_quota() {
local user=$1
if [ -z "$user" ]; then
echo "请指定用户名"
return 1
fi
# 删除用户配额
setquota -u $user 0 0 0 0 /home
# 强制同步
sync
echo "用户 $user 的配额已删除"
}
使用说明
- 保存脚本:将脚本保存为
setup_quota.sh - 添加执行权限:
chmod +x setup_quota.sh - 运行脚本:
sudo ./setup_quota.sh
注意事项
- ⚠️ 需要 root 权限运行
- 确保文件系统支持配额功能
- 建议先在测试环境验证
- 定期检查配额使用情况
- 合理设置软限制和硬限制的差异
这个脚本提供了完整的磁盘配额管理功能,可以根据实际需求进行调整和扩展。