磁盘配额是对每个用户可以使用的磁盘空间进行限制,限制每个用户可以使用的磁盘空间的大小。磁盘配额的设定对象是能够实施读写操作的块设备,而且必须要有正确的文件系统。磁盘配额可以限制用户和组的访问行为,比如为指定用户限制磁盘使用量,通过磁盘空间进行限制(一个block的限制,代表1KB存储空间)或者通过inode进行限制。也可以直接通过组的方式来限制指定组中所有成员的磁盘使用量的总和。
在进行磁盘配额的限制的时候可以有两种方式,第一种比较人性化,叫做soft limit——软限制,这种限制是当用户的磁盘使用量达到软配额限制,将会启动宽限期倒计时;在倒计时归0之前,用户可以正常使用剩余的配额量,但一旦倒计时归0,用户将不能继续使用磁盘空间,除非将数据进行清理,低于软限制,而后可以继续使用磁盘空间。也就是说当一个用户使用的磁盘空间达到了限制的上限之后,先进行提醒,如果一段时间之后还是没有改变,再对其进行处理。与此相对的就是 hard limit——硬限制了,这种限制是用户所能够使用的磁盘空间的真正上限,一旦达到这个上限了,不再提醒,直接对用户进行处理,处理的方法可以是关闭用户使用磁盘的权利。一般来讲,软限制要比硬限制的数值要小一些,比如软限制可以是90M,硬限制可以是120M。一般在一个系统中软、硬限制都会存在,也就是先对用户进行提醒,用户可以继续使用,但是用户不能达到硬限制。 在Linux中默认的宽限期为7天,当一个用户达到了软限制,还能够在这7天中继续使用磁盘,直到到了7天这个期限之后,就会强制的对用户进行处理。
如果想要让分区或卷能够支持磁盘配额的设定,需要单独的挂载选项,也就是在挂载的时候加上usrquota和grpquota这两个选项
首先建立一个能够挂载的磁盘,比如在我的系统中有磁盘/dev/sdc,在这个磁盘中使用fdisk /dev/sdc 命令来建立一个 /dev/sdc1 磁盘:
[[email protected] ~]# fdisk /dev/sdc 欢迎使用 fdisk (util-linux 2.23.2)。 更改将停留在内存中,直到您决定将更改写入磁盘。 使用写入命令前请三思。 Device does not contain a recognized partition table 使用磁盘标识符 0x9de7a864 创建新的 DOS 磁盘标签。 命令(输入 m 获取帮助):n Partition type: p primary (0 primary, 0 extended, 4 free) e extended Select (default p): Using default response p 分区号 (1-4,默认 1): 起始 扇区 (2048-41943039,默认为 2048): 将使用默认值 2048 Last 扇区, +扇区 or +size{K,M,G} (2048-41943039,默认为 41943039): 将使用默认值 41943039 分区 1 已设置为 Linux 类型,大小设为 20 GiB 命令(输入 m 获取帮助):w The partition table has been altered! Calling ioctl() to re-read partition table. 正在同步磁盘。 [[email protected] ~]#
在建立之后将其进行格式化,装上ext4文件系统:
[[email protected] ~]# mkfs.ext4 /dev/sdc1 mke2fs 1.42.9 (28-Dec-2013) 文件系统标签= OS type: Linux 块大小=4096 (log=2) 分块大小=4096 (log=2) Stride=0 blocks, Stripe width=0 blocks 1310720 inodes, 5242624 blocks 262131 blocks (5.00%) reserved for the super user 第一个数据块=0 Maximum filesystem blocks=2153775104 160 block groups 32768 blocks per group, 32768 fragments per group 8192 inodes per group Superblock backups stored on blocks: 32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208, 4096000 Allocating group tables: 完成 正在写入inode表: 完成 Creating journal (32768 blocks): 完成 Writing superblocks and filesystem accounting information: 完成
然后建立一个挂载点:
[[email protected] ~]# mkdir /tmp/sdc
在建立之后就可以将刚才的磁盘挂载到这个挂载点上,但是在这里需要注意的是必须加上usrquota和grpquota选项才能使用用户配额,格式如下:
~]# mount -o usrquota,grpquota DEVICE MOUNT_POINT
或者在/etc/fstab文件中写入以下内容:
DEVICE MOUNT_POINT FSTYPE defaults,usrquota,grpquota 0 0
举例如下:
[[email protected] ~]# mount -o usrquota,grpquota /dev/sdc1 /tmp/sdc/
此时使用mount命令查看挂载的详细内容就会发现多了/dev/sdc1的挂载信息,并且有了usrquota和grpquota选项:
[[email protected] ~]# mount | grep "/sdc1" /dev/sdc1 on /tmp/sdc type ext4 (rw,relatime,seclabel,quota,usrquota,grpquota,data=ordered) [[email protected] ~]#
在进行了以上的挂载操作之后就可以在这块磁盘上进行用户的配额管理了。进行配额管理使用需要两个重要的文件,一个是aquota.group,这个文件是为了对组进行配额;另一个是aquota.user,这个文件是为了对用户进行配额。在一个磁盘新挂载的之后是没有这两个文件的,需要使用下面这个命令来进行创建:
quotacheck命令:
quotacheck - scan a filesystem for disk usage, create, check and repair quota files
选项:
-v, --verbose:显示整个操作过程的详细信息
-u, --user:创建,检测和修复用户配额文件
-g, --group:创建,检测和修复组配额文件
-c, --create-files:经过检测,如果没有用户配额文件和或组配额文件,就安装用户给定的选项来进行文件的创建;
-a, --all:所有的在/etc/fstab文件中包含了与配额有关的挂载选项的设备上,是否有对应选项的配额文件;
在使用了这个命令之后就会产生两个文件:
[[email protected] ~]# quotacheck -u -g /tmp/sdc/ [[email protected] ~]# ls /tmp/sdc/ aquota.group aquota.user lost+found [[email protected] ~]#
这两个文件分别有自己的功能,当然如果只是需要对用户进行配额,则不需要aquota.group这个文件,反过来也是,在使用的时候根据自己的需要来进行命令的使用。
在这两个文件创建完毕了之后,就可以对用户或组进行磁盘配额了,使用的命令是:
edquota
-u, --user:编写用户配额,默认的功能;
-g, --group:编写组配额,不推荐使用;
-t, --edit-period:设置超出软限制的宽限期;默认7天,可以选择以秒,分钟,小时,天等时间单位;
在使用这个命令时,比如为一个用户“test”的配额进行限制:
[[email protected] ~]# edquota -u test
在这条命令执行之后就会进入vim的界面,我们可以在这个界面中对用户的配额进行修改:
Disk quotas for user test (uid 1006): Filesystem blocks soft hard inodes soft hard /dev/sdc1 0 0 0 0 0 0 ~ ~ ~
在这个vim界面中我们可以看到能够修改的选项有块数(文件的大小,单位是KB)的软限制和硬限制还有inode的软限制和硬限制,在这里我对块数的软限制和硬限制进行修改,修改的方法是直接对数值进行修改,然后保存这个文件即可:
Disk quotas for user test (uid 1006): Filesystem blocks soft hard inodes soft hard /dev/sdc1 0 1000 2000 0 0 0 ~ ~ ~
在进行了修改保存后,必须使用以下命令来使配额功能生效或失效:
quotaon(是配额功能生效), quotaoff(是配额功能失效)
quotaon, quotaoff - turn filesystem quotas on and off
第一种用法是不指定磁盘:
[[email protected] ~]# quotaon -avug /dev/sdc1 [/tmp/sdc]: group quotas turned on /dev/sdc1 [/tmp/sdc]: user quotas turned on [[email protected] ~]#
[[email protected] ~]# quotaoff -avug /dev/sdc1 [/tmp/sdc]: group quotas turned off /dev/sdc1 [/tmp/sdc]: user quotas turned off [[email protected] ~]#
或者直接指定磁盘:
quotaon|quotaoff /dev/sdb1
查看配额的使用情况
quota:显示用户的磁盘配额,后头要跟上用户的名称
quota - display disk usage and limits
[[email protected] sdc]# quota test Disk quotas for user test (uid 1006): Filesystem blocks quota limit grace files quota limit grace /dev/sdc1 2000* 1000 2000 6days 2 0 0 [[email protected] sdc]#
在这个例子中,我将块数的软限制改为1M,硬限制改为2M,在保存之后将当前用户切换到test,之后可以使用这个用户通过dd命令建立一个1M的文件(在创建之前首先要确保这个用户对这个文件拥有写入权限,如果没有要赋予):
[[email protected] sdc]$ dd if=/dev/zero bs=1024 count=2000 of=/tmp/sdc/FILE1_2M 记录了2000+0 的读入 记录了2000+0 的写出 2048000字节(2.0 MB)已复制,0.00675606 秒,303 MB/秒
此时在/tmp/sdc文件中test用户使用的磁盘空间就占去了2M的空间,如果再次使用这个命令就会报错:
[[email protected] sdc]$ dd if=/dev/zero bs=1024 count=2000 of=/tmp/sdc/FILE2_2M sdc1: write failed, user block limit reached. dd: 写入"/tmp/sdc/FILE2_2M" 出错: 超出磁盘限额 记录了1+0 的读入 记录了0+0 的写出 0字节(0 B)已复制,0.000285576 秒,0.0 kB/秒 [[email protected] sdc]$
repquota:查看磁盘配额的使用情况,只有root用户可以使用
repquota - summarize quotas for a filesystem
[[email protected] sdc]# repquota -avug *** Report for user quotas on device /dev/sdc1 Block grace time: 7days; Inode grace time: 7days Block limits File limits User used soft hard grace used soft hard grace ---------------------------------------------------------------------- root -- 20 0 0 2 0 0 test +- 2000 1000 2000 6days 2 0 0 Statistics: Total blocks: 7 Data blocks: 1 Entries: 2 Used average: 2.000000 *** Report for group quotas on device /dev/sdc1 Block grace time: 7days; Inode grace time: 7days Block limits File limits Group used soft hard grace used soft hard grace ---------------------------------------------------------------------- root -- 1020 0 0 3 0 0 test -- 2000 0 0 2 0 0 Statistics: Total blocks: 7 Data blocks: 1 Entries: 2 Used average: 2.000000 [[email protected] sdc]#
注意:在使用磁盘配额的时候,无论进行怎样的操作, root都不受磁盘配额限制,最多只能对root用户进行提醒,所以root的权限是非常大的,在没有必要的时候尽量不要使用root用户进行登陆。