在分区上启用配额
为了本文,我将只在 /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
setquota 命令设置和更改用户、组或者文件集的配额限制。
在 Linux 中,执行Quota用于限制每个用户/组的存储消耗。