一天一点学习Linux之RHEL6系统上的磁盘配额

2011年05月31日 Linux基础 评论 13 条 阅读 19,724 views 次

在生产或工作环境中,你可能会遇到这样的情况:在多人多任务的环境下,有多人共用一个磁盘空间,而有部分人可能向这个共同的空间上放很多或很大的文件,而导致磁盘空间极速减少。这样必然导致其他人的空间会迅速变小。为了让大家有个平等的使用磁盘空间的权限,我们就需要用到磁盘配额。我来限制用户对空间的使用情况。在Linux系统下,用quota来实现此功能。

除了上面的情况外,一般还用在下面的一些场景中
在一些提供web服务的空间中,每个人的网页空间的容量都是受限制的。
在邮件服务中,每个人的邮件空间也是受限制。
在公司的文件共享服务中,每个人使用的硬盘空间也是需要限制。
而针对Linux的主机,如果是多个用户的话,也是需要考虑到用户和用户组的限制。

注意事项:
1、磁盘配额加载于内核中
2、只适用于ETX2/EXT3/EXT4文件系统,对目录是不起作用的哦,这一点要特别注意,虽然挂载点是一个目录,但他实际上是文件系统设备。
3、只针对于户或用户组,但root除外
4、针对用户组的限额,是指某个用户组中的所有成员一起使用的限制而不是每个人所使用的限制

在开始操作前,我们来看看和quota配置相关的内容
inode:限制用户可以建立的文件数量
block:限制用户磁盘的容量,以KB为单位
soft:软限制。就是在超过这个值后,会提醒用户,但用户的权限还没有被限制。
hard:硬限制。这是最高的限制,用户或组绝对不会超过这个限制值。如果超过了,就限制死了用户的使用权限了。
grace time:宽限时间。这个就是当达到soft限制时,还没有到达hard限制的时候,用来提醒用户的。如果在警告的天数之内,用户都不进行任何磁盘管理操作,那么soft限制值会即刻取代hard限值来作为quota的限制,就算你没有达到hard限制,也用不了了。

下面开始我们的演示操作

[root@yufei ~]# df
Filesystem           1K-blocks      Used Available Use% Mounted on
/dev/sda1             15118728   7242960   7107768  51% /
tmpfs                   255784         0    255784   0% /dev/shm

我的RHEL6系统,因为是一个虚拟机,所以没有太多设置,只有一个根分区,没得选择,我们就对根分区来进行磁盘配额。还有要提醒一点,你的系统中要有至少两个用户,因为磁盘配额对ROOT用户不起作用。

第一步:重新挂载文件系统或者是修改/etc/fstab文件

因为重新挂载只针对当前有效果,如果想下次开机也起作用,就需要把配额的参数写入fstab文件中。

[root@yufei ~]# mount
/dev/sda1 on / type ext4 (rw)
省略无用信息
我们看到/分区下没有配额参数,所以我们需要重新挂载。
[root@yufei ~]# mount -o usrquota,remount /
[root@yufei ~]# mount
/dev/sda1 on / type ext4 (rw,usrquota)

现在有了,启用了对用户的配额限制。

第二步:创建磁盘配额数据库

[root@yufei ~]# ls / |grep quota
[root@yufei ~]# quotacheck -cvum /dev/sda1
quotacheck: Your kernel probably supports journaled quota but you are not using it. Consider switching to journaled quota to avoid running quotacheck after an unclean shutdown.
quotacheck: Scanning /dev/sda1 [/] done
quotacheck: Cannot stat old user quota file: No such file or directory
quotacheck: Old group file not found. Usage will not be substracted.
quotacheck: Checked 12514 directories and 98071 files
quotacheck: Old file not found.
[root@yufei ~]# ls / |grep quota
aquota.user

看到aquota.user这个用户的配置文件后,那说明我们创建成功了
这里介绍一个几个参数的作用
-c:创建磁盘配额数据库文件
-v:查看创建的过程
-u:创建用户的磁盘配额数据库文件
-g:创建用户组的磁盘配额数据库文件
-a:创建所有磁盘的配额数据库文件,使用此参数的时候,后面就不用接设备了
-m:把以前的磁盘配额信息清除,在对/分区创建的时候,必需用此参数

第三步:启动磁盘配额

