鸟哥的 Linux 私房菜 -- 磁盘配额 Quota

since2012/04/23

     
 
最近更新日期:2005/09/06
本文已不再维护,更新文章请参考此处
磁盘配额 ( Quota ) 一直就是个很有用的东西!怎么说呢?举个例子来说明, 如果您曾经申请过网络的 mail 服务时,那么肯定就会明白什么是 20MB 的邮件空间、 30MB 的免费网页空间,好了,这个 20MB, 30MB 是怎样定义出来的呢?哈哈!没错,就是 quota 这个东西搞出来的!如果我们要限制用户使用硬盘的容量使用大小,嗯!来这里看看就对了!

大标题的图示什么是 Quota
『 quota 』就字面上的意思来看,呵呵!就是有多少『限额』的意思啦!如果是用在零用钱上面, 就是类似『有多少零用钱一个月』的意思之类的。如果是在容量空间上面呢?以 Linux 来说,呵呵!就是有多少容量限制的意思。

在 Linux 系统中,由于是多人多任务的环境,所以会有多人共同使用一个硬盘空间的情况发生, 如果其中有少数几个使用者大量的占掉了硬盘空间的话,那势必压缩其他使用者的使用权力! 因此管理员应该适当的开放硬盘的权限给用户,以妥善的分配系统资源!避免有人抗议呀! 举例来说,我们用户的默认家目录都是在 /home 底下,如果 /home 是个独立的 partition , 他大概有 10G 好了,而 /home 底下共有 30 个人,也就是说,每个用户平均应该会有 333MB 的空间才对。 偏偏有个用户在他的家目录底下塞了好多只影片,占掉了 8GB 的空间,想想看,是否造成其他正常使用者的不便呢? 这个时候就得要靠 quota 的帮忙啰!

  • Quota 的一般用途
  • quota 比较常使用的几个情况是:
    • 针对 WWW server ,例如:每个人的网页空间的容量限制!
    • 针对 mail server,例如:每个人的邮件空间限制。
    • 针对 file server,例如:每个人最大的可用网络硬盘空间。
    在 Linux 当中,使用来作为硬盘空间管理的就是所谓的 quota 这个咚咚啦!

  • Quota 的使用限制
  • 使用这个模块要有几个步骤,底下就分别说说吧!另外要特别注意的是,使用 quota 时有几个基本的限制需要谈一谈:
    • 仅针对整个 partition:
      quota 实际在运作的时候,是针对『整个 partition』进行限制的, 例如:如果你的 /dev/hda5 是挂载在 /home 底下,那么在 /home 底下的所有目录都会受到限制!

    • 核心必须支持 quota :
      Linux 系统核心必须有支持 quota 这个模块才行:如果您是使用 FC4 的预设核心, 嘿嘿!那恭喜你了,你的系统已经默认有开放 quota 这个模块啰!如果您是自行编译核心的,那么请特别留意您是否已经『真的』开启了 quota 这个模块?否则底下的功夫将全部都视为『白工』。至于核心编译的过程我们会在未来进行说明呦!

    • Quota 的记录文件:
      目前新版的 Linux distributions 如: FC4 与 SuSE server 9 等使用的是 Kernel 2.6.xx 的核心版本,这个核心版本支持新的 quota 模块,使用的默认档案( aquota.user, aquota.group )将不同于旧版本的 quota.user, quota.group !(多了一个 a 呦!)而由旧版本的 quota 可以藉由 convertquota 这个程序来转换呢!

    • 只对一般身份使用者有效:
      这就有趣了!并不是所有在 Linux 上面的账号都可以设定 quota 呢,例如 root 就不能设定 quota , 因为整个系统所有的数据几乎都是他的啊! ^_^
  • quota 这支程序对硬盘配额的限制项目:
  • quota 这支程序针对整个 partition 的限制项目主要分为底下几个部分:
    • 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 ) 。底下我们来谈一谈这些基本的指令吧!


  • /etc/mtab
  • 怪了!不是说好要说明 quota 相关指令的吗?干嘛提这个文件系统 (filesystem) 实际挂载的记录文件?呵呵!要注意了~当我们使用 quota 的时候,基本上,系统会去搜寻:『 系统上具有 quota 参数的 partition 』 所以啰,当我们要使用 quota 的功能时,我们的 filesystem 必须要已经支持 quota 的旗标才行。一般来说,我们是以编辑 /etc/fstab 后,再重新挂载 filesystem 的方法来让系统的 filesystem 支持 quota 的!这个概念可是很重要的喔! ^_^


  • quota
  • [root@linux ~]# quota [-uvsl] [username]
    [root@linux ~]# quota [-gvsl] [groupname]
    参数:
    -u  :后面可以接 username ,表示显示出该用户的 quota 限制值。若不接 username 
          ,表示显示出执行者的 quota 限制值。
    -g  :后面可接 groupname ,表示显示出该群组的 quota 限制值。
    -v  :显示每个 filesystem 的 quota 值;
    -s  :可选择以 inode 或磁盘容量的限制值来显示;
    -l  :仅显示出目前本机上面的 filesystem 的 quota 值。
    范例:
    
    范例一:秀出目前 root 自己的 quota 限制值:
    [root@linux ~]# quota -guvs
    
    范例二:秀出 dmtsai 这个用户的磁盘配额
    [root@linux ~]# quota -vs -u dmtsai
    # 注意一下这两个范例,如果您的系统上面尚未有任何的 quota 支持的 filesystem 时,
    # 使用这两个范例时,『不会有任何信息列出来』啦!不要以为发生错误啰!
    
    这个指令仅是使用来『显示(display)』目前某个群组或者某个使用者的 quota 限值!您可以使用来观察一下呦!


  • quotacheck
  • [root@linux ~]# quotacheck [-avug] [/mount_point]
    参数:
    -a  :扫瞄所有在 /etc/mtab 内,含有 quota 支持的 filesystem,加上此参数后, 
          /mount_point 可不必写,因为扫瞄所有的 filesystem 了嘛!
    -u  :针对用户扫瞄档案与目录的使用情况,会建立 aquota.user
    -g  :针对群组扫瞄档案与目录的使用情况,会建立 aquota.group
    -v  :显示扫瞄过程的信息;
    -M  :『强制』进行 quotacheck 的扫瞄。
    范例:
    
    范例一:将所有的在 /etc/mtab 内,含有 quota 支持的 partition 进行扫瞄
    [root@linux ~]# quotacheck -avug
    quotacheck: Can't find filesystem to check or filesystem not mounted with 
    quota option.
    # 不要紧张,这是正常的现象~因为您尚未启用 quota 的参数嘛!
    # 关于 quota 参数的下达方法,我们会在稍后说明。如果正常的进行扫瞄,会像下面这样:
    [root@linux ~]# quotacheck -avug
    quotacheck: Scanning /dev/hdb1 [/disk2] done
    quotacheck: Checked 3 directories and 4 files
    [root@linux ~]# ll /disk2
    total 32
    -rw-------  1 root root  6144 Sep  5 14:56 aquota.group
    -rw-------  1 root root  6144 Sep  5 14:56 aquota.user
    drwx------  2 root root 16384 Jun 25 16:22 lost+found
    # 第一次操作 quotacheck 可能会有一些错误讯息发生,那应该是正常的!
    # 如果使用 ls -l 去查阅一下有 quota 支持的那个 mount point ,若有出现
    # aquota.group 及 aquota.user ,那应该就是已经建立好了 quota 记录文件了!
    
    范例二:强制扫瞄已挂载的 filesystem
    [root@linux ~]# quotacheck -avug -m
    # 有些时候,在某些 Linux distributions 上面,进行 quotacheck 时,
    # 可能会出现如下的错误讯息:
    # quotacheck: Cannot get quotafile name for /dev/hda3
    # quotacheck: Cannot get quotafile name for /dev/hda3
    # 果真如此的话,那么你可以如同上面一般,加上 -m 的参数来『强制』扫瞄。
    # 也可以手动先建立记录文件,然后再扫瞄,如下所示:
    [root@linux ~]# touch /disk2/aquota.user; touch /disk2/aquota.group
    [root@linux ~]# quotacheck -avug
    # 必须要注意的是,我这里是以 /disk2 作为一个测试的 mount point ,
    # 您的挂载点不一定会跟鸟哥一样喔!
    
    这这个指令主要的目的在扫瞄某一个磁盘的 quota 空间,他会针对该 partitions 进行扫瞄,并且,由于该磁盘若持续运作时,可能扫瞄的过程中, 档案可能会增减,造成 quota 扫瞄的错误发生,因此,当使用 quotacheck 时,该磁盘将『 自动被设定成为只读扇区 ( read-only ) 』 ;至于扫瞄完毕之后, 扫瞄所得的磁盘空间结果会写入该扇区最顶端。 ( 例如:在鸟哥的例子中,扫瞄 /disk2 这个 /dev/hdb1 的扇区,如果是初次扫瞄,那么扫瞄完毕之后会产生 aquota.user 与 aquota.group ,会放置在 /disk2/aquota.user 与 /disk2/aquota.group 底下!而如果是建立 quota 后的扫瞄,那么就会更新这两个档案! ) 另外, Linux 也特别强调 quota 在使用的时候,需要特别注意在 reboot 时,得先将 quota 关闭才好!

    此外,由于新版的 Linux distribution 在 quota 的设计上似乎有点小问题,有时候无法完整的进行 quotacheck ,发生如同上表的情况,解决的方法就是主动手动的建立 quotafile 即可喔!例如上面的范例二所显示的。


  • edquota
  • [root@linux ~]# edquota [-u username] [-g groupname]
    [root@linux ~]# edquota -t  <==修改恕限时间
    [root@linux ~]# edquota -p username_demo -u username
    参数:
    -u  :后面接账号名称。可以进入 quota 的编辑画面 (vi) 去设定 username 的限制值;
    -g  :后面接组名。可以进入 quota 的编辑画面 (vi) 去设定 groupname 的限制值;
    -t  :可以修改恕限时间 (就是超过 quota 的 soft limit 值后,还能使用硬盘的宽限期限)
    -p  :复制范本。那个 username_demo 为已经存在并且已设定好 quota 的使用者,
          意义为『将 username_demo 这个人的 quota 限制值复制给 username 』!
    范例:
    
    范例一:设定 dmtsai 这个使用者的 quota 限制值
    [root@linux ~]# edquota -u dmtsai
    Disk quotas for user dmtsai (uid 501):
      Filesystem    blocks    soft    hard   inodes   soft   hard
      /dev/hdb1          0       0       0        0      0      0
    # 进入编辑画面后,以 vi 的相关行为进行编辑喔!我们可以看到
    # 被编辑的使用者是 dmtsai ,而底下共有七个字段,每个字段的意义我们将在
    # 底下的说明继续介绍。而假设我们对于 dmtsai 的限制是 30MB 的话,那么:
    Disk quotas for user dmtsai (uid 501):
      Filesystem    blocks    soft    hard   inodes   soft   hard
      /dev/hdb1          0   25000   30000        0      0      0
    # 然后就可以储存后离开啰!
    
    范例二:将 dmtsai 的 quota 限制值 (30MB) 复制给 vbird1 这个使用者
    [root@linux ~]# edquota -p dmtsai -u vbird1
    
    范例三:修订恕限时间
    [root@linux ~]# 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/hdb1                     7days                  7days
    # 预设的恕限时间是 7 天啦!你当然可以修订时间!
    
    这个指令就是在编辑每一个『个人』或者是『群组』的 quota 数值!通常我们以 edquota -u username 或者是 edquota -g groupname 来编辑个人与群组的 quota 设定值。不过,或许您会觉得一个一个分配似乎很慢的样子!那么您也可以直接 copy 一个人的设定值给其他人,就如同上面第二个例子,利用已经建立好的 dmtsai 来建立 vbird1 这个人的 quota 限额!这个指令可是很重要的呦! 另外,范例一当中出现的那七个字段代表的意义我们得要谈一谈啊:
    • filesystem
      代表这个 quota 是针对哪一个 partition 的意思。以范例一的情况来说,指的是 /dev/hdb1 啰! 也就是 /disk2 那个目录底下的 quota 限制值啦!

    • blocks
      这个是目前使用者 dmtsai ( uid 501 ) 在 /dev/hdb1 这个 filesystem (参考上面一个信息),所耗掉的磁盘容量,也就是目前的使用掉的空间啦!单位是 Kbytes 喔!这个信息是 quota 程序自己计算出来的,所以请不要修改他!

    • soft 与 hard
      这个是目前的 dmtsai 使用者在这个 filesystem 之内的 quota 限制值!至于 soft 与 hard 的意思就如同 前一节最后面提的那个意思啦!soft 代表的是一个『警告』限值, hard 则是一个『不可超过的限值』, soft 与 hard 中间的差值则为宽限的数值。而当 soft 与 hard 数值为 0 的时候,表示『没有限制』的意思!而数值的单位仍是 Kbytes 喔!

    • inodes
      是目前使用掉 inode 的状态,也是 quota 自己计算出来而得到的,所以不要去变更他。一般而言, inode 不容易控制,所以您可以不必去限制 inode 呢!

  • quotaon
  • [root@linux ~]# quotaon [-avug]
    [root@linux ~]# quotaon [-vug] [/mount_point]
    参数:
    -u  :针对使用者启动 quota (aquota.user)
    -g  :针对群组启动 quota (aquota.group)
    -v  :显示启动过程的相关讯息;
    -a  :根据 /etc/mtab 内的 filesystem 设定启动有关的 quota ,若不加 -a 的话,
          则后面就需要加上特定的那个 filesystem 喔!
    范例:
    
    范例一:启动所有的具有 quota 的 filesystem
    [root@linux ~]# quotaon -auvg
    /dev/hdb1 [/disk2]: group quotas turned on
    /dev/hdb1 [/disk2]: user quotas turned on
    
    范例二:仅启动 /disk2 里面的 user quota 设定值:
    [root@linux ~]# quotaon -uv /disk2
    
    这个指令是在启动 quota 的!不过,由于这个指令是启动 aquota.group 与 aquota.user 的,所以您就必须要先完成 quotacheck 的工作了!然后简单的下达 quotaon -a 即可启动!


  • quotaoff
  • [root@linux ~]# quotaoff [-a]
    [root@linux ~]# quotaoff [-ug] [/mount_point]
    参数:
    -a  :全部的 filesystem 的 quota 都关闭 (根据 /etc/mtab)
    -u  :仅针对后面接的那个 /mount_point 关闭 user quota
    -g  :仅针对后面接的那个 /mount_point 关闭 group quota
    范例:
    
    范例一:
    [root@linux ~]# quotaoff -a
    
    这个指令就是关闭了 quota 的限制啦!

    大标题的图示实作 Quota
    Quota 使用的方向很广啦,不过,他一般的用途大概有这些:
    • 限制某一群组所能使用的最大磁盘配额 (使用群组限制)
      你可以将你的主机上的用户分门别类,有点像是目前很流行的付费与免付费会员制的情况, 你比较喜好的那一群的使用配额就可以给高一些!呵呵! ^_^...

    • 限制某一用户的最大磁盘配额 (使用用户限制)
      在限制了群组之后,您也可以再继续针对个人来进行限制,使得同一群组之下还可以有更公平的分配!

    • 以 Link 的方式,来使邮件可以作为限制的配额 (更改 /var/spool/mail 这个路径)
      如果是分为付费与免付费会员的『邮件主机系统』,是否需要重新再规划一个硬盘呢? 也不需要啦!直接使用 Link 的方式指向 /home (或者其他已经做好的 quota 磁盘)就可以啦! 这通常是用在原本规划不好,但是却又不想要更动原有主机架构的情况中啊!
    那么 Quota 从开始准备 filesystem 的支持到整个设定结束的主要的步骤大概是:
    1. 设定 partition 的 filesystem 支持 quota 参数:
      由于 quota 必须要让 partition 上面的 filesystem 支持才行,一般来说, 支持度最好的是 ext2/ext3 ,其他的 filesystem 类型鸟哥我是没有试过啦! 启动 filesystem 支持 quota 最简单就是编辑 /etc/fstab ,使得准备要开放的 quota 磁盘可以支持 quota 啰;

    2. 建立 quota 记录文件:
      刚刚前面讲过,整个 quota 进行磁盘限制值记录的档案是 aquota.user/aquota.group, 要建立这两个档案就必须要先利用 quotacheck 扫瞄才行喔!所以啰,接下来的步骤就是: 使用 quotacheck 来扫瞄一下我们要使用的磁盘啰;

    3. 编辑 quota 限制值数据:
      再来就是使用 edquota 来编辑每个使用者或群组的可使用空间啰;

    4. 重新扫瞄与启动 quota :
      设定好 quota 之后,建议可以再进行一次 quotacheck ,然后再以 quotaon 来启动吧!
    整个 quota 设定的步骤就只是这样而已,简单吧!我们底下就直接来用一个范例介绍一下整个流程, 好让您更清楚的了解到整个步骤喔!我范例是这样的:
    1. 鸟哥的这部 Linux 主机里面主要针对 quser1 及 quser2 两个用户来进行磁盘配额, 且这两个使用者都是挂在 qgroup 群组里面的喔。
    2. 每个用户总共有 50MB 的磁盘空间 (不考虑 inode) 限制!并且 soft limit 为 45 MB;
    3. 而宽限时间设定为 1 天,也就是说,这两个人可以突破 45MB 的限制, 但是在一天之内必须要将多余的档案砍掉,否则将无法使用剩下的空间 (也就是说,这个账号大概就不能进行档案新增的工作了);
    4. gquota 这个群组考虑最大限额,所以设定为 90 MB 好了!
    多说无用,我们就实际来进行啰!

    1. 准备好测试的环境,使用者与群组的建立:

      这两个账号应该是不存在我们的系统的,所以,赶紧将他设定上去吧!
      [root@linux ~]# groupadd qgroup
      [root@linux ~]# useradd -m -g qgroup quser1
      [root@linux ~]# useradd -m -g qgroup quser2
      [root@linux ~]# passwd quser1
      [root@linux ~]# passwd quser2
      


    2. 建立好 filesystem 的 quota 支持:

      由于 quota 较完整的支持是需要在 ext2/ext3 的 Linux 延伸格式档案才可以启动, 所以建议你就必须要将准备开启 quota 的磁盘启动参数,写进入 quota 的磁盘设定才行 ( /etc/fstab )!以鸟哥的例子而言,我想要在 /disk2 底下进行 quota 的限制 quser1, quser2 这两个人!这是因为我的 /disk2 是一个独立的扇区,这可以使用 df 来查询。 此外,必需要特别留意的是,最好不要以根目录亦即是 / 进行 quota 啦!否则容易有些问题呢! 另外,不要针对 root 做 quota 喔!反正做了也没用!
      [root@linux ~]# df
      Filesystem           1K-blocks      Used Available Use% Mounted on
      /dev/hda1              5952252   3193292   2451720  57% /
      /dev/hdb1             28267608     77904  26730604   1% /disk2
      /dev/hda5              9492644    227252   8775412   3% /disk1
      
      嗯!我的 /disk2 是独立的 partition ,并且他的装置名为 /dev/hdb1 ,好了!那么我就必须要启动 /disk2 这个 /dev/hdb1 的 quota 文件格式,好了!那么由于文件格式的设定是写在 /etc/fstab 里头,所以我们以 vi 来编辑他吧!只要在 /etc/fstab 里头增加了 usrquota, grpquota 就可以啦! (注:请特别留意,这两个项目请『务必』不要写错了!请在写入 /etc/fstab 之前好好的再次检查,因为写错之后,很有可能造成系统无法开机,虽然机率不高,但是有可能!)
      [root@linux ~]# vi /etc/fstab
      LABEL=/        /          ext3    defaults                    1 1
      LABEL=/disk1   /disk1     ext3    defaults                    1 2
      LABEL=/disk2   /disk2     ext3    defaults,usrquota,grpquota  1 2
      /dev/hda3      swap       swap    defaults                    0 0
      
      注意到我们所需要设定的那个 /disk2 的那一行,在第四字段多了 usrquota,grpquota 注意,在『 defaults,usrquota,grpquota 』之间都没有空格!

      这样就算加入了 quota 的磁盘格式了!不过,由于真正的 quota 在读取的时候是读取 /etc/mtab 这个档案的,偏偏这一个档案需要重新启动之后才能够以 /etc/fstab 的新数据进行改写!所以这个时候你可以选择:

      1. 重新启动 (reboot) ;
      2. 重新 remount filesystem 来驱动设定值!

      我是不太喜欢重新启动的人啦!所以我就这么做:
      [root@linux ~]# umount /dev/hdb1
      [root@linux ~]# mount -a
      [root@linux ~]# grep '/disk2' /etc/mtab
      /dev/hdb1 /disk2 ext3 rw,usrquota,grpquota 0 0
      
      # 事实上,也可以利用 mount 的 remount 功能!
      [root@linux ~]# mount -o remount /disk2
      
      嘿嘿嘿嘿!这样我们就已经成功的将 filesystem 的 quota 功能加入啰!另外,鸟哥这里是以 ext3 这个磁盘格式来测试 quota 的呦!


    3. 扫瞄磁盘的用户使用状况,并产生重要的 aquota.group 与 aquota.user:

      接着下来就是要来扫瞄一下我们所需要的磁盘到底有没有多余的空间可以让我们来设定 quota 呢?并且将扫瞄的结果输出到这个磁盘的最顶层去(也就是 /disk2 底下)这个时候就需要 quotacheck 这个指令的帮忙了!使用 quotacheck 就可以轻易的将所需要的数据给他输出了! 并且在 /disk2 底下会产生 aquota.group 与 aquota.user 这两个档案!
      [root@linux ~]# quotacheck -avug
      quotacheck: Scanning /dev/hdb1 [/disk2] done
      quotacheck: Checked 3 directories and 4 files
      [root@linux ~]# ll /disk2
      -rw-------  1 root root  6144 Sep  6 11:44 aquota.group
      -rw-------  1 root root  6144 Sep  6 11:44 aquota.user
      
      使用 quotacheck 就可以轻易的将所需要的数据给他输出了!但是很奇怪的是,在某些 Linux 版本中,我不能够以 aquota.user(group) 来启动我的 quota ,这有可能是因为旧版 quota 的关系, 所以我就另外做了一个 link 档案来欺骗 quota 啰:
      [root@linux ~]# cd /disk2
      [root@linux ~]# ln -s aquota.user quota.user
      [root@linux ~]# ln -s aquota.group quota.group
      # 除非您的 Linux distributions 是比较旧的版本,否则不会有这个问题,
      # 所以,这个动作你不必进行的!
      


    4. 启动 quota 的限额:

      再来就是要启动 quota 啦!启动的方式也是很简单的!就是使用 quotaon -av 即可:
      [root@linux ~]# quotaon -avug
      /dev/hdb1 [/disk2]: group quotas turned on
      /dev/hdb1 [/disk2]: user quotas turned on
      
      注意:要看到上面有个 turned on 的出现,才是真的成功了!


    5. 编辑使用者的可使用空间:

      由于我们有两个使用者要设定,先来设定 quser1 好了,使用 edquota 就对了:
      [root@linux ~]# edquota -u quser1
      Disk quotas for user quser1 (uid 502):
        Filesystem    blocks    soft    hard   inodes   soft   hard
        /dev/hdb1          0   45000   50000        0      0      0
      
      再次强调的是,因为我的 /disk2 里面并没有任何数据存在,所以,在上面这个表格当中, blocks 与 inodes 才会都是 0 ,如果您是使用 /home 来进行 quota 设定的, 那么 blocks/inodes 肯定不会是 0 ,这里要特别留意的。好了,上面特殊字体的部分就是我们的设定了, 分别是 45000 及 50000 ,那个单位是 KBytes 啦,转成 MBytes 应该是要除以 1024 才对, 不过,简单算一下就好了,不要太介意喔!^_^。然后将 quser1 的设定直接复制给 quser2 吧!
      [root@linux ~]# edquota -p quser1 quser2
      
      接下来要来设定宽限时间,还是使用 edquota !
      [root@linux ~]# 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/hdb1                     1days                  7days
      
      将时间改为 1 天(原本是 7days 改成 1days ),好了!查询一下是否真的有设定进去呢?使用 quota -v 来查询:
      [root@linux ~]# quota -vu quser1 quser2
      Disk quotas for user quser1 (uid 502):
           Filesystem  blocks   quota   limit   grace   files   quota   limit   grace
            /dev/hdb1       0   45000   50000               0       0       0
      Disk quotas for user quser2 (uid 503):
           Filesystem  blocks   quota   limit   grace   files   quota   limit   grace
            /dev/hdb1       0   45000   50000               0       0       0
      
      特别注意到,由于我们的使用者尚未超过 45 MB,所以 grace ( 宽限时间 ) 就不会出现啦!这样很够清楚了吧?!


    6. 编辑群组可使用的空间:

      [root@linux ~]# edquota -g qgroup
      Disk quotas for group qgroup (gid 502):
        Filesystem    blocks    soft    hard  inodes   soft   hard
        /dev/hdb1          0   80000   90000       0      0      0
      
      [root@linux ~]# quota -vg qgroup
      Disk quotas for group qgroup (gid 502):
           Filesystem  blocks   quota   limit   grace   files   quota   limit   grace
            /dev/hdb1       0   80000   90000               0       0       0
      
      这样就设定好了 group 的 quota 啰!同样的,因为整个群组的总使用量还没有到达 80000 KBytes, 当然那个 grace 就不会有任何信息显示了!但这个地方倒是有很多朋友来信问到一个小问题, 那就是『为什么我两个使用者 quser1, quser2 的设定值在 soft 与 hard 分别是 45/50MB ,但为何你的 group 总量 (hard) 设定仅有 90MB 呢?』,也就是说, 当我的某个使用者用了 50MB 的量,那另一个不就最多可以使用到 40MB 而已?原因何在啊?

      这么说好了,如果是小型的系统,由于用户并不是很多,我们可以针对每个人来进行 quota 的设定值,所以,当然针对 users 来进行设定即可,不需要额外的设定 group 的 quota 设定啦。

      但如果换个角度来思考,假设您所处的公司人员比较多且分工较细,因此, 我们可能无法真正了解每个使用者的需求,此时,针对每个使用者来设定可能就比较麻烦一点。 那么我们反过来说,可以针对每个部门 (group) 来进行 quota 的设定, 因为部门的需求直接跟部门的负责人询问就好了,比较容易,而该部门的使用者 quota 设定当然可以高一点, 因为,可能某些使用者有较为独特的需求啊!反正只要符合 group 的限制即可, 该部门如果超过整个 group quota 限制值,呵呵!让他们自己去处理即可! ^_^


    7. 设定开机时启动 quota:

      这个部分就不需要担心了,因为 FC4 与 Red Hat 系列的开机 script (/etc/rc.d/rc.sysinit) 已经将 quota 的侦测写入在里头,因此,在预设的情况下, quota 是会主动的被启动的。 不过,如果你想要手动的强制 quota 在开机启动一遍,那么可以使用 vi 去编辑 /etc/rc.d/rc.local ,在里面加入一行 (直接加在最后一行即可):
      [root@linux ~]# vi /etc/rc.d/rc.local
      /sbin/quotaon -avug
      
      如果要关闭 quota 就是用 quotaoff 吧!没错!这样就将 quota 设定完毕了!很简单吧!! ( 如果是 SuSE Server 9 的话,可能就要去修改 /etc/init.d/boot.local 这个档案啰! )


    8. 利用 repquota 显示更完整的 quota 结果报告:

      事实上,除了 quota 可以用来观察使用者与群组使用的 quota 限制值之外,其实, 我们还可以使用更详细的 quota 报告指令,就是 repquota 这个指令呢!他的基本用法是这样的:
      [root@linux ~]# repquota -a [-vug]
      参数:
      -a  :直接到 /etc/mtab 搜寻具有 quota 标志的 filesystem ,并报告 quota 的结果;
      -v  :输出所有的 quota 结果,而非仅下达指令者自己的 quota 限值;
      -u  :显示出用户的 quota 限值 (这是默认值);
      -g  :显示出个别群组的 quota 限值。
      范例:
      
      范例一:查阅系统内所有的具有 quota 的 filesystem 的限值状态:
      [root@linux ~]# repquota -av
      *** Report for user quotas on device /dev/hdb1
      Block grace time: 24:00; Inode grace time: 7days
                              Block limits                File limits
      User            used    soft    hard  grace    used  soft  hard  grace
      ----------------------------------------------------------------------
      root      --   77888       0       0              4     0     0
      quser1    --       0   45000   50000              0     0     0
      quser2    --       0   45000   50000              0     0     0
      
      Statistics:          <==这是所谓的系统相关信息,用 -v 才会显示
      Total blocks: 7
      Data blocks: 1
      Entries: 3
      Used average: 3.000000
      
      范例二:仅列出 user 与 group 的 quota 限值:
      [root@linux ~]# repquota -aug
      *** Report for user quotas on device /dev/hdb1
      Block grace time: 24:00; Inode grace time: 7days
                              Block limits                File limits
      User            used    soft    hard  grace    used  soft  hard  grace
      ----------------------------------------------------------------------
      root      --   77888       0       0              4     0     0
      
      
      *** Report for group quotas on device /dev/hdb1
      Block grace time: 7days; Inode grace time: 7days
                              Block limits                File limits
      Group           used    soft    hard  grace    used  soft  hard  grace
      ----------------------------------------------------------------------
      root      --   77888       0       0              4     0     0
      
      根据这些信息,您就可以知道目前的限制情况啰! ^_^

    大标题的图示不更动既有系统的 quota 实例
    好了,我们前面 账号管理 的部分曾经提到 e-mail 这个东西嘛!如果我们要设定一个对外开启的邮件主机的时候, 那么最好对于邮件空间有点限制比较好,免得如同上面提到的一些问题一样,造成使用者的使用权不一!所以说,使用 quota 确实是一个好建议!这个时候该怎么办呢?

    什么怎么办?嗯!是这样的,由于 quota 『只能针对整个 partition 进行整体的磁盘配额, 无法针对某个目录进行磁盘配额!』针对这个观念,我们不难发现,『 (1)将邮件存在个人的家目录与 (2)将邮件统一放在 /home 下的一个共享目录 』是一样的!为什么呢?这是因为 quota 针对的是整个磁盘呀!呵呵!所以啰,您必须先确定『您的 /home 是一个独立的 partition 』才行!

    不过,很可惜的是,当初我们进行 Linux 主机安装时,如果忘记将 /home 独立成一个 partition 时, 那该怎么办?是否需要将 /home 进行重新分割与挂载?还有,如果也忘记将 /var/spool/mail 这个 mailbox 放置的目录独立出来,又该如何是好啊?举个简单的例子来说,在鸟哥上面的那个实作当中, 你会发现,我的 partition 仅有 /, /disk1, /disk2 ,那我的所有使用者都在 /home 里面, 邮件在 /var/spool/mail 底下,真要命喔!怎么办啊?

    其实没有怎么难啦!既然 quota 是针对整个 partition 来进行限制,那我又已经将 /disk2 做好 quota 了, 那么我只要:
    1. 将 /home 这整个目录搬移到 /disk2 底下;
    2. 利用 ln -s /disk2/home /home 来建立链接数据;
    3. 将 /var/spool/mail 整个搬移到 /disk2 底下;
    4. 利用 ln -s /disk2/mail /var/spool/mail 来建立链接数据。
    只要这样的一个小步骤,嘿嘿!您家主机的邮件就有一定的限额啰!当然啰!您也可以依据不同的使用者与群组来设定 quota 然后同样的以上面的方式来进行 link 的动作!嘿嘿嘿!就有不同的限额针对不同的使用者提出啰!很方便吧!! ^_^


    大标题的图示本章习题练习
    ( 要看答案请将鼠标移动到『答:』底下的空白处,按下左键圈选空白处即可察看 )
    • 如果我有一个 Linux 主机,未来想要对外提供 mail 与 WWW 的服务,同时预计提供个人网页空间的服务,然而我希望 mail 提供 30 MB 而 WWW 则提供 20MB 的空间,那么我应该如何规划我的主机?
    • 在 quota 的限制中,由于他限制的是整个 partition 呢!所以既然要分为两个服务来限制,就需要设定成两个 partition 了!这个案例当中是以 Linux 为新架设的角度来看,所以我们的规划就较为简单!假设我的硬盘为 30GB 的硬盘,那么我可以这样设定:
        /  256 MB
        Swap 2 * RAM
        /usr  3~5 GB
        /backup 5GB
      其他的空间平均分给
        /home
        /var/spool/mail
      这样就可以啦!然后安装完成之后,套用 quota 的设定,即可做好限制啰!很是方便的!

    2002/07/14:第一次完成
    2003/02/10:重新编排与加入 FAQ
    2003/09/02:加入 quotacheck 发生错误时的解决方法。
    2005/09/06:将旧的文章移动到 此处
    2005/09/06:进行版面风格的转换,并且进行数据的查询,加入 repquota 的简单说明而已!
     
         
    http://linux.vbird.org is designed by VBird during 2001-2011. ksu.edu 

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