Linux-磁盘配额-Quota

介绍

Quota, 字面意思就是 “限额”, 也就是用来限制容量的使用.

使用背景

Linux 中是多用户多任务的环境, 会出现多人共同使用一个硬盘空间的情况. 而当少数使用者占用了大量空间时, 则会压缩其他使用者的使用权力.

常见用途

  • 针对 WWW server (每个人的网页内容有限)
  • 针对 mail server (每个人的邮件空间有限)
  • 针对 file server (每个人的网络硬盘空间有限)

针对主机, 常有:

  • 限制某一 group 能使用的最大磁盘配额
  • 限制某一 user 能使用的最大磁盘配额
  • 限制某一 directory (也即 project) 的最大磁盘配额

Quota 的限制

  • 对于 EXT 文件系统, 只能针对整个 filesystem 而不能是特定目录 (xfs 文件系统的 project 模式下可以)
  • Linux 内核需要支持 quota
  • 只能应用于 Linux 普通用户 (root 就不行)
  • SELinux 会限制 Quota 的使用位置

(需要注意, 不同文件系统在 quota 的处理上不太相同, 使用之前需要先查明文件系统)

Quota 在 XFS 中可用的限制项目

  • 使用者, 组群或某个目录 (user, group 和 project)
  • 容量或文件数量限制 (block 或 inode, 也就是文件系统的两个不问, inode 存放文件属性, block 存放实际文件数据)
  • soft 和 hard 设置 (hard 为使用者不能超过的限制值, 而 soft 为当磁盘使用超过 soft 而低于 hard 时, 会发出警告, 并给出宽限时间 grace time, 若在宽限时间倒数期间将容量降到 soft 之下, 则宽限时间会停止, 但如果超过宽限时间, 则会由 soft 取代 hard 作为 quota 的限制)
  • 设置会倒计时的宽限时间

基本使用

查看文件系统类型并开启 quota 支持

在对某一个目录启用 quota 之前, 先其查明文件系统类型:

1
$ df -Th /home

需要将启用 quota 写入 /etc/fstab 中然后重新挂载文件系统, 如:

1
2
/dev/mapper/centos-home /home xfs defaults,usrquota,grpquota
0 0

之后:

1
2
3
4
$ umount /home
$ mount -a
$ mount -l | grep home
/dev/mapper/centos-home on /home type xfs (rw,relatime,seclabel,attr2,inode64,usrquota,grgquota)

针对 quota 限制的 mount 选项主要有三个:

  • uquota/usrquota/quota, 针对 user
  • gquota/grpquota, 针对 group
  • pquota/prjquota, 针对单一目录, 但不能与 grpquota 同时存在

观察 quota 报告数据

所有的 quota 管理都使用 xfs_quota 命令.

常用选项:

1
[root@localhost]# xfs_quota -x -c "command" [mount_point]
  • -x, 专家模式, 后续才能够加入 -c 的指令参数
  • -c "cmd", 指定指令

和数据汇报相关的指令有:

  • print, 单纯列出目前主机内的文件系统参数等数据
  • df, 和 df 命令一样, 显示文件系统的磁盘空间使用情况, 常用 -h 选项
  • report, 列出当前的 quota project, 有 -ugr (user/group/project), -bi (block/inode) 等显示选项
  • state, 列出挂载的文件系统中支持 quota 的文件系统的信息

列出不前系统的各文件系统, 以及文件系统对 quota 挂载参数的开启情况

1
2
3
4
[root@localhost]# xfs_quota -x -c "print"
Filesystem Pathname
/ /dev/vda2
/homee /dev/loop1 (uquota, gquota)

列出 /homee 目录的磁盘使用情况

前提是 /homee 目录是开启了 quota 的挂载参数.

1
2
3
[root@localhost]# xfs_quota -x -c "df -h" /homee
Filesystem Size Used Avail Use% Pathname
/dev/loop1 5.0G 67.9M 4.9G 1% /homee

列出所有用户在 /homee 下的 quota 限制值

1
2
3
4
5
6
[root@localhost]# xfs_quota -x -c "report -ubih" /homee
User quota on /homee (/dev/loop1)
Blocks Inodes
User ID Used Soft Hard Warn/Grace Used Soft Hard Warn/Grace
---------- --------------------------------- ---------------------------------
root 0 0 0 00 [------] 4 0 0 00 [------]

列出挂载的文件系统中支持 quota 的文件系统的信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
[root@localhost]# xfs_quota -x -c "state"
User quota state on /homee (/dev/loop1)
Accounting: ON
Enforcement: ON
Inode: #131 (1 blocks, 1 extents)
Blocks grace time: [7 days]
Blocks max warnings: 5
Inodes grace time: [7 days]
Inodes max warnings: 5
Realtime Blocks grace time: [7 days]
Group quota state on /homee (/dev/loop1)
Accounting: ON
Enforcement: ON
Inode: #132 (2 blocks, 2 extents)
Blocks grace time: [7 days]
Blocks max warnings: 5
Inodes grace time: [7 days]
Inodes max warnings: 5
Realtime Blocks grace time: [7 days]
Project quota state on /homee (/dev/loop1)
Accounting: OFF
Enforcement: OFF
Inode: N/A
Blocks grace time: [--------]
Blocks max warnings: 0
Inodes grace time: [--------]
Inodes max warnings: 0
Realtime Blocks grace time: [--------]

