作为运维人员,很多时候我们需要对用户使用磁盘的空间进行限定,比如用户家目录的空间使用限制,邮箱空间使用限制,共享磁盘空间的使用限制,甚至说云盘空间,都需要给每个用户做相应的空间使用限制。否则,服务器磁盘空间就无法进行管理了。要想使用配额首先必须明白两个问题,第一,就是系统内核必须支持配额功能;第二,就是配额只能作用于磁盘分区上;所以我们要想使用配额,就必须先行准备这两大条件。


一、环境检查

  第一步:检查当前系统是否支持配额功能:

    grep CONFIG_QUOTA /boot/config-[kernel-version]

    

    如果结果如下:

    CONFIG_QUOTA=y

    CONFIG_QUOTACTL=y

    恭喜你!当前的内核支持配额功用!如果出现的不是这个结果的话那必须对内核进行重新编译了,让内核启用配额功能

    示例代码:

    [root@centos7 boot]# grep CONFIG_QUOTA /boot/config-3.10.0-327.el7.x86_64 

    CONFIG_QUOTA=y

    CONFIG_QUOTA_NETLINK_INTERFACE=y

    # CONFIG_QUOTA_DEBUG is not set

    CONFIG_QUOTA_TREE=y

    CONFIG_QUOTACTL=y

    CONFIG_QUOTACTL_COMPAT=y

    [root@centos7 boot]# 


  第二步:准备需要启用配额功能的磁盘分区

  如果是想对用户的家目录做配额,就必须对用户家目录做单独分区,如果安装系统的时候没有做单独分区,可以重建分区,迁移家目录(具体操作在我的上一篇博文中有详解)

  如果想对用户的邮箱启用配额,就必须对用户存储邮件的目录做单独分区,共享磁盘以及其它使用场景同样


    环境展示:

    [root@centos7 home]# lsblk

    NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT

    sda      8:0    0   20G  0 disk 

    ├─sda1   8:1    0  200M  0 part /boot

    ├─sda2   8:2    0    5G  0 part /

    └─sda3   8:3    0    5G  0 part /test

    sdb      8:16   0   20G  0 disk 

    └─sdb1   8:17   0   20G  0 part /home

    sr0     11:0    1  7.2G  0 rom  

    [root@centos7 home]# 

 

  我的家目录目前已经是独立硬盘独立分区,所以我就直接用家目录分区开始演示配额操作了


