Linux 磁碟配额( Quota )

发表于:2007-07-04来源:作者:点击数: 标签:
因为公司最近决定要用webmail了, 服务器 架在公司里面,为了维护的便利性,需要给每一个邮件的使用者限定使用空间; 在网路上找到了这篇文章觉得说明的挺详细,所以搬到了我的blog上来。 Linux 磁碟配额( Quota ) 来源: 鸟哥私房菜 什么是 quota? quota
因为公司最近决定要用webmail了,服务器架在公司里面,为了维护的便利性,需要给每一个邮件的使用者限定使用空间;
在网路上找到了这篇文章觉得说明的挺详细,所以搬到了我的blog上来。

Linux 磁碟配额( Quota )
来源:鸟哥私房菜



  什么是 quota?
  quota 就字面上的意思来看,呵呵!就是有多少『限额』的意思啦!如果是用在零用钱上面,就是『有多少零用钱一个月』的意思之类的。如果是在容量空间上面呢?
以 Linux 来说,呵呵!就是有多少容量限制的意思。
   在 Linux系统中,由于是多人多工的环境,所以会有多人共同使用一个硬碟空间的情况发生,如果其中有少数几个使用者大量的占掉了硬碟空间的话,那势必压缩其
他使用者的使用权力!因此管理员应该适当的开放硬碟的权限给使用者,以妥善的分配系统资源!避免有人抗议呀!比较常使用的几个情况是:
  ·(1) 例如每个人的网页空间的容量限制!
  ·(2) 每个人的邮件空间限制。
  在 Linux 当中,使用来作为硬碟空间管理的就是所谓的 quota 这个咚咚啦!使用这个模组要有几个步骤,底下就分别说说吧!另外要特别注意的是,使用 quota 时有几
基本的限制需要谈一谈:
   ·quota 实际在运作的时候,是针对『整个 partition』进行限制的,例如:如果你的 /dev/hda5 是挂载在 /home 底下,那么在 /home 底下的所有目录都会受到限制!
·Linux 系统核心必须有支援 quota 这个模组才行:如果您是使用 Mandrake的预设核心,嘿嘿!那恭喜你了,你的系统已经预设有开放 quota 这个模组!如果您是自行
编译核心的,那么请特别留意您是否已经『真的』开启了quota 这个模组?否则底下的功夫将全部都视为『白工』。至于核心编译的过程我们会在未来进行说明呦!
  ·目前新版的 Linuxdistributions 如: 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 ,却还没有到达 hardlimit 时,那么在这个『宽限时间』之内,
就必需要请使用者将使用的磁碟容量降低到 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 -uvstest <==显示 test 这个使用者的 quota 值
 说明:
   这个指令仅是使用来『显示(display)』目前某个群组或者某个使用者的 quota 限值!您可以使用来观察一下呦!
· quotacheck
   语法:
