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

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。