[root@yufei ~]# quotaon /dev/sda1

第四步:编辑磁盘配额文件

[root@yufei ~]# edquota yufei
Disk quotas for user yufei (uid 500):
  Filesystem                   blocks       soft       hard     inodes     soft     hard
  /dev/sda1                      1060          0          0        159        0        0

这主文件中的内容后面的限制作用是什么,我们在上面已经说了,这里就不啰嗦了,这里面已经有的blocks和inodes是指这个用户现在在已经存在的相关文件与大小,以K为单位哦!
上面显示的内容大概意思就是
用户yufei(uid 500)
在/dev/sda1上所占用的空间是1060K,没有任何的限制,文件数为159,也没有任何的限制。
其实上面的编辑方式是调用vi的,所以你可以自由编辑!
我们把限制全部加上。

Disk quotas for user yufei (uid 500):
  Filesystem                   blocks       soft       hard     inodes     soft     hard
  /dev/sda1                    1060         5120       10240    159        162      165

然后保存退出

第五步:查询用户的磁盘配额情况

[root@yufei ~]# quota yufei
Disk quotas for user yufei (uid 500): 
     Filesystem  blocks   quota   limit   grace   files   quota   limit   grace
      /dev/sda1    1060    5120   10240             159     162     165

从查询的结果来看,yufei用户有5M的空间,但最多不超过10M。文件数量为162个,但最多不超过165个。

第六步:测试

这一步在实际工作没有啦,我们只是为了演示,才做的这一步。当然,如果你想在实际工作中测试的话,也是可以的。

[root@yufei ~]# su - yufei
[yufei@yufei ~]$ mkdir test
[yufei@yufei ~]$ cd test/
[yufei@yufei test]$ dd if=/dev/zero of=file1 bs=1M count=2
2+0 records in
2+0 records out
2097152 bytes (2.1 MB) copied, 0.008217 s, 255 MB/s
[yufei@yufei test]$ dd if=/dev/zero of=file2 bs=1M count=2
2+0 records in
2+0 records out
2097152 bytes (2.1 MB) copied, 0.00576349 s, 364 MB/s
[yufei@yufei test]$ dd if=/dev/zero of=file3 bs=1M count=2
2+0 records in
2+0 records out
2097152 bytes (2.1 MB) copied, 0.00753033 s, 278 MB/s
[yufei@yufei test]$ ls -l
total 6144
-rw-rw-r--. 1 yufei yufei 2097152 May 29 21:03 file1
-rw-rw-r--. 1 yufei yufei 2097152 May 29 21:03 file2
-rw-rw-r--. 1 yufei yufei 2097152 May 29 21:03 file3

创建了3个2M的文件,外加一个test目录,这时候我们再来看看用户的配额情况

[yufei@yufei test]$ quota
Disk quotas for user yufei (uid 500): 
     Filesystem  blocks   quota   limit   grace   files   quota   limit   grace
      /dev/sda1    7208*   5120   10240   6days     163*    162     165   6days

这时候我们看到的信息就和前面的不一样了,超过软限制的,就带上了*号了。而且宽限时间为6天。在目前的情况下,我最多还能创建2个文件,最多还能有2M多的空间。
下面我们继续来增加文件。

[yufei@yufei test]$ touch touchfile1
[yufei@yufei test]$ touch touchfile2
[yufei@yufei test]$ touch touchfile3
touch: cannot touch `touchfile3': Disk quota exceeded

看到没有,当我们再创建第三个文件的时候,提示,超过磁盘配额了。

[yufei@yufei test]$ ls touchfile*
touchfile1  touchfile2
第三个文件没有创建成功啊!!

因为空间没有还是有的,我可以继续向里面增加数据。但文件是增加不了。我们接下来测试数据的空间限制。

[yufei@yufei test]$ rm -fr touchfile*
[yufei@yufei test]$ dd if=/dev/zero of=file4 bs=1M count=2 
2+0 records in
2+0 records out
2097152 bytes (2.1 MB) copied, 0.00672323 s, 312 MB/s

这时间的空间还有不到1M,我们再来创建个2M的文件,看看会出现什么样的情况。

[yufei@yufei test]$ dd if=/dev/zero of=file5 bs=1M count=2 
dd: writing `file5': Disk quota exceeded
1+0 records in
0+0 records out
1007616 bytes (1.0 MB) copied, 0.0059845 s, 168 MB/s

