在分区上启用配额

为了本文,我将只在 /tmp 分区上启用 userquota。

为相应的分区添加“usrquota”,如下所示。
如果我们还希望为特定组实施配额,则还要添加“grpquota”

# vim /etc/fstab
/dev/mapper/system-tmp  /tmp                    ext4    defaults,nodev,usrquota        1 2

接下来重新挂载文件系统以使更改生效

# mount -o remount /tmp/

验证更改

# mount | grep quota
/dev/mapper/system-tmp on /tmp type ext4 (rw,nodev,relatime,quota,usrquota,stripe=64,data=ordered)

正如你现在看到的,我的 /tmp 分区用 usrquota 重新挂载。

接下来,我们必须在相应分区下创建用户配额文件。

# quotacheck -vcum /tmp/
quotacheck: Scanning /dev/mapper/system-tmp [/tmp] done
quotacheck: Cannot stat old user quota file /tmp/aquota.user: No such file or directory. Usage will not be subtracted.
quotacheck: Old group file name could not been determined. Usage will not be subtracted.
quotacheck: Checked 37 directories and 63 files
quotacheck: Old file not found.

这将在 /tmp 下创建“aquota.user”文件。
由于我们是第一次运行此命令,因此我们收到错误“没有这样的文件或者目录”。
我使用“-m”是因为该命令是在分区处于挂载状态的正在运行的节点上执行的,因此我不想重新挂载。
如果我们处于单用户模式,则使用可以从上述命令中排除“-m”。

准备工作:

  • 必须安装配额 rpm软件包:quota
  • 必须在我们希望实现该功能的文件系统/分区上启用配额。

添加/设置宽限期

当我们达到软配额限制时,宽限期开始。
我们可以写入直到宽限期到期,或者直到达到硬配额限制。
硬限制由文件系统强制执行,当我们达到硬配额限制时,我们无法存储任何其他数据,直到我们回到配额限制以下。

如果我们在设置配额限制时未分配任何宽限期,则默认情况下,块和 inode 限制都考虑 7 天的宽限期。

我们可以使用“setquota”或者“edquota”分配宽限期

方法 1:使用 setquota
要使用 setquota 分配宽限期,请使用以下语法

setquota [-u|-g] <user|group> -t <blockgrace> <inodegrace>

注意:此处必须以秒为单位给出宽限期值

例如,我想给予 5 天的宽限期

5* 24 (hours) * 60 (minutes) *60 (seconds) = 432000 seconds

因此,为块和 inode 限制设置 5 天宽限期的命令将是

# setquota -t 432000 432000 /tmp/

检查配额报告

# repquota -s /tmp/
*** Report for user quotas on device /dev/mapper/system-tmp
Block grace time: 5days; Inode grace time: 5days
Space limits                File limits
User            used    soft    hard  grace    used  soft  hard  grace
---------------------------------------------------------------------
root      --  25824K      0K      0K             80     0     0
ankit     --     68K      0K      0K             21     0     0
jack    --   3912K   8192M  10240M              1     0     0

所以一切看起来都很好。

方法二:使用edquota
我们还可以使用“edquota”编辑相应文件系统的配额以使用以下命令修改宽限期

# 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/mapper/system-tmp                  5days                  5days

这种方法的另外优点是,我们可以在此处使用“天、小时、分钟或者秒”等值来分配宽限期,而 setquota 则必须仅以秒为单位提供值。

完成更改后,我们可以使用“wq!”保存并退出文件。

注意:宽限期是基于分区/文件系统而不是基于用户提供的。

分配/编辑配额块限制

要首次分配块限制,我们可以使用“setquota”,也可以使用“edquota”。
使用“setquota”我们可以直接设置配额,而使用“edquota”我们将编辑现有的配额值,因此可以使用

如何检查我的节点上可用的总块数和 inode 数?

