since2012/04/23

Linux 磁盘配额( Quota
本文已不再维护,更新文章请参考 这里
最近更新日期:2003/02/10
什么是 quota
基本的 quota 指令 quota, quotacheck, edquota, quotaon, quotaoff,
动手作 quota
使用邮件主机进行 quota 的实例
本章习题练习

什么是 quota?
quota 就字面上的意思来看,呵呵!就是有多少『限额』的意思啦!如果是用在零用钱上面,就是『有多少零用钱一个月』的意思之类的。如果是在容量空间上面呢?以 Linux 来说,呵呵!就是有多少容量限制的意思。
 
在 Linux 系统中,由于是多人多任务的环境,所以会有多人共同使用一个硬盘空间的情况发生,如果其中有少数几个使用者大量的占掉了硬盘空间的话,那势必压缩其他使用者 的使用权力!因此管理员应该适当的开放硬盘的权限给用户,以妥善的分配系统资源!避免有人抗议呀!比较常使用的几个情况是:
  • (1) 例如每个人的网页空间的容量限制!
  • (2) 每个人的邮件空间限制。
在 Linux 当中,使用来作为硬盘空间管理的就是所谓的 quota 这个咚咚啦!使用这个模块要有几个步骤,底下就分别说说吧!另外要特别注意的是,使用 quota 时有几个基本的限制需要谈一谈:
  • quota 实际在运作的时候,是针对『整个 partition』进行限制的,例如:如果你的 /dev/hda5 是挂载在 /home 底下,那么在 /home 底下的所有目录都会受到限制!
  • Linux 系统核心必须有支持 quota 这个模块才行:如果您是使用 Mandrake 的预设核心,嘿嘿!那恭喜你了,你的系统已经默认有开放 quota 这个模块啰!如果您是自行编译核心的,那么请特别留意您是否已经『真的』开启了 quota 这个模块?否则底下的功夫将全部都视为『白工』。至于核心编译的过程我们会在未来进行说明呦!
  • 目前新版的 Linux distributions 如: Mandrake 9.0 与 Red Hat 8.0 等使用的是 Kernel 2.4.xx 的核心版本,这个核心版本支持新的 quota 模块,使用的默认档案( aquota.user, aquota.group )将不同于旧版本的 quota.user, quota.group !(多了一个 a 呦!)而由旧版本的 quota 可以藉由 convertquota 这个程序来转换呢!
 quota 这支程序的限制内容主要分为底下几个部分:
  • soft :这是最低限制容量的意思,用户在宽限期间之内,他的容量可以超过 soft ,但必需要宽限时间之内将磁盘容量降低到 soft 的容量限制之下!
  • hard :这是『绝对不能超过』的容量!跟 soft 相比的意思为何呢?通常 hard limit 会比 soft limit 为高,例如网络驱动器空间为 30 MB ,那么 hard limit 就设定为 30MB ,但是为了让使用者有一定的警戒心,所以当使用空间超过 25 MB 时,例如使用者使用了 27 MB 的空间时,那么系统就会警告用户,让使用者可以在『宽限时间内』将他的档案量降低至 25 MB ( 亦即是 soft limit )之内!也就是说, soft 到 hard 之间的容量其实就是宽限的容量啦!可以达到针对使用者的『警示』作用!
  • 宽限时间:那么宽限时间就可以很清楚的知道含意是什么了!也就是当您的使用者使用的空间超过了 soft limit ,却还没有到达 hard limit 时,那么在这个『宽限时间』之内,就必需要请用户将使用的磁盘容量降低到 soft limit 之下!而当用户将磁盘容量使用情况超过 soft limit 时,『宽限时间』就会自动被启动,而在用户将容量降低到 soft limit 之下,那么宽限时间就会自动的取消啰!

基本的 quota 指令:
在开始进行 quota 的实作之前,我们得来了解一下 quota 要使用的指令啰!基本上分为两种,一种是查询功能(quota, quotacheck, quotastats, warnquota, repquota),另一种则是编辑 quota 的内容( edquota, setquota )。底下我们来谈一谈这些基本的指令吧!

  • quota

  • 语法
    [root @test /root ]# quota [-guvs] [user,group]
    参数说明:
    -g  :显示 group 群组
    -u  :显示 user
    -v  :显示 quota 的值
    -s  :选择 inod 或 硬盘空间来显示
    范例:
    [root @test /root ]# quota -guvs    <==显示目前执行者(就是 root )的 quota 值
    [root @test /root ]# quota -uvs test <==显示 test 这个使用者的 quota 值
    说明
    这个指令仅是使用来『显示(display)』目前某个群组或者某个使用者的 quota 限值!您可以使用来观察一下呦!

  • quotacheck

  • 语法
    [root @test /root ]# quotacheck [-auvg] /yourpath
    参数说明:
    -a  :扫瞄所有在 /etc/mtab 里头已经 mount 的具有 quota 支持的磁盘
    -u  :扫瞄用户的档案与目录
    -v  :显示扫瞄过程
    -g  :扫瞄群组使用的档案与目录
    -m :强制进行 quotacheck 
    范例:
    范例一、要针对 /home 这个 partition 进行 quota 的规划:
    [root@test root ]# quotacheck -uvg /home       <==开始扫瞄 /home 这一个独立扇区的目录
    quotacheck: Scanning /dev/hda3 [/home] done      <==显示 /home 扇区为 /dev/hda3 !
    quotacheck: Checked 35 directories and 342 files <==扫瞄完毕,有 35 目录与 342 档案。
    [root@test root ]# ls -l /home          <==查看一下 /home 这个目录底下,两个档案产生了!
    -rw-------    1 root     root         7168 May  6 18:37 aquota.group
    -rw-------    1 root     root         7168 May  6 18:37 aquota.user
     
    关于 quotacheck 发生错误的解决方法:
    # 有些时候,在新版的 Linux distribution 当中,进行 quotacheck 时,可能会出现
    # quotacheck: Cannot get quotafile name for /dev/hda3
    # quotacheck: Cannot get quotafile name for /dev/hda3
    # 这可能是新版的 quota 在设计时的小问题,解决的方法有两个:
    [root@test root]# quotacheck -uvgm 
    # 加上 -m 的参数来强制进行,或者是:
    [root@test root]# touch /home/aquota.user; touch /home/aquota.group
    [root@test root]# quotacheck -uvg
    # 既然 quotacheck 找不到 quotafile ,那么我就手动将 quotafile 建立起来即可!
    # 然后再重新进行 quotacheck 一次即可!
    # 注意喔!因为我的 /dev/hda3 对应到 /home ,所以当然就是在 /home 底下建立起 qoutafile 了!
    说明
    这这个指令主要的目的在扫瞄某一个磁盘的 quota 空间,他会针对该磁盘进行扫瞄,并且,由于该磁盘若持续运作时,可能扫瞄的过程中,档案可能会增减,造成 quota 扫瞄的错误发生,因此,当使用 quotacheck 时,该磁盘将『自动被设定成为唯独扇区(read-only);至于扫瞄完毕之后,扫瞄所得的磁盘空间结果会写入该扇区最顶端(例如:在我的例子中,扫瞄 /home 这个 /dev/hda3 的扇区,如果是初次扫瞄,那么扫瞄完毕之后会产生 aquota.user 与 aquota.group ,会放置在 /home/aquota.xxx 底下!而如果是建立 quota 后的扫瞄,那么就会更新这两个档案!)另外, Linux 也特别强调 quota 在使用的时候,需要特别注意在 reboot 时,得先将 quota 关闭才好!
    此外,由于新版的 Linux distribution 在 quota 的设计上似乎有点小问题,有时候无法完整的进行 quotacheck ,发生如同上表的情况,解决的方法就是主动手动的建立 quotafile 即可喔!

  • edquota

  • 语法
    [root @test /root ]# edquota [-u user] [-g group] [-t]
    [root @test /root ]# edquota -p user_demo -u user
    参数说明:
    -u  :编辑 user 的 quota
    -g  :编辑 group 的 quota
    -t  :编辑宽限时间(就是超过 quota 值后,还能使用硬盘的宽限期限)
    -p  :copy 模板(以建立好的使用者或群组)到另一个使用者(或群组)
    范例:
    [root @test /root ]# edquota -u test        <==设定 test 这个使用者的 quota 数值,会直接进入 vi 画面
    Disk quotas for user test (uid 501):
      Filesystem                   blocks       soft       hard     inodes     soft     hard
      /dev/hda3                         8          0          0          5        0        0
    修改一下成为:
    Disk quotas for user test (uid 501):
      Filesystem                   blocks       soft       hard     inodes     soft     hard
      /dev/hda3                         8       50005000          5     50005000

    [root @test /root ]# edquota -p test -u test2  <==将 test 这个人的 quota 资料复制给 test2 这个人!

    [root @test /root ]# edquota -t         <==设定宽限时间,也就是超过 quota 值之后的修正时间啦!
    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/hda3                  0minutes               0minutes
    上面的 0minutes 可以改成 60minutes 即可!也就是 60 分钟之内必须要赶快整理硬盘的意思!

    说明
    这个指令就是在编辑每一个『个人』或者是『群组』的 quota 数值!通常我们以 edquota -u username 或者是 edquota -g groupname 来编辑个人与群组的 quota 设定值。不过,或许您会觉得一个一个分配似乎很慢的样子!那么您也可以直接 copy 一个人的设定值给其他人,就如同上面第二个例子,利用已经建立好的 test 来建立 test2 这个人的 quota 限额!这个指令可是很重要的呦!另外,上面有几个重要的信息,我们来谈一谈吧:
    1. filesystem:这个是那个 partition 的意思!以上面来说,就是 /dev/hda3 啰!
    2. blocks:这个是目前使用者 test ( uid 501 )在 /dev/hda3 这个 filesystem (参考上面一个信息),所耗掉的磁盘容量,也就是目前的使用掉的空间啦!单位是 Kbytes 喔!这个信息是 quota 程序自己计算出来的,所以请不要修改他!
    3. soft 与 hard :这个是目前的 test 在这个 filesystem 之内的 quota 限制值!至于 soft 与 hard 的意思就如同 14-1 节最后面提的那个意思啦!当 soft 与 hard 数值为 0 的时候,表示『没有限制』的意思!而数值的单位仍是 Kbytes 喔!
    4. inodes :是目前使用掉 inode 的状态,也是 quota 自己计算出来而得到的,所以不要去变更他。一般而言, inode 不容易控制,所以您可以不必去限制 inode 呢!

  • quotaon

  • 语法
    [root @test /root ]# quotaon [-a] [-uvg directory]
    参数说明:
    -a  :全部的 quota 设定都启动(会自动去寻找 /etc/mtab 的设定)
    -u  :使用者的 quota 启动
    -g  :群组的 quota 设定启动
    -v  :显示讯息
    范例:
    [root @test /root ]# quotaon -a         <==全部的 quota 限制都启动
    [root @test /root ]# quotaon -uv /home  <==只有激活 /home 底下的使用者 quota 限额,group 不激活!
    说明
    这个指令是在启动 quota 的!不过,由于这个指令是启动 aquota.group 与 aquota.user 的,所以您就必须要先完成 qutoacheck 的工作了!然后简单的下达 quotaon -a 即可启动!

  • quotaoff

  • 语法
    [root @test /root ]# quotaoff -a
    参数说明:
    -a  :全部的 quota 设定都关闭(会自动去寻找 /etc/mtab 的设定)
    范例:
    [root @test /root ]# quotaoff -a         <==全部的 quota 限制都关闭了!
    说明
    这个指令就是关闭了 quota 的限制啦!

    动手作 quota:
    使用邮件主机进行 quota 的实例:
    本章习题练习 ( 要看答案请将鼠标移动到『答:』底下的空白处,按下左键圈选空白处即可察看 )
    2002/07/14:第一次完成
    2003/02/10:重新编排与加入 FAQ
    2003/09/02:加入 quotacheck 发生错误时的解决方法。

    Designed by VBird during 2001-2004.  Aerosol Lab. 

    本网页主要以Firefox配合解析度 1024x768 作为设计依据     鸟哥自由软件整合应用研究室