date: 2020-05-16title: linux针对用户及组设置磁盘配额 #标题
tags: 磁盘配额 #标签
categories: linux大杂烩 # 分类

需求:限制单一用户对某个目录的最大可用存储。
在Centos 7.x中,不同的文件系统使用不同磁盘配额管理管理工具,xfs文件系统使用xfs_quota工具进行管理,ext3/4文件系统通过quota工具进行管理,这里将分别展示两种文件系统设置磁盘配额的过程。

xfs文件系统设置磁盘配额

确认相关管理工具已安装

  1. $ rpm -q xfsprogs
  2. xfsprogs-4.5.0-15.el7.x86_64
  3. $ rpm -ql xfsprogs | grep xfs_quota
  4. /usr/sbin/xfs_quota
  5. /usr/share/man/man8/xfs_quota.8.gz

挂载时添加所需参数

  1. $ mkdir /xfs # 创建挂载点
  2. $ mount -o usrquota,grpquota /dev/sdb1 /xfs # 挂载时增加usrquota,grpquota参数
  3. $ df -hT /xfs # 确认已挂载
  4. 文件系统 类型 容量 已用 可用 已用% 挂载点
  5. /dev/sdb1 xfs 10G 33M 10G 1% /xfs
  6. # 若要设置永久挂载,则需要在/etc/fstab文件写入如下内容
  7. $ tail -1 /etc/fstab
  8. /dev/sdb1 /xfs xfs defaults,usrquota,grpquota 0 0

挂载时常用选项如下:

  • usrquota:针对用户账号的磁盘配额设置;
  • grpquota:针对群组的设置;
  • prjquota:针对单一目录的设置,project的配额限制是针对文件系统生效的,需要注意的是它不能和grpquota配额支持同时存在,并且它不同于usrquota和grpquota配额设置,这两个对root不生效,但是project配额对root用户同样生效。

xfs_quota命令使用介绍

选项和参数:

  • -x:专家模式,后续才能够加入-c的指令参数;
  • -c:后面加的就是指令。

常用指令如下:

  • print:只是列出目前主机内的文件系统参数等数据;
  • df:与原本的df一样的功能,可以加上-b(block)、-i(inode)、-h(加上容量单位)等;
  • report:列出目前的quota项目,有-ugr(user/group/project)及-bi等数据;
  • state:说明目前支持quota的文件系统的信息,有没有启动相关项目等。

xfs_quota查询使用

  1. # 列出目前系统的所有文件系统,以及文件系统的quota挂载参数的支持
  2. $ xfs_quota -x -c "print"
  3. Filesystem Pathname
  4. / /dev/mapper/centos-root
  5. /home /dev/mapper/centos-home
  6. /boot /dev/sda1
  7. /xfs /dev/sdb1 (uquota, gquota) #括号内的参数表示支持针对用户、组设置配额。
  8. $ xfs_quota -x -c "df -h" /xfs #列出目前/xfs目录的挂载点文件系统使用情况。
  9. Filesystem Size Used Avail Use% Pathname
  10. /dev/sdb1 10.0G 32.2M 10.0G 0% /xfs
  11. $ xfs_quota -x -c "state" # 列出目前文件系统是否启动了quota功能。
  12. User quota state on /xfs (/dev/sdb1)
  13. Accounting: ON # 有启用计算功能
  14. Enforcement: ON # 有实际quota管制的功能
  15. Inode: #67 (1 blocks, 1 extents) # 以上四行是说明启动了user的限制能力。
  16. Group quota state on /xfs (/dev/sdb1)
  17. Accounting: ON
  18. Enforcement: ON
  19. Inode: #68 (1 blocks, 1 extents) # 以上四行是说明启动了group的限制能力。
  20. Project quota state on /xfs (/dev/sdb1)
  21. Accounting: OFF
  22. Enforcement: OFF
  23. Inode: #68 (1 blocks, 1 extents) #以上四行是说明project并不支持
  24. # 以下是grace time,表示当超过了软限制的容量,会允许继续使用多少天(下面是默认允许7天)
  25. Blocks grace time: [7 days]
  26. Inodes grace time: [7 days]
  27. Realtime Blocks grace time: [7 days]
  28. # 将用户的宽限时间改为14天
  29. $ xfs_quota -x -c "timer -u 15days" /xfs
  30. # 将组的宽限时间改为14天
  31. $ xfs_quota -x -c "timer -g 15days" /xfs

关于grace time说明

grace time表示默认宽限时间,如果使用容量超过了软限制的容量,允许继续使用多少天,在这个时间内不做任何磁盘管理,到期后,soft限制会取代hard限制作为quota限制,也就是说,你的inode/block用量限制变为soft,达到soft后,磁盘使用权就被锁住。

