Linux磁盘配额
磁盘配额
我们先假设一种情况:现在有一台Red Hat Enterprise Linux系统由多个用户共同使用,但是该系统的磁盘空间十分有限;如果磁盘空间被某些用户无节制占用,就会导致其他用户无法正常使用磁盘空间保存数据。这个时候你可能会希望Linux系统能够强制限制用户不能贪婪无厌地使用磁盘空间。
幸运的是,Red Hat Enterprise Linux提供了一个叫做“磁盘配额(Disk Quota)”的子系统,可以限制用户最多只能使用多大的磁盘空间或存储多少个文件。
下面用笔者编写的一个例子来详细介绍Linux磁盘配额:
限制对象:Group限制、User限制
限制类型:Block配额(使用空间大小)、Inode配额(储存文件的个数)
限制强度:Soft Limit、Hard Limit
相关命令选项:
edquota:编辑用户或群组的quota
-u 设置用户的quota,这是预设的参数。
-g 设置群组的quota。
-p<源用户名称> 将源用户的quota设置套用至其他用户或群组。
-t 设置宽限期限。
quota :显示磁盘使用情况和限额
-g 显示用户组的限额。
-u 显示用户限额。该标志是缺省选项。
-v 显示没有已分配存储器的文件系统上的限额。
-q 打印扼要消息,只包含关于使用超过限额的文件系统的信息。
一、(模拟练习)某企业linux服务器上有运维组(800)10个账号ops01-ops10,开发组(10000)20个开发账号user01-user20,由于开发人员大量无节制的使用磁盘存放各种无意义的数据,导致系统面临各种故障(其他服务运行异常、其他用户空间不足等),运维组人员经常因为空间不足跟开发组产生冲突,反馈到运维经理那里,运维经理将这个任务交给了你,你如何解决?(注:此时home目录不是独立分区,”/”分区容量紧张)
解决思路:
1. 空间不足,为了不影响系统分区,添加一块新的磁盘(50G)挂载到home目录
2. 数据迁移
3. 考虑到空间可扩展性,将新加磁盘做成LVM
4. 考虑平等问题,对特定组或特定人员分配合理的空间?
- 运维组(ops)总体分配20G
- 开发组(dev)每个用户分配1G
二、 实验实施
1. 创建运维组、开发组及成员账号
[root@localhost ~]# cat userops.sh //创建添加运维用户脚本
#!/bin/bash
groupadd -g 800 ops
for i in `seq 10`
do
if[ $i -le 9 ];then
useradd -g 800 ops0$i &>/dev/null
echo ‘ops0$i‘|passwd --stdin ops0$i &>/dev/null
else
useradd -g 800 ops$i &>/dev/null
echo ‘ops$i‘|passwd --stdin ops$i &>/dev/null
fi
done
[root@localhost ~]# cat userdev.sh //创建添加开发用户脚本
#!/bin/bash
groupadd -g 10000 dev
for i in `seq 20`
do
if [ $i -le 9 ];then
useradd -g 10000 dev0$i &>/dev/null
echo ‘dev0$i‘|passwd --stdin dev0$i &>/dev/null
else
useradd -g 10000 dev$i &>/dev/null
echo ‘dev$i‘|passwd --stdin dev$i &>/dev/null
fi
done
[root@localhost ~]# ls /dev/sdb1 //创建逻辑卷
/dev/sdb1
[root@localhost ~]# vgcreate vg_user /dev/sdb1
[root@localhost ~]# lvcreate -L 50G -n lv_user vg_user
[root@localhost ~]# mkfs.ext4 /dev/vg_user/lv_user
[root@localhost~]# mv /home/* /test/ //先迁移数据到其他目录(如果使用cp命令特别注意加-p 保留原有各用户权限)
[root@localhost ~]# su - ops01
su: 警告:无法切换到目录/home/ops01: 没有那个文件或目录
-bash-4.1$
[root@localhost ~]# grep vg /etc/fstab
/dev/vg_user/lv_user /home ext4 defaults 0 0
[root@localhost ~]# mount -a
[root@localhost ~]# df -h |grep -E "vg|home"
/dev/mapper/vg_user-lv_user
50G 180M 47G 1% /home
[root@localhost ~]# mv /test/* /home/ 把数据迁移回LVM里
[root@localhost ~]# su -ops01 验证可以登录用户
[ops01@localhost ~]$ ls 数据无损
1 2 3
2. 为ops组和dev组成员做磁盘配额
[root@localhost ~]# grep -i quota /boot/config-2.6.32-358.el6.x86_64
CONFIG_NETFILTER_XT_MATCH_QUOTA=m
CONFIG_XFS_QUOTA=y
CONFIG_QUOTA=y //表示内核开启磁盘配额
CONFIG_QUOTA_NETLINK_INTERFACE=y
CONFIG_PRINT_QUOTA_WARNING=y
# CONFIG_QUOTA_DEBUG is not set
CONFIG_QUOTA_TREE=y
CONFIG_QUOTACTL=y //表示内核开启磁盘配额
[root@localhost ~]# vim /etc/fstab //写入开机自动挂载
[root@localhost ~]# mount -o remount /home
[root@localhost ~]# mount | grep home
/dev/mapper/vg_user-lv_user on /home type ext4 (rw,usrquota,grpquota)
[root@localhost ~]# quotacheck -ugcv /dev/mapper/vg_user-lv_user //检查并建立quota数据库文件
quotacheck: Your kernel probably supports journaled quota but you are notusing it. Consider switching to journaled quota to avoid running quotacheckafter an unclean shutdown.
quotacheck: Scanning /dev/mapper/vg_user-lv_user [/home] done
quotacheck: Cannot stat old user quota file: 没有那个文件或目录
quotacheck: Cannot stat old group quota file: 没有那个文件或目录
quotacheck: Cannot stat old user quota file: 没有那个文件或目录
quotacheck: Cannot stat old group quota file: 没有那个文件或目录
quotacheck: Checked 152 directories and 98 files
quotacheck: Cannot create new quotafile /home/aquota.user.new: 权限不够
quotacheck: Cannot initialize IO on new quotafile: 权限不够
quotacheck:Cannot create new quotafile /home/aquota.group.new: 权限不够
quotacheck: Cannotinitialize IO on new quotafile: 权限不够
//上述权限不够是因为selinux限制
[root@localhost~]# grep SELINUX=dis /etc/sysconfig/selinux //关闭selinux
SELINUX=disabled
[root@localhost ~]# setenforce 0 //当时关闭生效
[root@localhost ~]# quotacheck -ugcv /dev/vg_user/lv_user //检查并建立quota数据库文件
quotacheck: Your kernel probably supports journaled quota but you are notusing it. Consider switching to journaled quota to avoid running quotacheckafter an unclean shutdown.
quotacheck: Scanning /dev/mapper/vg_user-lv_user [/home] done
quotacheck: Cannot stat old user quota file: 没有那个文件或目录
quotacheck: Cannot stat old group quota file: 没有那个文件或目录
quotacheck: Cannot stat old user quota file: 没有那个文件或目录
quotacheck: Cannot stat old group quota file: 没有那个文件或目录 //以上是检测该文件系统是否有数据库文件,提示没有属于正常
quotacheck: Checked 152 directories and 98 files //检测到的文件
quotacheck: Old file not found.
quotacheck: Old file not found.
[root@localhost ~]# ls /home/|grep aqu* //上述检测正常则会在该文件系统根层创建配额数据库文件
aquota.group //组配额数据库文件
aquota.user //用户配额数据库文件
[root@localhost ~]# edquota -g ops //为ops组创建配额限制
Disk quotas for group ops (gid 800):
Filesystem blocks soft hard inodes soft hard
/dev/mapper/vg_user-lv_user 324 19999999 20000000 84 20000 20050
[root@localhost ~]# edquota -u dev01 //为dev01创建配额限制
Disk quotas for user dev01 (uid 510):
Filesystem blocks soft hard inodes soft hard
/dev/mapper/vg_user-lv_user 36 999999 1000000 0 1000 1010
[root@localhost ~]# cat quota.sh //为之后的的19个开发组用户做配额
#!/bin/bash
for i in `grep dev /etc/passwd|awk -F: ‘{print $1}‘|grep dev|grep -vdev01`
do
edquota -p dev01 -u $i //-p选项表示参照dev01的配额模板
done
[root@localhost home]# quotaon -ugv /home/ //开启磁盘配额“服务”
/dev/mapper/vg_user-lv_user [/home]: group quotas turned on
/dev/mapper/vg_user-lv_user [/home]: user quotas turned on //selinux关闭的情况下,此开启永久生效
三、 测试
1.测试ops组的block限制(容量)
[root@localhost home]# su - ops01
[ops01@localhost ~]$ dd if=/dev/zero of=myfile bs=1G count=21
dm-0: warning, group block quota exceeded.
dm-0: write failed, group block limit reached.
dd: 正在写入"myfile": 超出磁盘限额
记录了20+0 的读入
记录了19+0 的写出
20479664128字节(20 GB)已复制,1223.85 秒,16.7 MB/秒
[ops01@localhost ~]$ du -sh myfile
20G myfile
2.测试dev02的inode限制(文件个数)
[root@localhost home]# su - dev02
[dev02@localhost ~]$ cat touch.sh //脚本建立多个文件
#!/bin/bash
i=1
while [ $i -le 1011 ]
do
touch $i
let i++
done
[dev02@localhost ~]$ sh touch.sh
dm-0: warning, user file quota exceeded.
dm-0: write failed, user file limit reached.
touch: 无法创建"1001": 超出磁盘限额
touch: 无法创建"1002": 超出磁盘限额
touch: 无法创建"1003": 超出磁盘限额
touch: 无法创建"1004": 超出磁盘限额
touch: 无法创建"1005": 超出磁盘限额
touch: 无法创建"1006": 超出磁盘限额
touch: 无法创建"1007": 超出磁盘限额
touch: 无法创建"1008": 超出磁盘限额
touch: 无法创建"1009": 超出磁盘限额
touch: 无法创建"1010": 超出磁盘限额
touch: 无法创建"1011": 超出磁盘限额 //显示的文件都没创建成功,因为超过配额
四、 查看配额报表【两个命令均可以,quota(针对用户)、repquota(针对文件系统)】
[root@localhost ~]# quota -u dev01//查看开发组成员dev01配额情况
Disk quotas for user dev01 (uid 510):
Filesystem blocks quota limit grace files quota limit grace
/dev/mapper/vg_user-lv_user
36999999 1000000 9 1000 1010
[root@localhost ~]# quota -u dev02 //查看开发组成员dev02配额情况(此用户超额,同时时间限制grace倒计时开启)
Disk quotas for user dev02 (uid 511):
Filesystem blocks quota limit grace files quota limit grace
/dev/mapper/vg_user-lv_user(注:其实达到硬限制后,时间倒计无意义)
56 999999 1000000 1010* 1000 1010 6days
[root@localhost ~]# quota -g ops//查看运维组的配额情况
Disk quotas for group ops (gid 800):
Filesystem blocks quota limit grace files quota limit grace
/dev/mapper/vg_user-lv_user
20000000* 19999999 20000000 6days 82 20000 20005
[root@localhost ~]# repquota /home
*** Report for user quotason device /dev/mapper/vg_user-lv_user
Block grace time: 9days; Inode grace time: 10days
Block limits Filelimits
User used soft hard grace used soft hard grace
----------------------------------------------------------------------
root --24 0 0 3 0 0
ops01 --19999712 0 0 10 0 0
ops02 --32 0 0 8 0 0
ops03 --32 0 0 8 0 0
ops04 --32 0 0 8 0 0
ops05 --32 0 0 8 0 0
ops06 --32 0 0 8 0 0
ops07 --32 0 0 8 0 0
ops08 --32 0 0 8 0 0
ops09 --32 0 0 8 0 0
ops10 --32 0 0 8 0 0
dev01 --36 999999 1000000 9 1000 1010
dev02 -+ 60 999999 1000000 1003 1000 1010 6days
dev03 -+ 60 999999 1000000 1010 1000 1010 6days
dev04 --32 999999 1000000 8 1000 1010
dev05 --32 999999 1000000 8 1000 1010
dev06 --32 999999 1000000 8 1000 1010
dev07 --32 999999 1000000 8 1000 1010
dev08 --32 999999 1000000 8 1000 1010
dev09 --32 999999 1000000 8 1000 1010
dev10 --32 999999 1000000 8 1000 1010
dev11 --32 999999 1000000 8 1000 1010
dev12 --32 999999 1000000 8 1000 1010
dev13 --32 999999 1000000 8 1000 1010
dev14 --32 999999 1000000 8 1000 1010
dev15 --32 999999 1000000 8 1000 1010
dev16 --32 999999 1000000 8 1000 1010
dev17 --32 999999 1000000 8 1000 1010
dev18 --32 999999 1000000 8 1000 1010
dev19 --32 999999 1000000 8 1000 1010
dev20 --32 999999 1000000 8 1000 1010
附:
修改软限制时间(默认是7天,达到软限制后默认时间会进入倒计时,倒计至0天则相当于达到硬限制)
[root@localhost ~]# edquota -T dev02
Times to enforce softlimit for user dev02 (uid 511):
Time units may be: days, hours, minutes, or seconds
Filesystem block grace inodegrace
/dev/mapper/vg_user-lv_user unset 20days
[root@localhost~]# quota -u dev02
Disk quotas for user dev02(uid 511):
Filesystem blocks quota limit grace files quota limit grace
/dev/mapper/vg_user-lv_user
60 999999 1000000 1003* 10001010 20days
扩展:如果感兴趣或者日后工作有需要,还可以针对超过软限制的用户进行邮件提醒配置(相当于手机话费低于10元的短信提醒,更人性化)
本文出自 “esoul” 博客,请务必保留此出处http://esoul.blog.51cto.com/7825461/1440690
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。