磁盘配额 quota
磁盘配额 quota
对于多用户的Linux系统而言,磁盘空间总是很宝贵的,若某用户过度占用磁盘将影响其他用户的使用,若磁盘空间耗尽将会影响系统的正常运行。征对此种情况,我们可以通过磁盘配额限制普通用户最大能使用的磁盘空间。
quota
常用情况
- /home/ 限制家目录的空间
- httpd server 限制网站空间
- ftp server 限制网络共享空间
- mail server 限制邮件空间
磁盘配额quota限制的方式
- 通过属主限制
当用户添加了quota, 该用户创建的的文件所占的空间必须遵守限额规定。即对文件的属主生效。 - 通过属组限制
当属组添加了quota,主组是该组的用户所创建的文件所占的空间必须遵守限额的规定。即对文件的属组生效。
quota 限制方法
- 限制block,磁盘容量,一般使用这种方式
- 限制inode,创建文件的数量
柔性劝导(soft),硬性规定(hard),宽限期限(grace period )
- 柔性劝导(soft): 当磁盘空间使用超过soft(block/inode)规定的值时将在每次用户增加磁盘空间的时候均提醒用户,在未超过硬性规定值之前,不禁止用户增加使用空间。
- 硬性规定(hard): 当磁盘空间超过硬性规定值之后,用户将无法再增加磁盘的使用空间。
- 宽限期限(grace period ): 设置soft和hard的目的在于提前提醒用户空间将快使用完,而宽限期限是当用户使用的空间在soft和hard之间时,再增加日期的限定,当超过此日期(从超过soft的时间开始算起),用户能使用的最大空间将是soft设定的值。
实验
这里的磁盘配额针对单独的分区做限制,默认新分区未启用磁盘限额的功能,我们需在挂载分区时添加磁盘配额特性,并启用该功能。其次还需在分区所挂载的目录下生成限额数据库(quota.user, quota.group 分别征对用户和用户的主组),我们新建两个用户(user1, user2)和组(grp1),将用户user1,user2的主组设定为grp1,然后对这两个用户和组添加quota磁盘空间限制,测试用户和组在启用配额的分区空间的限制
第一步 配置实验环境
- 关闭SELinux
不关闭SELinux,将无法生成磁盘配额数据库,所以我们这里将其关闭
#停用SELinux
[root@zhubiaook work]# setenforce 0
#修改配置文件,禁止开机启动SELinux
[root@zhubiaook work]# cat /etc/selinux/config | grep "^SELINUX="
SELINUX=permissive
- 创建用户和组
#创建组grp1
[root@zhubiaook quota]# groupadd grp1
#增加用户user1, user2
[root@zhubiaook quota]# for user in user1 user2
> do
> useradd "$user" -g grp1
> echo "123" | passwd --stdin "$user"
> done
Changing password for user user1.
passwd: all authentication tokens updated successfully.
Changing password for user user2.
passwd: all authentication tokens updated successfully.
# 查看用户是否创建成功
[root@zhubiaook quota]# id user1
uid=505(user1) gid=505(grp1) groups=505(grp1)
[root@zhubiaook quota]# id user2
uid=506(user2) gid=505(grp1) groups=505(grp1)
- 创建分区
我们创建分区/dev/sdd1,作为本实验的限额分区
#分区之前
[root@zhubiaook work]# lsblk /dev/sdd
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sdd 8:48 0 5G 0 disk
# 使用fdisk创建分区
...
Command (m for help): n
Command action
e extended
p primary partition (1-4)
p
Partition number (1-4): 1
First cylinder (1-652, default 1): 1
Last cylinder, +cylinders or +size{K,M,G} (1-652, default 652): 652
Command (m for help): w
The partition table has been altered!
Calling ioctl() to re-read partition table.
Syncing disks.
#同步磁盘和内存的分区表(CentOS6系统,CentOS7使用partprobe同步)
[root@zhubiaook work]# partx -a /dev/sdd
#创建好的分区
[root@zhubiaook work]# lsblk /dev/sdd
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sdd 8:48 0 5G 0 disk
└─sdd1 8:49 0 5G 0 part
- 创建文件系统
此处我们对/dev/sdd1创建ext4文件系统
#创建ext4文件系统
[root@zhubiaook work]# mkfs.ext4 /dev/sdd1
#使用blkid可查看到文件系统已创建
[root@zhubiaook work]# blkid /dev/sdd1
/dev/sdd1: UUID="ffb444ac-7761-4366-8e17-8172f31e1afc" TYPE="ext4"
第二步 配置 quota
- 修改/etc/fstab,并挂载分区
在/etc/fstab中将/dev/sdd1记录添加进去,有两方面的作用,一方面是让系统启动自动挂载,另一方面将磁盘配额特性添加进去(usrquota, grpquota)
#创建挂载目录
[root@zhubiaook work]# mkdir /mnt/quota
#修改权限,以便普通用户能够在该目录下创建文件
[root@zhubiaook work]# chmod 1777 /mnt/quota
#将/dev/sdd1挂载的记录及特性添加到/etc/fstab中
[root@zhubiaook work]# cat /etc/fstab | grep quota
UUID=ffb444ac-7761-4366-8e17-8172f31e1afc /mnt/quota ext4 defaults,usrquota,grpquota 0 0
#挂载分区
[root@zhubiaook work]# mount -a
#确认sdd1是否挂载
[root@zhubiaook work]# df -Th /dev/sdd1
Filesystem Type Size Used Avail Use% Mounted on
/dev/sdd1 ext4 4.8G 10M 4.6G 1% /mnt/quota
- 创建quota数据库
quota是通过quota数据库实现限额的,该数据库中记录了用户能使用的最大空间,已使用的空间,及对用户发出空间将超限的警告,我们使用quotacheck自动生成,该数据库将在分区的根目录即挂载点下面生成。
# 使用quotacheck创建限额数据库,-c 创建,-u 征对用户quota.user,-g 征对组quota.group。
[root@zhubiaook work]# quotacheck -cug /mnt/quota/
[root@zhubiaook work]# ls /mnt/quota/
aquota.group aquota.user lost+found
- 启用quota
[root@zhubiaook work]# quotaon -guva
/dev/sdd1 [/mnt/quota]: group quotas turned on
/dev/sdd1 [/mnt/quota]: user quotas turned on
- 给用户添加限额空间
我们给用户user1, user2添加blcok的soft quota数量为8M, hard quota数量10M,组grp1的block数量soft为12M, hard为15M
#添加block限额
#此处需注意的是,该处的单位为1k,添加user1的block软性引导为8M,硬性限额为10M
[root@zhubiaook work]# edquota user1
1 Disk quotas for user user1 (uid 505):
2 Filesystem blocks soft hard inodes soft hard
3 /dev/sdd1 0 8000 10000 0 0 0
#添加宽限期限
[root@zhubiaook work]# edquota -t
1 Grace period before enforcing soft limits for users:
2 Time units may be: days, hours, minutes, or seconds
3 Filesystem Block grace period Inode grace period
4 /dev/sdd1 1days 1days
# 查看user1的限额
[root@zhubiaook quota]# quota -v user1
Disk quotas for user user1 (uid 505):
Filesystem blocks quota limit grace files quota limit grace
/dev/sdd1 0 8000 10000 0 0 0
# 将user1的quota的值复制给user2
[root@zhubiaook quota]# edquota -p user1 user2
[root@zhubiaook quota]# quota -v user1 user2
Disk quotas for user user1 (uid 505):
Filesystem blocks quota limit grace files quota limit grace
/dev/sdd1 0 8000 10000 0 0 0
# 查看user1,user2 quota的值
Disk quotas for user user2 (uid 506):
Filesystem blocks quota limit grace files quota limit grace
/dev/sdd1 0 8000 10000 0 0 0
# 修改grp1组的quota,soft为12M,hard为15M
[root@zhubiaook quota]# edquota -g grp1
1 Disk quotas for group grp1 (gid 507):
2 Filesystem blocks soft hard inodes soft hard
3 /dev/sdd1 0 12000 15000 0 0 0
第三部 测试
- 查看当前user1, user2, grp1空间使用情况
[root@zhubiaook quota]# quota -v -u user1 user2
Disk quotas for user user1 (uid 505):
Filesystem blocks quota limit grace files quota limit grace
/dev/sdd1 0 8000 10000 0 0 0
Disk quotas for user user2 (uid 506):
Filesystem blocks quota limit grace files quota limit grace
/dev/sdd1 0 8000 10000 0 0 0
[root@zhubiaook quota]# quota -v -g grp1
Disk quotas for group grp1 (gid 507):
Filesystem blocks quota limit grace files quota limit grace
/dev/sdd1 0 12000 15000 0 0 0
- user1用户分别写入9M和20M的数据,测试限额是否生效
# 写入9M的数据
[root@zhubiaook quota]# su user1
[user1@zhubiaook quota]$ dd if=/dev/zero of=./user1_file1 bs=1M count=9
sdd1: warning, user block quota exceeded. <=超过8M就提醒用户
9+0 records in
9+0 records out
9437184 bytes (9.4 MB) copied, 0.02993 s, 315 MB/s
# 虽然已超过soft值,但未超过hard值,仍然可以写入
[user1@zhubiaook quota]$ ll -h user1_file1
-rw-rw-r--. 1 user1 user1 9.0M Aug 10 11:45 user1_file1
# 向该目录下写入20M的数据
[user1@zhubiaook quota]$ dd if=/dev/zero of=./user1_file1 bs=1M count=20
sdd1: warning, user block quota exceeded.
sdd1: write failed, user block limit reached.
dd: writing `./user1_file1': Disk quota exceeded <=超过的数据写入失败
10+0 records in
9+0 records out
10240000 bytes (10 MB) copied, 0.0308164 s, 332 MB/s <=只能写入10M的数据
[user1@zhubiaook quota]$ ll -h user1_file1
-rw-rw-r--. 1 user1 user1 9.8M Aug 10 11:47 user1_file1
- 测试组grp1 的quota是否生效
当前quota分区中,user1有10M的数据,user2无数据,虽然user2的限额为soft8M, hard10M, 但他们两个用户的基本组配额是soft 12M, hard15M, 若组限额生效,则用户user2只能最多写入5M的数据,并且超过2M时将警告
# 切换到用户user2
[root@zhubiaook quota]# su user2
[user2@zhubiaook quota]$ du -sh
9.8M .
# user2写入3M数据
[user2@zhubiaook quota]$ dd if=/dev/zero of=user2_file2 bs=1M count=3
sdd1: warning, group block quota exceeded. <=超过组限额soft值警告
3+0 records in
3+0 records out
3145728 bytes (3.1 MB) copied, 0.00713016 s, 441 MB/s
# user2写入7M数据
[user2@zhubiaook quota]$ dd if=/dev/zero of=user2_file2 bs=1M count=7
sdd1: write failed, group block limit reached.
dd: writing `user2_file2': Disk quota exceeded <=超过组限额hard值的数据将写入失败
5+0 records in
4+0 records out
5120000 bytes (5.1 MB) copied, 0.0205964 s, 249 MB/s
[user2@zhubiaook quota]$ ll user2_file2
-rw-r--r--. 1 user2 grp1 5120000 Aug 10 12:20 user2_file2
[user2@zhubiaook quota]$ ll -h user2_file2
-rw-r--r--. 1 user2 grp1 4.9M Aug 10 12:20 user2_file2