设置磁盘配额示例

配额示例:

# 针对/xfs目录限制“lv”这个用户对此目录的容量及inode使用。
$ xfs_quota -x -c 'limit -u bsoft=100M bhard=150M isoft=5 ihard=10 lv' /xfs
# 上述指令执行后,lv这个用户对/xfs目录最多可用容量则为150M(软限制为100M)
# inode值则表示lv用户最多可在/xfs目录下创建多少文件,软限制为5个,硬限制为10个。

上述命令解释:

  • -x:启动专家模式
  • -c:直接调用管理命令
  • -u:针对用户限制
  • -g:针对组限制
  • bsoft:容量软限制
  • bhard:容量硬限制
  • isoft:inode数量软限制
  • ihard:inode数量硬限制

其实需要限制什么写什么即可,默认值为0,表示无限制,如下:

# 只限制ljz用户block的使用情况,而不限制inode使用情况
$ xfs_quota -x -c 'limit -u bsoft=100M bhard=150M ljz' /xfs

查询用户的限制情况

# 查询lv用户的容量限制情况
$ xfs_quota -c 'quota -uvh lv' /xfs
Disk quotas for User lv (1000)
Filesystem   Blocks  Quota  Limit Warn/Time    Mounted on
/dev/sdb1         0   100M   150M  00 [------] /xfs
# Quota表示软限制
# Limit表示硬限制


# 查询lv用户的inode限制情况
$ xfs_quota -c 'quota -iuvh lv' /xfs
Disk quotas for User lv (1000)
Filesystem    Files  Quota  Limit Warn/Time    Mounted on
/dev/sdb1         0      5     10  00 [------] /xfs




$ xfs_quota -x -c 'report -abih'     # 查询所有用户的配额情况
# 也可以在report后面增加“-u”或“-g”,只查看针对用户的配额情况
User quota on /xfs (/dev/sdb1)
                        Blocks                            Inodes              
User ID      Used   Soft   Hard Warn/Grace     Used   Soft   Hard Warn/Grace  
---------- --------------------------------- --------------------------------- 
root            0      0      0  00 [0 days]      3      0      0  00 [0 days]
lv              0   100M   150M  00 [------]     10      5     10  00 [14 days]
ljz             0   100M   150M  00 [------]      0      0      0  00 [------]

Group quota on /xfs (/dev/sdb1)
                        Blocks                            Inodes              
Group ID     Used   Soft   Hard Warn/Grace     Used   Soft   Hard Warn/Grace  
---------- --------------------------------- --------------------------------- 
root            0      0      0  00 [0 days]      3      0      0  00 [0 days]
lv              0      0      0  00 [------]     10      0      0  00 [------]

验证配额效果

测试容量限制
# 设置权限并切换至lv用户
$ chmod 777 /xfs
$ su - lv


# 测试写入120M的数据
$ dd if=/dev/zero of=/xfs/test.data bs=1M count=120
记录了120+0 的读入
记录了120+0 的写出
125829120字节(126 MB)已复制,0.447427 秒,281 MB/秒
$ du -sh /xfs/test.data        # 查看生成的文件大小
120M    /xfs/test.data


# 测试写入150M的数据
$ dd if=/dev/zero of=/xfs/test.data bs=1M count=150
记录了150+0 的读入
记录了150+0 的写出
157286400字节(157 MB)已复制,0.168683 秒,932 MB/秒
$ du -sh /xfs/test.data      # 文件大小为150M
150M    /xfs/test.data


# 测试写入151M的数据
$ dd if=/dev/zero of=/xfs/test.data bs=1M count=151
dd: 写入"/xfs/test.data" 出错: 超出磁盘限额    # 超出了硬限制150M,所以报错
记录了151+0 的读入
记录了150+0 的写出
157286400字节(157 MB)已复制,0.0628371 秒,2.5 GB/秒
$ du -sh /xfs/test.data    # 文件大小还是150M
150M    /xfs/test.data

测试inode限制
$ rm -rf /xfs/test.data   # 删除容量测试的文件(容量已达到硬限制,同样无法创建新文件)

$ for i in `seq 8`;do touch /xfs/file${i};done   # /xfs目录下创建8个文件
$ ls /xfs/ | wc -l
8

# 再创建4个,则有两个已无法创建(inode硬限制为10个)
$ for i in `seq 9 12`;do touch /xfs/file${i};done
touch: 无法创建"/xfs/file11": 超出磁盘限额
touch: 无法创建"/xfs/file12": 超出磁盘限额

取消quota限制