注意最上面的一行,提示超出磁盘配额。

[yufei@yufei test]$ ls -l
total 9176
-rw-rw-r--. 1 yufei yufei 2097152 May 29 21:03 file1
-rw-rw-r--. 1 yufei yufei 2097152 May 29 21:03 file2
-rw-rw-r--. 1 yufei yufei 2097152 May 29 21:03 file3
-rw-rw-r--. 1 yufei yufei 2097152 May 29 21:20 file4
-rw-rw-r--. 1 yufei yufei 1007616 May 29 21:22 file5

我们也发现,第5个文件也是创建了,但大小只有1M,如果说,这是一个2M数据文件,只拷贝了1M的话,也是不能用的。

这时候所有的限制都到达了最高了,只有用户进行清理后,才能正常使用。
再来查看一下我们的限额情况

[yufei@yufei test]$ quota
Disk quotas for user yufei (uid 500): 
     Filesystem  blocks   quota   limit   grace   files   quota   limit   grace
      /dev/sda1   10240*   5120   10240   6days     165*    162     165   6days

[yufei@yufei test]$ rm -f file5
[yufei@yufei test]$ rm -f file4
[yufei@yufei test]$ rm -f file3

删除三个文件,我们再来查看限额情况

[yufei@yufei test]$ quota
Disk quotas for user yufei (uid 500): 
     Filesystem  blocks   quota   limit   grace   files   quota   limit   grace
      /dev/sda1    5160*   5120   10240   6days     162     162     165

这时候只有磁盘的空间还在超限中,而文件数量处于正常,这时候文件数量的宽限天数又为空了。而且文件数量后面的*号也没有了。

quota的实用命令

OK,我们的测试也就完工了。当然关于用户组的限额设置与用户的设置方法一样,只是edquota user 变成edquota group而已。但针对用户组的限额是整个用户组,而不是里面的单个成员啊。下面再给大家介绍点quota的相关知识。

1、不用edquota编辑文件,直接用命令来配置
格式如下
setquota user blocks限制 inode限制 文件系统
setquota username 4096 5120 40 50 /home
演示如下

[yufei@yufei test]$ quota
Disk quotas for user yufei (uid 500): 
     Filesystem  blocks   quota   limit   grace   files   quota   limit   grace
      /dev/sda1    5160*   5120   10240   6days     162     162     165  
[root@yufei ~]# exit
[root@yufei ~]# setquota yufei 10240 20280 170 200 /dev/sda1
[root@yufei ~]# quota yufei
Disk quotas for user yufei (uid 500): 
     Filesystem  blocks   quota   limit   grace   files   quota   limit   grace
      /dev/sda1    5160   10240   20280             162     170     200

2、复制磁盘配额配置文件
格式
edquota -p user1 user2 user3
把user1的信息复制给多个用户

[root@yufei ~]# useradd user2
[root@yufei ~]# quota user2
Disk quotas for user user2 (uid 501): none
[root@yufei ~]# edquota -p yufei user2
[root@yufei ~]# quota user2
Disk quotas for user user2 (uid 501): 
     Filesystem  blocks   quota   limit   grace   files   quota   limit   grace
      /dev/sda1      32   10240   20280               9     170     200

3、设置宽限时间
edquota -t 后面不加参数,这个是设置全局
edquota -T user/uid 针对某个用户

[root@yufei ~]# 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/sda1                     7days                  7days

从这个文件中可以看到。默认的宽限天数是7天啊!
这里面的时间只能用 days, hours, minutes, or seconds这四种。

4、查看磁盘配额的报表情况

repquota -a查系统中所有用户的配额情况报表
[root@yufei ~]# repquota -a
*** Report for user quotas on device /dev/sda1
Block grace time: 7days; Inode grace time: 7days
                        Block limits                File limits