二、配置用户家目录分区的磁盘配额功能

  第一步:修改文件系统自动挂载配置文件/etc/fstab,修改如下一行,在默认挂载选项后面添加usrquota,grpquota两个挂载选项(多选项之间用,分隔开),启用用户家目录分区的磁盘配额功能

     /dev/sdb1 /home ext4 defaults,usrquota,grpquota 0 0

  第二步:重新挂载一下家目录的独立分区,让刚刚配置的配额功能启用,免去了重启生效的麻烦(曾经看过一些教程,都写的是配置完重启,试想一下,实际生产环境中的服务器允许你随便重启吗)

    [root@centos7 test]# mount -o remount /dev/sdb1

    [root@centos7 test]# mount

    /dev/sda2 on / type xfs (rw,relatime,seclabel,attr2,inode64,noquota)

    /dev/sda3 on /test type ext4 (rw,relatime,seclabel,data=ordered)

    /dev/sda1 on /boot type xfs (rw,relatime,seclabel,attr2,inode64,noquota)

    tmpfs on /run/user/42 type tmpfs (rw,nosuid,nodev,relatime,seclabel,size=186872k,mode=700,uid=42,gid=42)

    tmpfs on /run/user/0 type tmpfs (rw,nosuid,nodev,relatime,seclabel,size=186872k,mode=700)

    /etc/auto.misc on /misc type autofs (rw,relatime,fd=6,pgrp=8821,timeout=300,minproto=5,maxproto=5,indirect)

    -hosts on /net type autofs (rw,relatime,fd=12,pgrp=8821,timeout=300,minproto=5,maxproto=5,indirect)

    /dev/sdb1 on /home type ext4 (rw,relatime,seclabel,quota,usrquota,grpquota,data=ordered)

    [root@centos7 test]# 

    当mount返回值中sdb1分区的挂载选项中有quota,usrquota,grpquota三个选项时,说明配额功能已经生效

    

    quotacheck:创建磁盘配额配置文件

    quotacheck [options] filesystem

        -v:显示扫描过程;

        -u:针对扫描情况与目录的使用情况建立aquota.user配置文件

        -g:针对用户扫描文件与使用情况建立aquota.group配置文件

         -a:扫描任何在/etc/mtab中开启quota的文档系统

    

  第三步:使用quotacheck生成aquota.user,aquota.group两个配置文件

    [root@centos7 test]# quotacheck -vug /dev/sdb1

    quotacheck: Your kernel probably supports journaled quota but you are not using it. Consider switching to journaled quota to avoid running quotacheck after an unclean shutdown.

    quotacheck: Scanning /dev/sdb1 [/home] done

    quotacheck: Cannot stat old user quota file /home/aquota.user: No such file or directory. Usage will not be subtracted.

    quotacheck: Cannot stat old group quota file /home/aquota.group: No such file or directory. Usage will not be subtracted.

    quotacheck: Cannot stat old user quota file /home/aquota.user: No such file or directory. Usage will not be subtracted.

    quotacheck: Cannot stat old group quota file /home/aquota.group: No such file or directory. Usage will not be subtracted.

    quotacheck: Checked 30 directories and 21 files

    quotacheck: Old file not found.

    quotacheck: Old file not found.

    以上报错不必理会,我的sdb1分区是ext4的文件系统,但挂载选项中并没有启用日志功能,这是第一处报错内容,下面是在将要启用配额的分区的一级目录下没有找到aquota.user和aquota.group这两个配置文件,从来都没启用过配额,当然找不到了,所以这些报错,不会影响我们最终效果。只要运行quotacheck命令后,能在sdb1目录下生成这aquota.user和aquota.group这两个配置文件,就可以继续配置

    [root@centos7 test]# ll /home

    total 44

    -rw-------. 1 root   root  7168 Aug 27 22:31 aquota.group

    -rw-------. 1 root   root  7168 Aug 27 22:31 aquota.user

    drwx------. 5 hacker test  4096 Aug 27 19:42 hacker

    drwx------. 2 root   root 16384 Aug 27 20:03 lost+found

    drwx------. 5 share  test  4096 Aug 27 19:43 share

    drwx------. 6 test   test  4096 Aug 26 15:31 test

    [root@centos7 test]# 

    

  第四步:使用edquota命令设置具体用户的具体配额参数

    

    edquota:设定磁盘配额具体参数

        -u: 编辑user的quota

        -g: 编辑group的quota

        -t: 设定超过限定的保留时间(用户和组都有效)

        -p: 复制指定用户的quota资料到另一用户上

        -T:修改指定用户或组的宽限时间

    

    1、设定test和hacker用户使用空间限定模式

    [root@centos7 test]# edquota -u test

    Disk quotas for user test (uid 1000):

    Filesystem           blocks       soft       hard     inodes     soft     hard

    /dev/sdb1                88     409600     512000         22        0        0

    [root@centos7 test]#

    

    选项释义:

    blocks :用户test的家目录(在/dev/sdb1)已使用的空间,单位:KB (系统生成)

    soft :soft limit 磁盘空间警告值 单位:KB (需要设定)——超过该值发警告消息

    hard :hard limit 磁盘空间限定值 单位:KB (需要设定)——超过该值拒绝写入数据

    inodes :用户test的家目录已使用的节点数,由于inode控制不方便,所以不要修改它

    soft :soft limit 节点数警告值 (根据需要修改)——超过该值发警告消息

    hard :hard limit 节点数限定值 (根据需要修改)——超过该值拒绝新建文件

    

    soft limit :软限制,在宽限期(grace period)之内,使用空间可以超过soft limit,但必须在宽限期之内将使用容量降低到soft limit以下

    hard limit :硬限制,当用户使用空间超过hard limit时,将无法再写入数据

    grace period:宽限期,使用容量超过soft limit,宽限时间自动启动,使用者将容量降低到soft limit以下,宽限时间自动关闭,假如使用者没有在宽限时间内将容量降低到soft limit,那么他将无法再写入数据,即使使用容量没有到达hard limit

    

    复制test用户的配额参数给hacker

    [root@centos7 test]# edquota -p test hacker

    [root@centos7 test]# edquota -u hacker

    Disk quotas for user hacker (uid 1001):

    Filesystem           blocks       soft       hard     inodes     soft     hard

    /dev/sdb1                56     409600     512000         14        0        0

    [root@centos7 test]#

    

    2、设定share用户使用节点数限定模式

    [root@centos7 test]# edquota -u share

    Disk quotas for user share (uid 1002):

    Filesystem            blocks       soft       hard     inodes     soft     hard

    /dev/sdb1                 52          0          0         13       18       20

    [root@centos7 test

    

    3、对用户组设定磁盘配额

    有时候对单个用户设备磁盘配额不好控制,这时就可以把同一个部门的用户放在同一个组里面,然后对组进行额磁盘配额

    [root@centos7 test]# edquota -g test

         Disk quotas for group test (gid 1000):

          Filesystem         blocks       soft       hard     inodes     soft     hard

          /dev/sdb1             204    4096000    5120000         56        0        0

    和用户配置没什么区别,只是作用对象是组而已,至于每个用户能用多少空间,只要所有的用户使用的空间总计不大于hard的值时,所剩余的空间任何用户都可以使用。至于每个组需要分配多大的硬盘空间,你可以直接去咨询一下他们的部门领导。这样以来就可以很好的解决这个用户磁盘空间管理的问题了

    

    3、设定超出软限制的保留期限(用户组的默认值都是7天)

    注意:所以超过软限制的部分(space、inode都一样有效),超过宽限时间都会被自动删除,所以设置一个合理的宽限期限也是很有必须。以免造成用户不必须的数据损失

    [root@centos7 test]# edquota -t

    

           Grace period before enforcing soft limits for users:

           Time units may be: days, hours, minutes, or seconds

             Filesystem             Block grace period     Inode grace period

             /dev/sdb1                     7days                  7days


三、验证配额使用效果

  第一步、用户配额参数高额完毕,正式开启home目录独立分区的磁盘配额功能

    [root@centos7 test]# quotaon -vug /dev/sdb1

    quotaon: using /home/aquota.group on /dev/sdb1 [/home]: Device or resource busy

    quotaon: using /home/aquota.user on /dev/sdb1 [/home]: Device or resource busy

    [root@centos7 test

    有报错,不用担心,因为home目录是sdb1分区的挂载点,所以会提示设备资源繁忙


  第二步、登录进做过配额的用户的家目录下,测试配额警告与限定


    1、首先测试使用空间限定模式的情况

    [root@centos7 test]# su - test

    Last login: Sat Aug 27 20:32:53 CST 2016 on pts/0

    [test@centos7 ~]$ du -h

    8.0K./.cache/abrt

    12K./.cache

    16K./.local/share/lftp

    20K./.local/share

    24K./.local

    4.0K./.config/lftp

    4.0K./.config/abrt

    12K./.config

    4.0K./.mozilla/extensions

    4.0K./.mozilla/plugins

    12K./.mozilla

    88K.

    [test@centos7 ~]$ dd if=/dev/zero of=test1 bs=1M count=399

    399+0 records in

    399+0 records out

    418381824 bytes (418 MB) copied, 0.75313 s, 556 MB/s

    [test@centos7 ~]$ du -sh

    400M.

    [test@centos7 ~]$

    没有超过警告值,所以没有发出警告消息

    

    [test@centos7 ~]$ dd if=/dev/zero of=test2 bs=1M count=1

    sdb1: warning, user block quota exceeded.

    1+0 records in

    1+0 records out

    1048576 bytes (1.0 MB) copied, 0.0110259 s, 95.1 MB/s

    [test@centos7 ~]$

    在警告值400M的基础上多出了1M,警告消息立即触发

    

    [test@centos7 ~]$ du -sh

    401M.

    [test@centos7 ~]$ dd if=/dev/zero of=test3 bs=1M count=100

    sdb1: write failed, user block limit reached.

    dd: error writing ‘test3’: Disk quota exceeded

    100+0 records in

    99+0 records out

    104767488 bytes (105 MB) copied, 0.414018 s, 253 MB/s

    [test@centos7 ~]$ du -h

    8.0K./.cache/abrt

    12K./.cache

    16K./.local/share/lftp

    20K./.local/share

    24K./.local

    4.0K./.config/lftp

    4.0K./.config/abrt

    12K./.config

    4.0K./.mozilla/extensions

    4.0K./.mozilla/plugins

    12K./.mozilla

    500M.

    [test@centos7 ~]$ dd if=/dev/zero of=test4 bs=1M count=1

    dd: error writing ‘test4’: Disk quota exceeded

    1+0 records in

    0+0 records out

    0 bytes (0 B) copied, 0.00184169 s, 0.0 kB/s

    [test@centos7 ~]$ 

    忽略警告,继续写入数据,只要没有超过限定值500M,是可以继续写入的,一但达到限定值,就无法写入超出限定值的数据了

    

    2、测试使用节点数限定模式的情况

    [share@centos7 ~]$ quota -su share

    Disk quotas for user share (uid 1002): 

         Filesystem   space   quota   limit   grace   files   quota   limit   grace

          /dev/sdb1     52K      0K      0K              13      18      20        

    [share@centos7 ~]$

    

    查看磁盘配额使用情况的选项释义:

    space:用户已使用的磁盘空间

    quota:soft limit(软限制)用户设定的磁盘空间警告值

    limit:hard limit(硬限制)用户设定的磁盘空间限定值

    grace:grace period磁盘空间超出警告部分的保留天数(默认7天)

    files:用户已创建的节点数

    quota:soft limit(软限制)用户设定的节点数的警告值

    limit:hard limit(硬限制)用户设定的节点数的限定值

    grace:grace period节点数超出警告部分的保留天数(默认7天)

    

    [share@centos7 ~]$ touch file{1..5}

    [share@centos7 ~]$ ll

    total 0

    -rw-r--r--. 1 share test 0 Aug 28 12:40 file1

    -rw-r--r--. 1 share test 0 Aug 28 12:40 file2

    -rw-r--r--. 1 share test 0 Aug 28 12:40 file3

    -rw-r--r--. 1 share test 0 Aug 28 12:40 file4

    -rw-r--r--. 1 share test 0 Aug 28 12:40 file5

    新建了5个文件,也即增加了5个节点,还没有超过Inodes的警告值18,所以没有发出警告信息

    

    [share@centos7 ~]$ touch file6

    sdb1: warning, user file quota exceeded.

    [share@centos7 ~]$ ll

    total 0

    -rw-r--r--. 1 share test 0 Aug 28 12:40 file1

    -rw-r--r--. 1 share test 0 Aug 28 12:40 file2

    -rw-r--r--. 1 share test 0 Aug 28 12:40 file3

    -rw-r--r--. 1 share test 0 Aug 28 12:40 file4

    -rw-r--r--. 1 share test 0 Aug 28 12:40 file5

    -rw-r--r--. 1 share test 0 Aug 28 12:41 file6

    [share@centos7 ~]$ quota -su share

    Disk quotas for user share (uid 1002): 

         Filesystem   space   quota   limit   grace   files   quota   limit   grace

          /dev/sdb1     52K      0K      0K              19*     18      20   6days

    [share@centos7 ~]$

    又增加了一个节点,刚好超过了inode的警告值18,立即触发了警告消息

    

    [share@centos7 ~]$ touch file{7..8}

    sdb1: write failed, user file limit reached.

    touch: cannot touch ‘file8’: Disk quota exceeded

    [share@centos7 ~]$ ll

    total 0

    -rw-r--r--. 1 share test 0 Aug 28 12:40 file1

    -rw-r--r--. 1 share test 0 Aug 28 12:40 file2

    -rw-r--r--. 1 share test 0 Aug 28 12:40 file3

    -rw-r--r--. 1 share test 0 Aug 28 12:40 file4

    -rw-r--r--. 1 share test 0 Aug 28 12:40 file5

    -rw-r--r--. 1 share test 0 Aug 28 12:44 file6

    -rw-r--r--. 1 share test 0 Aug 28 12:58 file7

    [share@centos7 ~]$ quota -su share

    Disk quotas for user share (uid 1002): 

         Filesystem   space   quota   limit   grace   files   quota   limit   grace

          /dev/sdb1     52K      0K      0K              20*     18      20   6days

    [share@centos7 ~]$ 

        忽略警告,继续添加节点,只要没有超过Inode限定值20,是可以继续添加的,一但超过Inode限定值,就无法继续增加节点了(等同于无法创建文件了)

    

    3、验证节点数超出配额,能否使用磁盘空间

    [share@centos7 ~]$ echo test >> file1

    [share@centos7 ~]$ cat file1

    test

    [share@centos7 ~]$ 

    Inode不能再增加了,但空间使用没有限制,所以还可以使用硬盘空间(增加原有文件的内容


四、查询磁盘配额使用情况

  quota [options] username|groupname

      -u:查询用户的配额使用详情

      -g:查询用户组的配额使用详情

      -q:简洁方式显示查询信息

      -v:显示详细查询信息

      -s:显示单位换算后的结果


    1、查询用户的磁盘配额使用详情

    [root@centos7 test]# quota -u test share

    Disk quotas for user test (uid 1000): 

    Filesystem  blocks   quota   limit   grace   files   quota   limit   grace

    /dev/sdb1      88  409600  512000              22       0       0        

    Disk quotas for user share (uid 1002): 

    Filesystem  blocks   quota   limit   grace   files   quota   limit   grace

    /dev/sdb1      60       0       0              20*     18      20   6days

    [root@centos7 test]# 

    

    2、查询用户组的磁盘配额使用详情

    [root@centos7 test]# quota -g test

    Disk quotas for group test (gid 1000): 

    Filesystem  blocks   quota   limit   grace   files   quota   limit   grace

    /dev/sdb1     204  4096000 5120000              56       0       0 

    [root@centos7 test]# 


五、关闭磁盘配额功能

    1、关闭单个磁盘的磁盘配额

    quotaoff /dev/sd#

    

        关闭所有开启的磁盘配额的分区

        quotaoff -a

    

    2、如果不打算再次启用磁盘配额功能,可以将配置文件一并删除

    rm -rf /mount_point/aquota.*

    

    3、最后删除/etc/fstab中的自动挂载选项中的(usrquota,grpquota)两项即可


关于磁盘配额的问题,就给大家分享到这里,不足之处,还望高人指点。