Chinaunix首页 | 论坛 | 博客
  • 博客访问: 313523
  • 博文数量: 84
  • 博客积分: 10
  • 博客等级: 民兵
  • 技术积分: 890
  • 用 户 组: 普通用户
  • 注册时间: 2011-03-13 16:46
文章分类

全部博文(84)

文章存档

2017年(2)

2016年(4)

2015年(78)

我的朋友

分类: LINUX

2015-07-06 12:53:19

15.1磁盘配额(Quota)的应用于实践

15.1.1什么是Quota
Quota的一般用途
一、针对网络服务的Quota的使用
针对WWW server,例如:每个人的网页空间的容量限制
针对mail Server,例如:每个人的邮件空间限制
针对file system,例如:每个最大的孔用网络硬盘空间
二、针对Linux系统主机上面的设置
限制某一用户组所使用的最大磁盘配额;
限制某一用户的最大磁盘配额,在限制了用户组之后,你也可以再继续针对个人来进行限制。
以Link的方式来使邮件可以作为限制的配额(更改/var/spool/mail这个路径),这通常是用户原本磁盘分区的规划不好但是却又不想要更改原有主机架构时。
三、Quota的使用限制
1、仅能针对整个文件系统
2、内核必须这次Quota
3、只对一般身份用户有效
4、Quota的日志文件(旧版的使用的默认文件时quota.user和quota.group,新版kernel2.6.x.x的使用的是aquota.user,quota.group,多了一个a)
四、Quota的规范设置选项
针对整个文件系统的限制主要分为下面几部分
1、容量限制或文件数量限制(block或inode)
     限制block用量:管理用户磁盘容量的限制,较常见的为这种方式
     限制inode用量:管理用户可以新建的“文件数量”
2、soft/hard
     hard:表示用户的用量绝对不会超过这个限制值
     soft:表示用户在低于soft限值时,可以正常使用磁盘,但若超过soft且低于hard的限值,每次用户登录系统时,系统会主动发出磁盘即将爆满的警告信息,且会给予一个宽限时间(grace time),不过若用户在宽限时间倒数期间就将容量再次低于soft限值之下,则宽限时间会停止。
五、会倒计时的宽限时间(grace time)
     一般默认的宽限时间为7天,如果7天内你都不进行任何磁盘管理,那么soft限制值会即刻替代hard限值来作为quota的限制,此时你的磁盘使用权就会被锁住而无法新增文件了。

15.1.2一个Quota范例

范例要求
目的与账号:闲杂我想要让我的专题设为五个为一组,这五个人的账号分别是myquota1、myquota2、myquota3、myquota4、myquota5,这五个用户的密码都是password,且这五个用户的初始用户组都是myquotagrp。
账号的磁盘容量限制值:我想让这五个用户都能够取得300MB的磁盘使用量(hard),文件数量不与则不予限制,此外只要容量使用率超过250MB,就予以警告(soft)
用户组的限额:由于我的系统里面还有其他用户存在,因此我仅承认myquotagrp这个用户组最多仅能使用1GB的容量。
宽限时间限制:最后,我希望每个用户在超过soft限制值之后,都还能够有14天的宽限时间。
准备工作,将账号相关的属性与参数搞定
  1. [root@RHEL6 scripts]# more quotaaccount.sh
  2. #!/bin/bash
  3. #创建五个用户,并使用相同的初始用户组
  4. groupadd myquotagrp
  5. for username in myquota1 myquota2 myquota3 myquota4 myquota5
  6. do
  7.         useradd -g myquotagrp $username
  8.         echo "password" | passwd --stdin $username
  9. done
  10. [root@RHEL6 scripts]#
15.1.3实践Quota流程1:文件系统支持
由于我的/home目录不是一个单独的文件系统,因此需要将此目录挂载到单独的文件系统上
  1. [root@RHEL6 scripts]# df -h
  2. 文件系统       容量     已用     可用 已用%% 挂载点
  3. /dev/sda3     16G     1.7G     14G 11%     /
  4. tmpfs         937M     0      937M 0%      /dev/shm
  5. /dev/sda1     194M     26M    159M 14%     /boot
  6. /dev/sdb1     1020M    34M    935M 4%      /sdb
  7. [root@RHEL6 scripts]#