常用参数如下:

  • disable:暂时取消 quota 的限制,但其实系统还是在计算 quota 中,只是没有管制而已!应该算最有用的功能!
  • enable:就是回复到正常管制的状态中,与 disable 可以互相取消、启用!
  • off:完全关闭quota的限制,使用了这个状态后,你只有卸载再重新挂载才能够再次的启动 quota!也就是说,用了 off 状态后,你无法使用 enable 再次复原 quota 的管制!注意不要乱用这个状态!一般建议用 disable
    即可,除非你需要执行remove 的动作!
  • remove:必须要在 off 的状态下才能够执行的指令,这个 remove 可以“移除”quota 的限制设置,例如要取消 project 的设置,无须重新设置为 0 ,只要 remove -p 就可以了!

取消配额示例
$ xfs_quota -xc "disable -u" /xfs         # 关闭/xfs目录对user的限制,
# u:表示user,g:表示group,p:表示project。


$ xfs_quota -xc "state" /xfs        # 查看限制状态
User quota state on /xfs (/dev/sdb1)
  Accounting: ON
  Enforcement: OFF    # 表示在计算,但是没有强制管制的意思,现在用户没有磁盘的使用限制
  Inode: #67 (2 blocks, 2 extents)
Group quota state on /xfs (/dev/sdb1)
  Accounting: ON
  Enforcement: ON        # 组的限制并没有关闭,若要关闭,使用指令:xfs_quota -xc "disable -g" /xfs  即可。
  Inode: #68 (2 blocks, 2 extents)
Project quota state on /xfs (/dev/sdb1)
  Accounting: OFF
  Enforcement: OFF
  Inode: #68 (2 blocks, 2 extents)
Blocks grace time: [15 days]
Inodes grace time: [15 days]
Realtime Blocks grace time: [15 days]




# 切换到lv用户进行写入测试

$ su - lv
$ dd if=/dev/zero of=/xfs/test.data bs=10M count=210
记录了210+0 的读入
记录了210+0 的写出
2202009600字节(2.2 GB)已复制,7.15118 秒,308 MB/秒

# 可以看到2.2个G的东西都写入了。并没有配额限制

# 再次查看用户配额情况如下
$ xfs_quota -x -c "report -abih" /xfs/
User quota on /xfs (/dev/sdb1)
                        Blocks                            Inodes              
User ID      Used   Soft   Hard Warn/Grace     Used   Soft   Hard Warn/Grace  
---------- --------------------------------- --------------------------------- 
root            0      0      0  00 [------]      3      0      0  00 [------]
lv           2.1G   100M   150M  00 [-none-]     11      5     10  00 [-none-]
ljz             0   100M   150M  00 [------]      0      0      0  00 [------]

Group quota on /xfs (/dev/sdb1)
                        Blocks                            Inodes              
Group ID     Used   Soft   Hard Warn/Grace     Used   Soft   Hard Warn/Grace  
---------- --------------------------------- --------------------------------- 
root            0      0      0  00 [0 days]      3      0      0  00 [0 days]
lv           2.1G      0      0  00 [------]     11      0      0  00 [------]

xfs_quota其他指令

$ xfs_quota -xc "enable -u" /xfs/      #再次开启user配额限制
$ xfs_quota -xc "state" /xfs/     #完全关闭user的配额限制
$ xfs_quota -x -c "report remove -u" /xfs/    #取消quota的设置

EXT3/4文件系统设置磁盘配额

EXT3/4文件系统通过quota工具进行管理。

确认quota指令已安装

$ $ quota -V
Quota utilities version 4.01.
Compiled with: USE_LDAP_MAIL_LOOKUP EXT2_DIRECT HOSTS_ACCESS RPC RPC_SETQUOTA BSD_BEHAVIOUR
Bugs to jack@suse.cz

quota相关命令介绍

quotacheck

用于检测磁盘配额并生成配额文件。

  • -a:检测所有可用的分区
  • -u:检测用户配额
  • -g:检测组配额
  • -c:创建配额数据文件
  • -v:显示执行过程

指令使用:

$ quotacheck -ugv /dev/sdb2    # 检查/dev/sdb2设备
$ quotacheck -augv     # 检查所有可用分区

edquota

编辑用户和组账号的配额设置。

  • -u: 修改用户配额,默认单位:KB。
  • -g:修改组配额,默认单位:KB。
  • -t:修改宽限时间。

使用示例:

$ edquota -u 用户名
$ edquota -g 组名
$ edquota -t

quotaon & quotaoff

启动/关闭文件系统的磁盘配额功能。

  • -u:用户
  • -g:组
  • -v:显示过程
$ quotaon -ugv 设备文件名或挂载点
$ quotaoff -ugv 设备文件名或挂载点

quota

查看用户、组配额使用情况。

  • -u:用户
  • -g:组
$ quota -u 用户名
$ quota -g 组名

repquota

查看分区磁盘配额使用情况。