在我开始解释设置或者分配配额的步骤之前,有人如何知道相应分区可用的 inode 限制或者块限制?
要检查这一点,我们可以使用 tune2fs 工具。

在 RHEL 7 上,tune2fs 由“e2fsprogs”rpm 提供,因此我们可以使用“yum”安装它

# yum install e2fsprogs

接下来使用以下语法以及我们想要获取详细信息的文件系统名称。
在我们的例子中它是“/dev/mapper/system-tmp”

# tune2fs -l /dev/mapper/system-tmp

这将为我们提供一长串详细信息,但为了本文的目的,我们将坚持我们可以执行以下命令的块和 inode 计数

# tune2fs -l  /dev/dm-7 | grep -e "Inode count|Block count"
Inode count:              2621440
Block count:              10485760

如我们所见,此文件系统将允许总 inode 数为 2621440 和 10485760 块。

要获得分区的大小,我们可以使用以下公式

10485760 * 4096 = 42949672960/1024 = 41943040/1024 = 40960/1024 = 40GB

所以我们的 /tmp 分区是 40GB。

方法 1:使用 setquota
下面是要使用的语法

setquota [-u|-g] <user|group> <block-softlimit> <block-hardlimit> <inode-softlimit> <inode-hardlimit>

在下面的命令中,我为“jack”用户的 /tmp 分区的块限制设置了 8GB 的软限制和 10GB 的硬限制。

# setquota -u jack 8388608 10485760 0 0 /tmp/

注意:提供的块软硬限制值必须以字节为单位。

8388608/1024 = 8192/1024 = 8GB
10485760/1024 = 10240/1024 = 10GB

如果我们还希望限制 inode 计数限制,那么我们可以修改上述命令如下

# setquota -u jack 8388608 10485760 100 120 /tmp/

方法二:使用edquota
Accodingly 如果你想使用“edquota”然后运行带有“-u”参数的命令,如下所示

# edquota -u jack
Disk quotas for user jack (uid 1005):
Filesystem                   blocks       soft       hard     inodes     soft     hard
/dev/mapper/system-tmp            0    8388608   10485760          0        0        0

这将向我们显示当前为用户“jack”设置的配额限制。
在这里我们可以进行修改,然后使用“wq!”保存并退出文件。

接下来可以查看当前分配配额的报告

# repquota /tmp/
*** Report for user quotas on device /dev/mapper/system-tmp
Block grace time: 7days; Inode grace time: 7days
Block limits                File limits
User            used    soft    hard  grace    used  soft  hard  grace
---------------------------------------------------------------------
root      --   25824       0       0             80     0     0
ankit     --      68       0       0             21     0     0

为什么我的“jack”用户没有显示在上面的 repquota 命令中?

我们可能已经注意到,上面的 repquota 仅显示“root”和“ankit”用户的状态,而不显示“jack”用户的状态。
这是因为当前用户“jack”还没有在 /tmp 下创建任何文件,所以没有什么可显示的。

我们可以使用以下命令获取 repquota 的更多详细信息输出

# repquota -sv /tmp/
*** Report for user quotas on device /dev/mapper/system-tmp
Block grace time: 7days; Inode grace time: 7days
Space limits                File limits
User            used    soft    hard  grace    used  soft  hard  grace
---------------------------------------------------------------------
root      --  25824K      0K      0K             80     0     0
ankit     --     68K      0K      0K             21     0     0
jack    --      0K   8192M  10240M              0     0     0
Statistics:
Total blocks: 7
Data blocks: 1
Entries: 3
Used average: 3.000000

如我们所见,由于当前使用的块限制和 inode 限制为“0”,因此 repquota 默认不会显示有关此用户的任何详细信息,除非在提供的文件系统下存在由相应用户拥有的任何文件。

一旦我使用 /tmp 下的“jack”用户创建了一个虚拟文件,我就能够获得如下所示的配额报告