设置限制值

设置限制容量语法为:

1
[root@localhost]# xfs_quota -x -c "limit [-ug] b[soft|hard]=N i[soft|hard]=N name" [mount_point]
  • [-ug], 指可以针对 user/group 来限制
  • bsoft/bhard, 指 block 的 soft/hard 限制, 可以加单位
  • isoft/ihard, 指 inode 的 soft/hard 限制
  • name, 指 user/group 的名称

设置用户的 quota

1
2
3
4
5
6
7
8
[root@localhost]# xfs_quota -x -c "limit -u bsoft=250M bhard=300M myquota1" /homee
[root@localhost]# xfs_quota -x -c "report -ubih" /homee
User quota on /homee (/dev/loop1)
Blocks Inodes
User ID Used Soft Hard Warn/Grace Used Soft Hard Warn/Grace
---------- --------------------------------- ---------------------------------
root 0 0 0 00 [------] 4 0 0 00 [------]
myquota1 0 250M 300M 00 [------] 0 0 0 00 [------]

设置用户组的 quota

1
2
3
4
5
6
7
8
[root@localhost]# xfs_quota -x -c "limit -g bsoft=950M bhard=1G myquotagrp" /homee
[root@localhost]# xfs_quota -x -c "report -gbih" /homee
Group quota on /homee (/dev/loop1)
Blocks Inodes
Group ID Used Soft Hard Warn/Grace Used Soft Hard Warn/Grace
---------- --------------------------------- ---------------------------------
root 0 0 0 00 [------] 3 0 0 00 [------]
myquotagrp 0 950M 1G 00 [------] 1 0 0 00 [------]

设置 grace time

设置 grace time 的语法为:

1
[root@localhost]# xfs_quota -x -c "timer [-ug] [-bir] Ndays" [mount_point]
  • -ug 指, user/group
  • -bir 指, block/inode
    如:
    1
    2
    3
    [root@localhost]# xfs_quota -x -c "timer -u -b 14days"/homee 
    [root@localhost]# xfs_quota -x -c "timer -g -b 14days"/homee
    [root@localhost]# xfs_quota -x -c "state" /homee

设置 project 的限制

注意此时应关闭 grpquota 选项而启用 prjquota, 在 /etc/fstab 文件中写入:

1
/dev/loop1 /homee xfs defaults,usrquota,prjquota 0 0

然后:

1
2
3
[root@localhost]# mount -a
[root@localhost]# xfs_quota -x -c "state"
[root@localhost]#

此时需要用两个配置文件来设置:

  • /etc/projects, 设置 project id 与 quota 目录的对应
  • /etc/projid, 设置 project name 与 project id 的对应
1
2
[root@localhost]# echo "11:/homee/myquota" >> /etc/projects
[root@localhost]# echo "myquotaproject:11" >> /etc/projid

(注意 id 和 name 都是自己随便取)

初始化一个 project (指定 project name):

1
2
3
[root@localhost]# xfs_quota -x -c "project -s myquotaproject"
[root@localhost]# xfs_quota -x -c "print" /homee
[root@localhost]# xfs_quota -x -c "report -pbih" /homee

设置容量限制:

1
2
[root@localhost]# xfs_quota -x -c "limit -p bsoft=450M bhard=500M myquotaproject" /homee
[root@localhost]# xfs_quota -x -c "report -pbih" /homee

Quota 的管理指令

  • disable, 暂时取消 quota 的限制, 系统本身还在计算 quota, 只是没有进行管制
  • enable, 恢复 quota 到正常的管制中 (与 disable 相互取消)
  • off, 完全关闭 quota 限制, 若还想启用则得重新挂载
  • remove, 在 off 状态下启用, 用于移除某个 quota 设置

暂时取消 quota 的限制

1
2
[root@localhost]# xfs_quota -x -c "disable -up" /homee
[root@localhost]# xfs_quota -x -c "state" /homee

恢复 quota 到正常的管制中

1
2
[root@localhost]# xfs_quota -x -c "enable -up" /homee
[root@localhost]# xfs_quota -x -c "state" /homee

完全关闭 quota 限制

1
2
[root@localhost]# xfs_quota -x -c "off -up" /homee
[root@localhost]# umount /homee; mount -a

移除某个 quota 设置

1
2
3
4
[root@localhost]# xfs_quota -x -c "off -up" /homee
[root@localhost]# xfs_quota -x -c "remove -p" /homee
[root@localhost]# umount /homee; mount -a
[root@localhost]# xfs_quota -x -c "report -pbh" /homee

Linux-磁盘配额-Quota
http://example.com/2024/03/22/Linux-磁盘配额-Quota/
作者
Jie
发布于
2024年3月22日
许可协议