User            used    soft    hard  grace    used  soft  hard  grace
----------------------------------------------------------------------
root      +- 6608676  661659  661680  6days   98931     0     0       
daemon    --       8       0       0              3     0     0       
rpc       --      12       0       0              4     0     0       
abrt      --      68       0       0             17     0     0       
haldaemon --       8       0       0              2     0     0       
nslcd     --       4       0       0              1     0     0       
postfix   --      76       0       0             42     0     0       
avahi     --       8       0       0              3     0     0       
ntp       --       8       0       0              2     0     0       
rpcuser   --      16       0       0              5     0     0       
pulse     --       4       0       0              1     0     0       
gdm       --     256       0       0             35     0     0       
yufei     --    5160   10240   20280            162   170   200       
smmsp     --      24       0       0              6     0     0       
apache    --       8       0       0              2     0     0       
user2     --      32   10240   20280              9   170   200       
#7155     --  194108       0       0           8328     0     0

我们没有对root做任何的限制,系统虽然默认给了root的限制,但从上面的结果来看,对ROOT用户根本不起作用啊。因为这个用户是神^_^

5、如果是设置组的限额的话,可以为组设置一个管理员

vim /etc/quotagrpadmins

这个里面写的很详细,一看就明白

6、关掉磁盘配额

quotaoff -a

7、警告信
warnquota这个命令,可以对超过限额的用户发出警告信,而邮件的内容是在/etc/warnquota.conf中进行设置。而且还需要你的系统安装了sendmail,并运行。这个命令需要手动执行,执行后,会给超额用户发一封邮件的同时,还会给ROOT发一封。如果不想手动执行,可以加入计划任务,让其自动执行。

From: root 
Reply-To: root@myhost.com 
Subject: NOTE: You are exceeding your allocated disk space limits
To: yufei@localhost6.localdomain6
Cc: root@localhost6.localdomain6

仔细对照一下/etc/warnquota.conf与你的mali,你就知道如何设置了。

本文关键字:一天一点 学习Linux RHEL6 磁盘配额 quota

13 条留言  访客:7 条  博主:5 条   引用: 1 条

  1. 羽飞您好,我用 quotacheck初始化数据库时,提示Permission denied,怎么解决啊?系统是rhel6.1,/dev/sdb1是ext4格式。
    [root@rh6 ~]# mount
    /dev/sdb1 on /data/usrquota type ext4 (rw,usrquota)
    ~~
    [root@rh6 ~]#
    [root@rh6 ~]# quotacheck -cvum /dev/sdb1
    quotacheck: Your kernel probably supports journaled quota but you are not using it. Consider switching to journaled quota to avoid running quotacheck after an unclean shutdown.
    quotacheck: Scanning /dev/sdb1 [/data/usrquota] done
    quotacheck: Cannot stat old user quota file: No such file or directory
    quotacheck: Old group file not found. Usage will not be substracted.
    quotacheck: Checked 2 directories and 0 files
    quotacheck: Cannot create new quotafile /data/usrquota/aquota.user.new: Permission denied
    quotacheck: Cannot initialize IO on new quotafile: Permission denied
    [root@rh6 ~]#
    [root@rh6 ~]# quotacheck -c /dev/sdb1
    quotacheck: Cannot create new quotafile /data/usrquota/aquota.user.new: Permission denied
    quotacheck: Cannot initialize IO on new quotafile: Permission denied
    [root@rh6 ~]#
    数据库没有创建,接下来的步骤都没法做了啊

  2. 羽飞大哥,关于RHEL6的配额管理,会出现这样的一个情况:
    RHEL6系统启动的时候,不会自动启动配额管理,所以之前设置好的配额,在系统重新启动后是不起作用的。
    这也是RHEL6才会出现的情况,RHEL5不会。
    所以需要在rc.local中手动添加相应的启动命令,并且要设置selinux为permissive。

    • 如果是考试的话,建立还是在开启SELinux的状态下配置,包括后面的服务也是一样的。
      至于在开启SELinux的状态下会出现的问题,建议还是要想办法解决掉,这才是进步!

      • 我也是在开启SELinux的状态下配置,会出现
        quotacheck: Cannot create new quotafile /data/usrquota/aquota.user.new: Permission denied
        quotacheck: Cannot initialize IO on new quotafile: Permission denied

        正在翻阅selinux的资料学习,之前对selinux一点知识都没

  3. 路过,学习了.

来自外部的引用: 1 条

  • 运维服务小笔记-Cnhejia.Cn

给我留言

Copyright © 羽飞博客 保留所有权利.   Ality主题 皖ICP备14013844号-1

用户登录