前一段时间,接到阿里云计算的电话面试,在谈话中对方提到一个问题,如果磁盘空间还有剩余,但是用户无法创建文件,会有哪些情况?当时只想到可能是inode节点满,后来仔细回味了一下,既然是云平台,看一下各大云盘和云主机厂商推出的个业务,这不正是将quota的功能发挥到了极致吗。反省之余,抽空研究了一下quota的使用,聊以安慰。
首先嘛,先看一下quota的字面意思
quota
noun
[C] the limited number or amount of people or things that is officially allowed: to introduce a strict import quota on grain ◆ a quota system for accepting refugees
[C] an amount of sth that sb expects or needs to have or achieve: I'm going home now-I've done my quota of work for the day. ◆ to get your full quota of sleep
[sing.] (politics) a fixed number of votes that a candidate needs in order to be elected: He was 76 votes short of the quota.
!@#@¥@!#@!¥%%×&(×&(@!#,看不懂英语没关系,看懂鸟哥linux就行了,我们就按照鸟哥的介绍,一步步实践一下quota这个东东(这里要插一段废话,我觉得从网上看到的零散的内容,很不利于学习一个庞大而完整的系统或者语言,除非你只是而且仅使用搜索到的这一部分)
看一下当前虚拟机系统的挂载目录
# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/hda2 3.8G 2.9G 769M 80% /
/dev/hda3 4.9G 1.7G 3.0G 36% /home
/dev/hda1 46M 11M 33M 25% /boot
tmpfs 252M 4.0K 252M 1% /dev/shm
很幸运,当初分区的时候/home是单独挂载在分区/dev/hda3上面的,因为quota的目标是整个partition,所以下面就以/dev/hda3来做测试
接下来在fstab中开启/dev/hda3的quota功能,如下在default后面添加两项usrquota,grpquota
LABEL=/ / ext3 defaults 1 1
LABEL=/home /home ext3 defaults,usrquota,grpquota 1 2
LABEL=/boot /boot ext3 defaults 1 2
tmpfs /dev/shm tmpfs defaults 0 0
devpts /dev/pts devpts gid=5,mode=620 0 0
sysfs /sys sysfs defaults 0 0
proc /proc proc defaults 0 0
LABEL=SWAP-sda5 swap swap defaults 0 0
然后重启系统。按照鸟哥介绍的方法重新挂载好像不生效,测试虚拟机系统是CentOS5.6X86版本
umount /dev/hda3
mount /dev/hda3 /home
和
mount -o remount /dev/hda3
重启之后就可以看到mtab中,/dev/hda3分区已经有了quota属性了:
/dev/hda2 / ext3 rw 0 0
proc /proc proc rw 0 0
sysfs /sys sysfs rw 0 0
devpts /dev/pts devpts rw,gid=5,mode=620 0 0
/dev/hda3 /home ext3 rw,usrquota,grpquota 0 0
/dev/hda1 /boot ext3 rw 0 0
tmpfs /dev/shm tmpfs rw 0 0
none /proc/sys/fs/binfmt_misc binfmt_misc rw 0 0
sunrpc /var/lib/nfs/rpc_pipefs rpc_pipefs rw 0 0
依照说明继续操作,分别对quotacheck,edquota,quotaon,quotaoff和repquota进行测试
首先是quotacheck,由于鸟哥的文章是很早之前写的,我又没有最新的版本,所以只能查看当前man帮助说明:
NAME
quotacheck - scan a filesystem for disk usage, create, check and repair quota files
SYNOPSIS
quotacheck [ -gubcfinvdMmR ] [ -F quota-format ] -a | filesystem
在Man里有一个特别强调的地方:强烈建议在执行quotacheck时关闭文件系统的quotas功能,应该是建议我们在运行quotacheck之前,先使用quotaoff停止quota
OPTIONS
-b 强制quotacheck在写入新的数据之前备份quota file
-v quotacheck显示执行过程的详细信息。如果指定这个选项两次,会同时打印当前目录(打印会 极大的影响扫描速度)
-d 开启debug模式
-u 只检查/etc/mtab或者文件系统中指指定的user quotas,默认使用此选项
-g 只检查/etc/mtab或者文件系统中指定的group quotas
-c 不读取现有的quota文件。执行一次新的扫描并保存新的quota文件
-f 强制检查打开了quotas的文件系统并写一个新的quota文件。这一选项创建的quota文件可能 是不同步的,所以不建议使用
-M 如果remount失败则强制使用read-write模式检测文件系统。请在确保没有程序在访问文件系 统时使用此选项
-m 不使用read-only模式remount文件系统
-i 交换模式。默认quotacheck在发现错误之后会退出。在交换模式下会要求用户输入
-n 如果quota文件已经损坏,这个选项可以允许从一个已知的用户或者组复制一份quota配置。 通常在这种情况下,quotacheck会退出或者询问用户输入。使用这个选项,通常使用第一个 发现的quota条目
-F 格式名字
以指定的格式检查并修复quota文件。这个选项可以增加quota文件损坏时的修复概率,支持 的格式有:vfsold(quota版本1),vfsv0(quota版本2),rpc(NFS上的quota),xfs(XFS文件系统 上的quota)
-a 检查所有/etc/mtab中记录的非NFS文件系统
-R 配置-a选项使用,检查所有文件系统,但排除root文件系统
实际操作一下:
# quotacheck -avug
quotacheck: Scanning /dev/hda3 [/home] quotacheck: Cannot stat old group quota file: No such file or directory
quotacheck: Cannot stat old group quota file: No such file or directory
done
quotacheck: Checked 4649 directories and 78604 files
quotacheck: Old file not found.
看/home下面已经多了两个文件,aquota.group和aquota.user
# ls -al /home
-rw------- 1 root root 7168 Mar 23 01:29 aquota.group
-rw------- 1 root root 7168 Mar 23 01:29 aquota.user
创建两个测试用户:
# groupadd qgroup
# useradd -m -g qgroup quser1
# useradd -m -g qgroup quser2
# passwd quser1
# passwd quser2
-m选项是创建用户目录,在/home下面应该出现新建的两个用户的根目录
#ls -al /home
drwx------ 3 quser1 qgroup 4096 Mar 23 01:48 quser1
drwx------ 3 quser2 qgroup 4096 Mar 23 01:48 quser2
接着浏览一下quotaon和quotaoff的Man说明,以启动quota
NAME
quotaon, quotaoff - turn filesystem quotas on and off
SYNOPSIS
/sbin/quotaon [ -vugfp ] [ -F format-name ] filesystem...
/sbin/quotaon [ -avugfp ] [ -F format-name ]
/sbin/quotaoff [ -vugp ] [ -x state ] filesystem...
/sbin/quotaoff [ -avugp ]
OPTIONS
quotaon
-a 启动所有/etc/fstab中的非NFS文件系统的quotas。通常在启动时使用这个选项
-v 显示每一个文件系统运行quotas的路径
-u 操作用户quotas,默认选项
-g 操作组quotas
-P 打印quotas的状态,不执行启动操作
-f 让quotaon和quotaoff调用时执行一样的动作
quotaoff
-F 格式名称
报告指定格式的quota信息。支持的格式有:vfsold(quota版本1),vfsv0(quota版本2), rpc(NFS上的quota),xfs(XFS文件系统上的quota)
-a 关闭所有/etc/fstab中文件系统上的quota
-v 显示执行关闭操作的每一个文件系统信息
-u 操作用户quotas,默认选项
-g 操作组quotas
-P 打印quotas的状态
-x delete 释放XFS文件系统上保存的quota信息的空间(内部维护的)
-x enforce 关掉XFS文件系统上的限制
好了,启动quota
# quotaon -avug
/dev/hda3 [/home]: group quotas turned on
/dev/hda3 [/home]: user quotas turned on
编辑quser1的配额
# edquota -u quser1
Disk quotas for user quser1 (uid 501):
Filesystem blocks soft hard inodes soft hard
/dev/hda3 28 30000 50000 7 0 0
这里设置soft限制为30000KB,hard限制为50000KB。
复制配额配置给用户quser2
# edquota -p quser1 quser2
设置grace(宽限)时间
# 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/hda3 6days 7days
(grace时间设置支持seconds,minutes,hours,days)
查询配额设置
# quota -v -u quser1 quser2
Disk quotas for user quser1 (uid 501):
Filesystem blocks quota limit grace files quota limit grace
/dev/hda3 28 30000 50000 7 0 0
Disk quotas for user quser2 (uid 502):
Filesystem blocks quota limit grace files quota limit grace
/dev/hda3 28 30000 50000 7 0 0
编辑群组配额空间:
# edquota -g qgroup
Disk quotas for group qgroup (gid 501):
Filesystem blocks soft hard inodes soft hard
/dev/hda3 56 90000 100000 0 14 0 0
利用repquota显示quota报告
NAME
repquota - summarize quotas for a filesystem
SYNOPSIS
/usr/sbin/repquota [ -vsiug ] [ -c | -C ] [ -t | -n ] [ -F format-name ] filesystem...
/usr/sbin/repquota [ -avtsiug ] [ -c | -C ] [ -t | -n ] [ -F format-name ]
OPTIONS
-a 报告所有在/etc/fstab中文件系统quotas的信息
-v 报告所有qutas信息,即使没有启动quota
-c Cache entries to report and translate uids/gids to names in big chunks by scanning all
users (default). This is good (fast) behaviour when using /etc/passwd file.
缓存报告中的条目并将uid/gid转换成对应的名称
-C Translate individual entries. This is faster when you have users stored in database.
转换单独的条目
-t 截断超过9个字符的用户名/组名
-n 不将uid/gid转换成名称显示,可以显著提高输出速度
-s 尝试用更合适的单位显示用户空间使用,inodes使用和限制信息。也就是在大数字面前,会 加一些单位以显得更加好看,和du的-h选项有些类似
-i 忽略自动挂载的挂载点
-F format-name
Report quota for specified format (ie. don’t perform format autodetection). Possible for-
mat names are: vfsold (version 1 quota), vfsv0 (version 2 quota), xfs (quota on XFS
filesystem)
-g 打印group组的quotas信息
-u 打印user的quotas信息,默认选项。
只有root用户才能查看不属于自己quotas信息
# repquota -a -v
*** Report for user quotas on device /dev/hda3
Block grace time: 6days; Inode grace time: 7days
Block limits File limits
User used soft hard grace used soft hard grace
----------------------------------------------------------------------
root -- 1040152 0 0 7301 0 0
ts -- 652568 0 0 75920 0 0
hadoop -- 1160 0 0 30 0 0
quser1 -- 28 30000 50000 7 0 0
quser2 -- 28 30000 50000 7 0 0
Statistics:
Total blocks: 7
Data blocks: 1
Entries: 5
Used average: 5.000000
配置基本完成,来测试一下quser1的quota功能。在quser1的根目录下上传一个35M的文件,使用repquota查看记录:
# repquota -va
*** Report for user quotas on device /dev/hda3
Block grace time: 6days; Inode grace time: 7days
Block limits File limits
User used soft hard grace used soft hard grace
----------------------------------------------------------------------
root -- 1040152 0 0 7301 0 0
ts -- 652568 0 0 75920 0 0
hadoop -- 1160 0 0 30 0 0
quser1 +- 34888 30000 50000 5days 10 0 0
quser2 -- 28 30000 50000 7 0 0
Statistics:
Total blocks: 7
Data blocks: 1
Entries: 5
Used average: 5.000000
可以看到quser1的grace已经开始计时了。接着将quser1的使用空间降到30M以下,查看quota状态:
# repquota -va
*** Report for user quotas on device /dev/hda3
Block grace time: 6days; Inode grace time: 7days
Block limits File limits
User used soft hard grace used soft hard grace
----------------------------------------------------------------------
root -- 1040152 0 0 7301 0 0
ts -- 652568 0 0 75920 0 0
hadoop -- 1160 0 0 30 0 0
quser1 -- 32 30000 50000 9 0 0
quser2 -- 28 30000 50000 7 0 0
Statistics:
Total blocks: 7
Data blocks: 1
Entries: 5
Used average: 5.000000
状态恢复了,grace自动消失。这次复制超过50M的数据文件
$mv /tmp/ibdata1 /tmp/test.exe /tmp/wic_x86_enu.exe ~/
hda3: warning, user block quota exceeded.
hda3: write failed, user block limit reached.
mv: writing `./wic_x86_enu.exe': Disk quota exceeded
$ ls -al
-rw-r--r-- 1 quser1 qgroup 14514680 Mar 23 18:56 test.exe
-rw-r--r-- 1 quser1 qgroup 933888 Mar 23 19:04 wic_x86_enu.exe
$ ls -al /tmp/wic_x86_enu.exe
-rw-r--r-- 1 quser1 qgroup 937984 Mar 23 18:57 /tmp/wic_x86_enu.exe
对比一下上面复制后和原始的文件wic_x86_enu.exe,发现超过限额之后,就会限制用户再写入数据
后记:quota的使用还是比较简单的,但是在配置磁盘额度的时候,没有发现说明中有支持MB,GB等关键字的字眼,这在配置上带来少许的不美观。至于如何开机启动等,我想再找个时间顺带学习chkconfig一起了解一下