# repquota /tmp/
*** Report for user quotas on device /dev/mapper/system-tmp
Block grace time: 7days; Inode grace time: 7days
Block limits                File limits
User            used    soft    hard  grace    used  soft  hard  grace
---------------------------------------------------------------------
root      --   25824       0       0             80     0     0
ankit     --      68       0       0             21     0     0
jack    --    3912 8388608 10485760             1     0     0

特点

  • 限制每个用户/组的存储消耗
  • 基于磁盘块使用情况或者 inode 使用情况
  • 分 2 个阶段(阈值)施加:软和硬

软限制:可能会超过提供的宽限期
硬限制:在任何情况下都不得超过。一旦达到此值,磁盘将不允许再写入任何数据

验证配额限制

我将在 /tmp 分区上写入一些虚拟数据并监控我的配额限制

$dd if=/dev/urandom of=file.txt bs=10485762121 count=10000
dd: warning: partial read (33554431 bytes); suggest iflag=fullblock
dm-7: warning, user block quota exceeded.
dm-7: write failed, user block limit reached.
dd: error writing âfile.txtâ: Disk quota exceeded
0+320 records in
0+319 records out
10733408256 bytes (11 GB) copied, 68.281 s, 157 MB/s

正如我们所看到的,一旦达到软限制,就会打印一条警告消息,但写入仍在继续。
一旦达到硬限制,则“dd”命令的写入失败

以下是配额报告

# repquota /tmp/
*** Report for user quotas on device /dev/mapper/system-tmp
Block grace time: 5days; Inode grace time: 5days
Block limits                File limits
User            used    soft    hard  grace    used  soft  hard  grace
---------------------------------------------------------------------
root      --   25824       0       0             80     0     0
ankit     --      68       0       0             21     0     0
jack    +- 10485760 8388608 10485760  4days       2     0     0

如我们所见,用户名后面出现了一个“+”(加号),这表示已达到配额限制并反映了宽限期值,这意味着现在我还有 4 天的时间来清除数据。

检查配额报告

要检查 Linux 机器上配额的现有使用情况,请执行以下命令

# repquota -a
*** Report for user quotas on device /dev/mapper/system-tmp
Block grace time: 7days; Inode grace time: 7days
Block limits                File limits
User            used    soft    hard  grace    used  soft  hard  grace
---------------------------------------------------------------------
root      --   21912       0       0             79     0     0
ankit     --      68       0       0             21     0     0

这将为我们提供文件系统当前块和 inode 使用情况的简要报告。
对于我们的案例 wince,我们只启用了配额,但没有分配任何软或者硬限制,因此大多数部分都是空的。

打开或者关闭配额

现在我们正在为用户和文件系统分配和修改配额限制,但我们是否知道配额是否已启用?

如果配额未处于启用状态,则分配这些限制没有意义。

检查配额的当前状态

# quotaon -ap
group quota on /tmp (/dev/mapper/system-tmp) is off
user quota on /tmp (/dev/mapper/system-tmp) is off

如我们所见,/tmp 分区禁用了用户和组配额。
由于在本文中我们仅使用用户配额,因此我不会启用 groupquota

启用用户配额

# quotaon -u /tmp/

如果我们还希望启用组配额,那么我们可以组合两个参数“-ug”,也可以单独执行命令。

# quotaon -g /tmp/

接下来再次检查状态

# quotaon -ap
group quota on /tmp (/dev/mapper/system-tmp) is off
user quota on /tmp (/dev/mapper/system-tmp) is on

所以现在我们的文件系统上为用户启用了配额。

要关闭 /tmp 分区上用户和组的配额,请使用以下命令

# quotaoff -ug /tmp
在 Linux 中为用户设置配额?

setquota 命令设置和更改用户、组或者文件集的配额限制。
在 Linux 中,执行Quota用于限制每个用户/组的存储消耗。

日期:2020-06-02 22:17:19 来源:oir作者:oir