操作步骤
1、虚拟机中加入磁盘
2、fdisk #分区
3、mkfs -t ext4   #格式化
4、mv home home_old #更名原目录,如果有用户正在登陆,正在占用此文件夹,可以使用的两个命令是w、ps和losf,检查,并kill掉或通知用户退出使用。
5、mkdir /home     #新建目录
6、vi /etc/fstab  #下次开机自动挂载
7、cp -a /home_old/* /home  #复制文件
8、df -h /home    #检查
更名、挂载、复制内容如下
  1. [root@RHEL6 /]# mv home home_old
  2. [root@RHEL6 /]# mkdir /home
  3. [root@RHEL6 /]# mount /dev/sdb5 /home
  4. [root@RHEL6 /]# vi /etc/fstab
  5. /dev/sdb5 /home ext4 defaults 0 0
  6. [root@RHEL6 /]# cp -a /home_old/* /home
  7. [root@RHEL6 scripts]# df -h /home
    Filesystem            Size  Used Avail Use% Mounted on
    /dev/sdb5             2.3G  362M  1.8G  17% /home      #已经成为独立的挂载点
    [root@RHEL6 scripts]#
如果只是想要在这次开机实验Quota,那么可以使用如下的方式来手动加入quota的支持。
  1. [root@RHEL6 ~]# mount | grep home #查看一下当前状态
  2. /dev/sdb5 on /home type ext4 (rw,acl)
  3. [root@RHEL6 ~]# mount -o remount,usrquota,grpquota /home #当你重新挂载时(已知不影响当下用户对/home目录使用),系统会同步更新/etc/mtab,usrquota与grpquota是用户与用户组的quota文件系统支持参数。
  4. [root@RHEL6 ~]# mount | grep home
  5. /dev/sdb5 on /home type ext4 (rw,acl,usrquota,grpquota)
  6. [root@RHEL6 ~]#
  7. [root@RHEL6 /]# cat /etc/mtab | grep home #检查mtab文件
  8. /dev/sdb5 /home ext4 rw,acl,usrquota,grpquota 0 0
  9. [root@RHEL6 /]#
不过手动挂载的数据下次从新挂载会消失,因此最好写入/etc/fstab配置文件,加入如下行
  1. /dev/sdb5 /home ext4 defaults,usrquota,grpquota 0 0
检查fstab文件配置情况
  1. [root@RHEL6 /]# umount /home
  2. umount: /home: device is busy.
  3.         (In some cases useful info about processes that use
  4.          the device is found by lsof(8) or fuser(1))
  5. [root@RHEL6 /]# lsof /home
  6. COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
  7. bash 1549 awake cwd DIR 8,21 4096 26 /home/awake     #发现有用户登录
  8. [root@RHEL6 /]# kill 1549                            #杀掉进程
  9. [root@RHEL6 /]# lsof /home                           #再次查看,发现没有kill成功
  10. COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
  11. bash 1549 awake cwd DIR 8,21 4096 26 /home/awake
  12. [root@RHEL6 /]# kill -9 1549                         #强制kill
  13. [root@RHEL6 /]# lsof /home                           #没有人占用
  14. [root@RHEL6 /]# umount /home                         #卸载目录
  15. [root@RHEL6 /]# mount -a                             #自动加载fstab文件中的挂载点
  16. [root@RHEL6 /]# mount | grep home
  17. /dev/sdb5 on /home type ext4 (rw,usrquota,grpquota)  #重新挂载成功
  18. [root@RHEL6 /]#
15.1.4实践Quota流程2:新建Quota配置文件
其实Quota是通过分析整个文件系统中每个用户(用户组)拥有的文件总量与总容量,再将这些数据记录在该文件系统的最顶层目录(quota自己的数据文件,如aquota.user,aquota.group文件),然后在配置文件中再使用每个账号(或用户组)的限制值去规定磁盘使用量的。所以,构建这个Quota配置文件就显得非常重要。扫描有支持Quota参数(usrquota,grpquota)的文件系统。就是用quotacheck这个命令,命令语法如下:
quotacheck [-avugfM] [挂载点]
-a:扫描所有在/etc/mtab内,含有quota支持的文件系统,加上此参数后,/mount_piont可不必写,因为扫描所有的文件系统了。
-u:针对用户扫描文件与目录的使用情况,会新建aquota.user
-g:针对用户组扫描文件与目录的使用情况,会新建quota.group
-v:显示扫描过程的信息。
-f:强制扫描文件系统,并写入新的Quota配置文件(危险)
-M:强制以读写的方式扫描文件系统,只有在特殊情况下才会使用。

针对整个文件系统含有usrquota,grpquota参数的文件系统进行quotacheck扫描
  1. [root@RHEL6 Packages]# yum install quota #最小化安装的系统可以使用yum命令安装quota,不然没有quota及quotacheck命令
  2. [root@RHEL6 Packages]# quotacheck -avug
  3. 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.
  4. quotacheck: Scanning /dev/sdb5 [/home] done
  5. quotacheck: Cannot stat old user quota file: No such file or directory
  6. quotacheck: Cannot stat old group quota file: No such file or directory
  7. quotacheck: Cannot stat old user quota file: No such file or directory
  8. quotacheck: Cannot stat old group quota file: No such file or directory
  9. quotacheck: Checked 92 directories and 241 files
  10. quotacheck: Cannot create new quotafile /home/aquota.user.new: Permission denied
  11. quotacheck: Cannot initialize IO on new quotafile: Permission denied
  12. quotacheck: Cannot create new quotafile /home/aquota.group.new: Permission denied
  13. quotacheck: Cannot initialize IO on new quotafile: Permission denied
  14. [root@RHEL6 Packages]#
上面报了4行错误,没有权限新建aquota.user.new和quota.group.new文件,还有两个是初始化IO权限限制,查了度娘,告诉我关闭Selinux
  1. [root@RHEL6 ~]# setenforce 0
  2. [root@RHEL6 ~]# getenforce
  3. Permissive
  4. [root@RHEL6 ~]#
  5. [root@RHEL6 ~]# quotacheck -vug /home  #再次尝试,发现成功了
    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/sdb5 [/home] done
    quotacheck: Cannot stat old user quota file: No such file or directory
    quotacheck: Cannot stat old group quota file: No such file or directory
    quotacheck: Cannot stat old user quota file: No such file or directory
    quotacheck: Cannot stat old group quota file: No such file or directory
    quotacheck: Checked 92 directories and 241 files
    quotacheck: Old file not found.
    quotacheck: Old file not found.
    [root@RHEL6 ~]#
    [root@RHEL6 ~]# ll -d /home/aquota*   #/home是独立的文件系统,因此查询结果会将两个配置文件放在/home下面
    -rw-------. 1 root root 8192 Jul  5 21:28 /home/aquota.group
    -rw-------. 1 root root 9216 Jul  5 21:28 /home/aquota.user
    [root@RHEL6 ~]#
15.1.5实践Quota流程3:quota启动、关闭与限制值设置
制作好Quota数据文件后,接下来就是要启动quota了
1、quotaon:启动quota的服务(他不是一个守候进程,不需要关注chkconfig)
quotaon [-avug] [/mount_point]
参数:
-a:根据/etc/mtab内的文件系统设置启动有关的quota,若不加-a的话则后面就需要加上特定的那个文件系统
-u:针对用户启动quota(aquota.user)
-g:针对用户组启动quota(aquota.group)
-v:显示启动过程的相关信息。

由于我们要启动user/group的quota,所以使用下面的语法即可
  1. [root@RHEL6 ~]# quotaon -ugv /home
  2. /dev/sdb5 [/home]: group quotas turned on
  3. /dev/sdb5 [/home]: user quotas turned on
  4. [root@RHEL6 ~]#
  5. [root@RHEL6 ~]# quotaon -augv #在启动一次会是这样
  6. quotaon: using /home/aquota.group on /dev/sdb5 [/home]: Device or resource busy
  7. quotaon: using /home/aquota.user on /dev/sdb5 [/home]: Device or resource busy
这个quotaon -auvg的命令几乎只在第一次启动quota时才需要进行,因为下次等你重新启动系统时,系统的/etc/rc.d/rc.sysinit初始化脚本就会自动的执行这个命令了。因此你只要在这次实例中进行一次即可,将来都不需要自行启动quota,因为RHEL6.4系统会自动帮你搞定他!

2、quotaoff:关闭quota的服务
quotaoff [-a] [-ug] [/mount_point]
参数:
-a:全部的文件系统给的quota都关闭(根据/etc/mtab)
-u:仅针对后面接的那个/mount_point关闭user quota
-g:仅针对后面接的那个/mount_point关闭group quota

3、edquota:编辑账号/用户组的限值与宽限时间
edquota是editquota的缩写,所以是用来编辑用户或者是用户组限额的命令。edquota的命令语法如下
edquota [-u username] [-g groupname]
edquota -t 修改宽限时间
edquota -p 范本账号 -u 新账号
参数:
-u:后面接账号名称,可以进入quota的编辑界面(vi)去设置username的限制值
-g:后面接组名,可以进入quota的编辑界面(vi)去设置groupname的限制值
-t:可以修改宽限时间
-p:复制范本,那个模板账号为已经存在并且已设置好quota的账号,意义为将范本账号这个人的quota限制值复制给新账号(paste之意)

设置myquota1这个用户quota限制值
  1. [root@RHEL6 ~]# edquota -u myquota1
  2. Disk quotas for user myquota1 (uid 715):
  3.   Filesystem blocks soft hard inodes soft hard
  4.   /dev/sdb5    56    0     0    14    0    0
上面第一行说明针对哪个账号(myquota1)进行quota的限额设置,第二行是标题行,里面共分为七个字段:
I、文件系统(filesystem):说明该限制值是针对哪个文件系统(或partition);
II、磁盘容量(blocks):这个数值是quota自己算出来的,单位为KB,不要修改它;
III、soft:磁盘容量block的soft限制值,单位为KB;
IV、hard:block的hard限制值,单位KB;
V、文件数量inodes:这是quota自己算出来的,单位为个数,请不要改动它
VI、soft:inode的soft限制值;当值为0时,表示没有soft限制
VII、hard:inode的hard限制值。当值为0时,表示没有hard限制

设置blocks的soft和hard值限制使用容量,soft为250M,hard值为300M,在edquota的界面中,每一行只要保持七个字段就可以了,并不需要排列整齐的。

  1. [root@RHEL6 ~]# edquota -u myquota1
  2. Disk quotas for user myquota1 (uid 715):
  3.   Filesystem blocks soft hard inodes soft hard
  4.   /dev/sdb5    56 250000 300000 14    0    0
设置完用户myquota1容量配额后,还有其他4个用户要设置,由于设置值都一样,此时可以使用quota复制

  1. [root@RHEL6 ~]# edquota -p myquota1 -u myquota2
  2. [root@RHEL6 ~]# edquota -p myquota1 -u myquota3
  3. [root@RHEL6 ~]# edquota -p myquota1 -u myquota4
  4. [root@RHEL6 ~]# edquota -p myquota1 -u myquota5
  5. [root@RHEL6 ~]# edquota -u myquota2 #验证配置时可以抽样看一下
更改用户组的quota限额,soft值为900M,而hard值为1G

  1. [root@RHEL6 ~]# edquota -g myquotagrp
  2. Disk quotas for group myquotagrp (gid 717):
  3.   Filesystem blocks soft hard inodes soft hard
  4.   /dev/sdb5   280 900000 1000000 70   0    0
将宽限时间改成14天
  1. [root@RHEL6 ~]# edquota -t
  2. Grace period before enforcing soft limits for users:
  3. Time units may be: days, hours, minutes, or seconds
  4.   Filesystem Block grace period Inode grace period
  5.   /dev/sdb5       14days              7days
  6.  原本是7天,我们将它改为14天
查看设置到底有没有生效
15.1.6实践Quota流程4:Quota限制值的报表
quota的报表主要有两种模式,一种针对每个个人或用户组的quota命令,一个针对整个文件系统的repquota命令
1、quota:单一用户的quota报表
quota [-uvs] [username]
quota [-gvs] [groupname]
参数:
-u:后面可以接username,表示显示出该用户的quota限制值,若不接username,表示显示出执行者的quota限制值
-g:后面接groupname,表示显示出该用户组的quota限制值。
-v:显示每个用户在文件系统中的quota值
-s:使用1024为倍数来指定单位,会显示如M之类的单位(K、M、G)

直接使用quota去显示出myquota1和myquota2的配额

    [root@RHEL6 scripts]# quota -uvs myquota1 myquota2
    Disk quotas for user myquota1 (uid 715):
         Filesystem  blocks   quota   limit   grace   files   quota   limit   grace
          /dev/sdb5    293M*   245M    293M  13days      17       0       0        
    Disk quotas for user myquota2 (uid 716):
         Filesystem  blocks   quota   limit   grace   files   quota   limit   grace
          /dev/sdb5      56    245M    293M              14       0       0    
你会发现grace下面没有任何数据,这是因为我们的使用量(56)尚未超过soft

显示出myquotagrp的用户组限额
  1. [root@RHEL6 scripts]# quota -gvs myquotagrp
    Disk quotas for group myquotagrp (gid 717):
         Filesystem  blocks   quota   limit   grace   files   quota   limit   grace
          /dev/sdb5    294M    879M    977M              73       0       0       
由于quota仅能针对某些用户(用户组)显示报表,如果要针对整个文件系统列出报表时,那repquota就派上用场了
2、repquota:针对文件系统给的配额做报表
repquota命令语法
requota -a [-vugs]
参数:
-a:直接到/etc/mtab查询具有quota标志的文件系统,并报告quota的结果
-u:显示出用户的quota限值(这是默认值)
-g:显示出用户组的quota限值
-v:输出的数据将含有文件系统过相关的详细信息。
-s:使用M、G为单位显示结果

查询本案例中所有用户的quota限制情况
  1. [root@RHEL6 scripts]# repquota -auvs
    *** Report for user quotas on device /dev/sdb5
    Block grace time: 14days; Inode grace time: 7days
                            Block limits                File limits
    User            used    soft    hard  grace    used  soft  hard  grace
    ----------------------------------------------------------------------
    root      --      20       0       0              2     0     0       
    awake     --      80       0       0             24     0     0       
    cc        --      56       0       0             14     0     0       
    dd        --      64       0       0             16     0     0       
    ee        --      56       0       0             14     0     0       
    hh        --      72       0       0             20     0     0       
    alex      --      56       0       0             14     0     0       
    arod      --      56       0       0             14     0     0       
    pro1      --      64       0       0             16     0     0       
    pro2      --      72       0       0             18     0     0       
    pro3      --      56       0       0             14     0     0       
    normaluser --      64       0       0             16     0     0       
    std01     --      64       0       0             16     0     0       
    std02     --      64       0       0             16     0     0       
    std03     --      56       0       0             14     0     0       
    stda      --      56       0       0             14     0     0       
    stdb      --      56       0       0             14     0     0       
    stdc      --      28       0       0              7     0     0       
    myquota1  +-    293M    245M    293M 13days      17     0     0    以下5个用户是我们quota的对象    
    myquota2  --      56    245M    293M             14     0     0       
    myquota3  --      56    245M    293M             14     0     0       
    myquota4  --      56    245M    293M             14     0     0       
    myquota5  --      56    245M    293M             14     0     0       

    Statistics:  #这是所谓的系统相关信息,用-v才会显示
    Total blocks: 9
    Data blocks: 2
    Entries: 23
    Used average: 11.500000

    [root@RHEL6 scripts]#

15.1.7 实践quota流程5:测试与管理
测试一:利用myquota1的身份,创建一个270MB的大文件,并查看quota结果

  1. [root@RHEL6 ~]# su - myquota1
  2. [myquota1@RHEL6 ~]$ dd
  3. dd ddate
  4. [myquota1@RHEL6 ~]$ pwd
  5. /home/myquota1
  6. [myquota1@RHEL6 ~]$ dd if=/dev/zero of=270Mfile bs=1M count=270
  7. sdb5: warning, user block quota exceeded. #这个warning告警信息:用户容量超出配额
  8. 记录了270+0 的读入
  9. 记录了270+0 的写出
  10. 283115520字节(283 MB)已复制,5.03989 秒,56.2 MB/秒
  11. [myquota1@RHEL6 ~]$
查看quota报表
  1. [myquota1@RHEL6 ~]$ quota -uvs myquota1
    Disk quotas for user myquota1 (uid 715):
         Filesystem  blocks   quota   limit   grace   files   quota   limit   grace
          /dev/sdb5    271M*   245M    293M  13days(宽限时间)      15       0       0        
    [myquota1@RHEL6 ~]$

    [root@RHEL6 ~]# repquota -auv | grep myquo   #这个是用root去查看的
    myquota1  +-  276540  250000  300000 13days      16     0     0       
    myquota2  --      56  250000  300000             14     0     0       
    myquota3  --      56  250000  300000             14     0     0       
    myquota4  --      56  250000  300000             14     0     0       
    myquota5  --      56  250000  300000             14     0     0       
    发现grace出现,并且开始倒数了

测试二:在创建另外一个大文件,让总容量超过300M
  1. [root@RHEL6 ~]# su - myquota1
  2. [myquota1@RHEL6 ~]$ pwd
  3. /home/myquota1
  4. [myquota1@RHEL6 ~]$ dd if=/dev/zero of=40Mfile bs=1M count=40
  5. sdb5: write failed, user block limit reached.
  6. dd: 正在写入"40Mfile": 超出磁盘限额 #报错信息
  7. 记录了23+0 的读入
  8. 记录了22+0 的写出
  9. 24023040字节(24 MB)已复制,0.477621 秒,50.3 MB/秒 #没有办法写入,所以只写了24MB左右
  10. [myquota1@RHEL6 ~]$ du -sk
  11. 299972 . #果然到了极限,加1M都不可能了
  12. [myquota1@RHEL6 ~]$

Quota使用总结
仅能针对文件系统进行磁盘配额
限制某一用户或用户组所使用的最大磁盘配额;
yum install quota 如果没有quota等命令需要手工安装
mount -o remount,usrquota,grpquota /home 对于目标文件系统加入quota的支持,如测试成功需要参照/etc/mtab文件将目标文件系统重新编辑到/etc/fstab文件,以备下次开机能够正常使用此功能
setenforce 0 关闭selinux

quotacheck -avug针对所有支持quota的文件系统,生成quota的数据文件,文件在文件系统的顶层目录(aquota.user和aquota.group)
quotaon -ugv /home针对目标文件系统开启quotaon
edquota -u [username] -g [group] -t 编辑账号/用户组的限值与宽限时间
edquota -p myquota1 -u myquota2 复制范本,myquota1是范本
检查验证quota报表
quota [-uvs] [username]
quota [-gvs] [groupname]
repquota -a

遗留问题,如何在日志中监控quota是否有用户磁盘使用超过soft限制值,因为我发现,对于使用超过soft限制的用户,并没有什么系统提示信息






阅读(2329) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~