[root @test /root ]# quotacheck [-auvg] /yourpath
参数说明: -a :扫瞄所有在/etc/mtab 里头已经 mount 的具有 quota 支援的磁碟 -u :扫瞄使用者的档案与目录 -v :显示扫瞄过程 -g:扫瞄群组使用的档案与目录
范例: [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:37aquota.group -rw------- 1 root root 7168 May 6 18:37 aquota.user
  说明:
  这这个指令主要的目的在扫瞄某一个磁碟的 quota空间,他会针对该磁碟进行扫瞄,并且,由于该磁碟若持续运作时,可能扫瞄的过程中,档案可能会增减,造成 quota 扫
瞄的错误发生,因此,当使用quotacheck时,该磁碟将『自动被设定成为唯独磁区(read-only);至于扫瞄完毕之后,扫瞄所得的磁碟空间结果会写入该磁区最顶端(例如:
在我的例子中,扫瞄/home 这个 /dev/hda3 的磁区,如果是初次扫瞄,那么扫瞄完毕之后会产生 aquota.user 与 aquota.group,会放置在 /home/aquota.xxx 底下!而
如果是建立 quota 后的扫瞄,那么就会更新这两个档案!)另外, Linux也特别强调 quota 在使用的时候,需要特别注意在 reboot 时,得先将 quota 关闭才好!

 · 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 5000 5000 5 5000 5000
[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: Timeunits may be: days, hours, minutes, or seconds Filesystem Block graceperiod 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 设定启动 -s:显示讯息
范例: [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 可以作用的功能有很多,包括了:
   o 限制某一群组所能使用的最大磁碟配额(使用 群组限制):你可以将你的主机上的使用者分门别类,有点像是目前很流行的付费与免付费会员制的情况,你比较喜好的
那一群的使用配额就可以给高一些!呵呵!^_^... o 限制某一使用者的最大磁碟配额(使用 使用者限制):在限制了群组之后,您也可以再继续针对个人来进行限制,
使得同一群组之下还可以有更公平的分配!
   o 以 Link的方式,来使邮件可以作为限制的配额(更改 /var/spool/mail这个路径):如果是分为付费与免付费会员的『邮件主机系统』,是否需要重新再规划一个硬碟
呢?也不需要啦!直接使用 Link 的方式指向 /home(或者其他已经做好的 quota 磁碟)就可以啦!
  底下先列出几个主要的步骤来说明:
   4.开启磁碟的 quota 功能:编辑 /etc/fstab ,使得准备要开放的 quota 磁碟可以支援 quota ;
   5.预扫瞄磁碟的使用情况:使用 quotacheck 来扫瞄一下我们要使用的磁碟;
   6.建立使用者的 quota :使用 edquota 来编辑每个使用者或群组的可使用空间;
   7.启动 quota :使用 quotaon 吧!
   整个步骤大致上就只有这几步,我们来瞧一瞧如何使用吧!!底下我们以一个简单的范例来进行 quota 的说明!整个范例的说明如下:
   8.我们假设 test 这部主机里头有 test 与 test2 这两个使用者,且他们两个都挂在 test 这个群组下;
   9.每个使用者总共有 50MB 的磁碟空间(不考虑 inode )限制!并且 soft limit 为 45 MB;
   10.而宽限时间设定为 1 天,也就是说,这四个人可以突破 40MB 的限制,但是在一天之内必须要将多余的档案砍掉,否则将无法使用剩下的空间(也就是说,这个帐号
大概就不能使用了?);
 11.test 这个群组考虑最大限额,所以设定为 90 MB 好了!
   
  整个执行步骤可以照下面来执行看看:
  1.建立 test2 这个使用者:
  由于我们之前只有 test 这个使用者挂在 test 群组之中,所以必需要先设定一下 test2 这个使用者!因为他的群组必需是 test这个,而我们去查了一下 /etc/group 发现 test
的 uid 为 501 ,因此,我们可以这样来设定 test2 呢!
   [root @test root]# useradd –m –g 501 test2
[root @test root]# passwdtest2
Changing password for user test2.
New UNIX password: **********
Retype newUNIX password: passwd: **********
all authentication tokens updated suclearcase/" target="_blank" >ccessfully.
  2. 
  3.开启磁碟的 quota 功能:
  由于 quota 需要在 ext 的 Linux 延伸格式档案才可以启动,所以你就必须要将准备开启 quota 的磁碟启动参数,写进入quota 的磁碟设定才行 ( /etc/fstab )!以我的例子
而言,我想要在 /home 底下进行 quota 的限制test,test2 这两个人!正巧 /home 是一个独立的磁区,这可以使用 df 来查询:此外,必需要特别留意的是,最好不要以根目
录亦即是 / 进行quota 啦!否则容易有些问题呢!另外,不要针对 root 做 quota 喔!
[root @test root]# df
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/hda1 19049201088136 720020 61% /
/dev/hdb1 976344 71504 854444 8% /backup
/dev/hdb2101540 4252 92048 5% /home
  4. 
  嗯!我的 home 是独立的 partition,并且他的装置名为 /dev/hdb2 ,好了!那么我就必须要启动 /home 这个 /dev/hdb2 的 quota档案格式,好了!那么由于档案格式的设定
是写在 /etc/fstab 里头,所以我们以 vi 来编辑他吧!只要在 /etc/fstab里头增加了 usrquota, grpquota 就可以啦!『注:请特别留意,这两个项目请『务必』不要写错了!请
再写入 /etc/fstab之前好好的再次检查,因为写错之后,很有可能造成系统无法开机(虽然机率不高,但是有可能!?)』
[root @testroot]# vi /etc/fstab
# device MountPoint filesystem parameters dumpfsck
/dev/hda1 / ext3 defaults 1 1
/dev/hda2 swap swap defaults 0 0
/dev/hdb1 /backup ext3 defaults 1 1
/dev/hdb2 /home ext3 defaults 1 1none
/dev/pts devpts mode=0620 0 0
none /proc proc defaults 0 0
上面的黄色字体改成底下的样子!
/dev/hdb2 /home ext3 defaults,usrquota,grpquota 1 1
  5. 
  多了 usrquota,grpquota 注意,由 defaults,usrquota,grpquota 之间都没有空格!
  这样就算加入了 quota 的磁碟格式了!不过,由于真正的 quota 在读取的时候是读取 /etc/mtab 这个档案的,偏偏这一个档案需要重新开机之后才能够以 /etc/fstab 的新资料进
行改写!所以这个时候你可以选择:
  6.(1)重新开机==>reboot;也可以选择
  (2)重新 remount filesystem 来驱动设定值!
  7. 
  我是不太喜欢重新开机的人啦!所以我就这么做:
 [root@test /]# umount /dev/hdb2
[root@test /]# mount -a
[root@test /]#more /etc/mtab
/dev/hda1 / ext3 rw 0 0
none /proc proc rw 0 0
none/proc/bus/usb usbdevfs rw 0 0
none /dev devfs rw 0 0
none /dev/ptsdevpts rw,mode=0620 0 0
/dev/hdb1 /backup ext3 rw 0 0
/dev/hdb2 /homeext3 rw,usrquota,grpquota 0 0
或者以下列的方式重新 mount 所有的磁碟:
[root @test /root]# mount -a -o remount <==这个指令可以重新将 /etc/fstab 的咚咚 mount 下来!
  8. 
  嘿嘿嘿嘿!这样我们就已经成功的将 quota 的功能写入 partition 当中!另外,我们这里是以 ext3 这个磁碟格式来测试 quota 的呦!
  9.扫瞄磁碟的使用者使用状况,并产生重要的 aquota.group 与 aquota.user:
  接着下来就是要来扫瞄一下我们所需要的磁碟到底有没有多余的空间可以让我们来设定 quota呢?并且将扫瞄的结果输出到这个磁碟的最顶层去(也就是 /home 底下)这个
时候就需要 quotacheck 这个指令的帮忙了!使用quotacheck 就可以轻易的将所需要的资料给他输出了!现在就 OK 啦!并且在 /home 底下会产生 aquota.group 与
aquota.user 这两个档案!
[root@test /]# quotacheck -avug
quotacheck:Scanning /dev/hdb2 [/home] done
quotacheck: Checked 10 directories and22 files
/home total 44 -rw------- 1 root root 7168Oct 28 14:05 aquota.group -rw------- 1 root root 7168 Oct 28 14:05aquota.user drwx------ 2 root root 16384 Oct
22 16:54 lost+found/drwxr-xr-x 3 test test 4096 Oct 28 01:45 test/ drwxr-xr-x 3 test2 test4096 Oct 28 13:37 test2/
  10. 
  使用 quotacheck就可以轻易的将所需要的资料给他输出了!现在就 OK 啦!并且在 /home 底下会产生 aquota.group 与 aquota.user这两个档案!注:但是很奇怪的是,
在某些 Linux 版本中,我不能够以 aquota.user(group) 来启动我的 quota,真的是很奇怪呢!所以我就另外做了一个 link 档案来欺骗 quota :
[root @test /root ]# cd/home
[root @test /root ]# ls -l aquota* -rw------- 1 root root 7168May 6 22:16 aquota.group -rw------- 1 root root 7168 May 6 22:16aquota.user
[root @test /root ]# ln -s aquota.group quota.group [root@test /root ]# ln -s aquota.user quota.user
  11. 
  12.启动 quota 的限额!
  再来就是要启动 quota 啦!启动的方式也是很简单的!就是使用 quotaon -av 即可:
[root@test /]#quotaon -av
/dev/hdb2 [/home]: group quotas turned on /dev/hdb2[/home]: user quotas turned on
  13. 
  注意:要看到上面有个 turned on 的出现,才是真的成功了!
  14.编辑使用者的可使用空间:
  由于我们有两个使用者要设定,先来设定 test 好了,使用 edquota 就对了
   [root @test /]# edquota –u test
Disk quotas for user test (uid 501):Filesystem blocks soft hard inodes soft hard /dev/hdb2 32 0 0 8 0 0
将上面的原本设定改为底下的模样: Disk quotas for user test (uid 501): Filesystem blockssoft hard inodes soft hard /dev/hdb2 32 40000 50000 8 0 0
  15. 
  要特别留意的是,上面的黑体数值代表的是 KB 呦!转成 MB 是需要乘上 1024 倍,这里简单的计算一下就好了!这样就算编辑完毕了!接下来我们就需要将这个设定同时
复制给 test2 这个家伙!
   [root@test /]# edquota -p test test2
  16. 
  接下来要来设定宽限时间,还是使用 edquota !
   [root@test /]# edquota -t
Grace period before enforcing soft limitsfor users: Time units may be: days, hours, minutes, or seconds
Filesystem Block grace period Inode grace period /dev/hdb2 1days 1days
  17. 
  将时间改为 1 天(原本是 7days 改成 1days ),好了!查询一下是否真的有设定进去呢?使用 quota -v 来查询
   [root@test /]# quota –vu test test2
Disk quotas for user test (uid501): Filesystem blocks quota limit grace files quota limit grace/dev/hdb2 32 40000 50000 8 0 0
Disk quotas for user test2 (uid 502):Filesystem blocks quota limit grace files quota limit grace /dev/hdb228 40000 50000 7 0 0
  18. 
  特别注意到,由于我们的使用者尚未超过 40 MB,所以 grace ( 宽限时间 )就不会出现啦!这样很够清楚了吧?!
  19.编辑群组使用空间:
  其实也差不多,还是使用 edquota:
  [root@test /]# edquota -g test
Disk quotas for group test (gid 501):
Filesystem blocks soft hard inodes soft hard
/dev/hdb2 60 0 0 15 0 0
修改成底下这样:
Disk quotas for group test (gid 501):
Filesystem blocks softhard inodes soft hard /dev/hdb2 60 80000 90000 15 0 0
[root@test /]#quota -vg test
Disk quotas for group test (gid 501):
Filesystem blocksquota limit grace files quota limit grace /dev/hdb2 60 80000 90000 15 00
  20. 
  21.设定开机时启动:
  开机的时候自动启动的设定在哪里还记得吗?没错!就是在 /etc/rc.d/rc.local 底下:所以你可以使用 vi 在这个档案的最后面加上一行:
[root @test /root ]# vi /etc/rc.d/rc.local /sbin/quotaon -aug
  22. 
  如果要关闭 qutoa 就是用 quotaoff 吧!没错!这样就将 quota 设定完毕了!很简单吧!!
  使用邮件主机进行 quota 的实例:
  好了,我们前面账号管理的部分曾经提到 e-mail这个东西嘛!好了,如果我们要设定一个对外开启的邮件主机的时候,那幺最好对于邮件空间有点限制比较好,免得如同上面提
到的一些问题一样,造成使用者的使用权不一!所以说,使用 quota 确实是一个好建议!这个时候该怎幺办呢?什幺怎幺办?嗯!是这样的,由于 quota 『只能针对一个partition
进行整体的磁碟配额,无法针对某个目录进行磁碟配额!』针对这个观念,我们不难发现,『(1)将邮件存在个人的家目录与(2)将邮件统一放在 /home 下的一个共用目录』是一
样的!为什幺呢?这是因为 quota针对的是一个磁碟呀!呵呵!所以,您必须先确定『您的 /home 是一个独立的 partition 』才行!当然,您也可以使用其他的独立的partition
来进行底下的步骤!但是在这里,我们预设以 /home 这一个目录来假定这一个目录是一个独立的 partition !
  如此则在 /home 底下,由于每个人的磁碟配额已经设定好了!所以当然!该信件就可以得到完整的 quota 限额的限制了!所以呢,就需要进行下面的步骤:
  1.以 上面设定 的方式设定好使用者 quota 的所有工作(即是在 /home 这个 partition );
  2.将 /var/spool/mail 这个邮件预设的资料夹备份到其他的目录去;
  3.建立 /home/mail,这是因为假设我们的邮件放置在这个目录中;
  4.修改 /home/mail 的属性,使成为 拥有者 root ,群组 mail ,及属性为 775 才行!
  5.将 /home/mail 给他 Link 到 /var/spool/mail 去即可!
  6.以后每个人的邮件将都会放置 /home/mail 这个目录中!
  1. 建立并修改 /home/mail 这个目录:
[root @test /root ]# mkdir /home/mail
[root@test /root ]# chown root:mail /home/mail
[root @test /root ]# chmod775 /home/mail
2. 备份并移动原本的 mail 到 /home/mail 底下去:
[root @test /root ]#cp -r /var/spool/mail /var/spool/mail.back
[root @test /root ]# mv/var/spool/mail/* /home/mail
[root @test /root ]# rmdir /var/spool/mail
3. 建立连结:
[root @test /root ]# ln -s /home/mail /var/spool/mail
  只要这样的一个小步骤,嘿嘿!您家主机的邮件就有一定的限额!当然!您也可以依据不同的使用者与群组来设定 quota 然后同样的以上面的方式来进行 link 的动作!嘿嘿嘿!
就有不同的限额针对不同的使用者提出!很方便吧!

原文转自:http://www.ltesting.net