$ repquota 挂载点

配额设置示例

挂载磁盘
$ tail -1 /etc/fstab         # 写入以下内容
/dev/sdb2 /ext4 ext4 defaults,usrquota,grpquota 0 0
$ mount -a       # 刷新挂载文件
$ df -h /ext4          # 确认已挂载
文件系统        容量  已用  可用 已用% 挂载点
/dev/sdb2       9.8G   37M  9.2G    1% /ext4
$ mount | grep ext4       # 确认磁盘配额参数已生效
/dev/sdb2 on /ext4 type ext4 (rw,relatime,quota,usrquota,grpquota,data=ordered)

检测磁盘配额并生成配额文件
$ ls /ext4/       # 确认挂载目录下有aquota.group、aquota.user文件
aquota.group  aquota.user  lost+found

# 如果没有这两个文件,并且保证挂载参数无误,那么请执行下面的指令创建

$ quotacheck -ugcv /dev/sdb2

编辑磁盘配额设置
$ edquota -u lv   # 编辑用户lv的配额设置

Disk quotas for user lv (uid 1000):   # /dev/sdb1 是前面测试xfs的,忽略即可。
  Filesystem                   blocks       soft       hard     inodes     soft     hard
  /dev/sdb1                   2150400    1024000    1536000         11       50      100
  /dev/sdb2                         0    1048576    2097152          0       10       20
# 这里设置lv用户对/dev/sdb2的配额为容量软限制1G,硬限制2G,上面单位为“KB”
# inode节点软限制10,硬限制 20个

启用磁盘配额功能
$ quotaon -ugv /ext4/      # 启用user和group的配额功能
/dev/sdb2 [/ext4]: group quotas turned on
/dev/sdb2 [/ext4]: user quotas turned on
$ chmod 777 /ext4/      # 开放权限,方便测试

切至lv用户测试配额
$ su - lv
$ dd if=/dev/zero of=/ext4/test.data bs=1M count=1024   # 写入1G数据正常
sdb2: warning, user block quota exceeded.    # 只是有个warning
记录了1024+0 的读入
记录了1024+0 的写出
1073741824字节(1.1 GB)已复制,2.49776 秒,430 MB/秒


$ dd if=/dev/zero of=/ext4/test.data bs=1M count=2047    # 写入2047M数据也还能写入
sdb2: warning, user block quota exceeded.
记录了2047+0 的读入
记录了2047+0 的写出
2146435072字节(2.1 GB)已复制,1.14515 秒,1.9 GB/秒


$ dd if=/dev/zero of=/ext4/test.data bs=1M count=2050   # 写入2050M数据,直接提示写入出错
sdb2: warning, user block quota exceeded.
sdb2: write failed, user block limit reached.
dd: 写入"/ext4/test.data" 出错: 超出磁盘限额
记录了2048+0 的读入
记录了2047+0 的写出
2147479552字节(2.1 GB)已复制,1.13405 秒,1.9 GB/秒


# 测试inode限制
$ touch /ext4/test{1..11}       # 创建11个文件
sdb2: warning, user file quota exceeded.       # 提示warning
[25::lv@lv::~]$ >>$ ls /ext4/   # 但都创建成功了
aquota.group  lost+found  test10  test2  test4  test6  test8
aquota.user   test1       test11  test3  test5  test7  test9  test.data

$ touch /ext4/test{12..19}
[27::lv@lv::~]$ >>$ ls /ext4/        # 也创建成功了
aquota.group  test1   test12  test15  test18  test20  test5  test8
aquota.user   test10  test13  test16  test19  test3   test6  test9
lost+found    test11  test14  test17  test2   test4   test7  test.data

$ touch /ext4/test21       # 再创建1个就不行了
sdb2: write failed, user file limit reached.
touch: 无法创建"/ext4/test21": 超出磁盘限额

查看lv用户配额的使用情况
$ quota -u lv          # 查询
Disk quotas for user lv (uid 1000): 
     Filesystem  blocks   quota   limit   grace   files   quota   limit   grace
      /dev/sdb1 2150400* 1024000 1536000  14days      11      50     100        
      /dev/sdb2 2096132*  1048576 2097152              20*     10      20   6days

总结

xfs文件系统的磁盘配额只要文件数量、磁盘空间其中任何一个达到限额,就无法继续写文件;而EXT4文件系统则不同,磁盘空间满了还可以创建空文件,直至数量达到限额,或者数量达到限额,覆盖已有文件创建非空文件,直至磁盘容量达到限额。

注:不管是针对那种文件系统设置配额,都不应将所设置限额小于该用户已使用的数量,否则可能会导致用户无法正常登录系统。更不应作死一样,给root设置磁盘配额,以免带来不可预知的风险。