quota 小记

前一段时间,接到阿里云计算的电话面试,在谈话中对方提到一个问题,如果磁盘空间还有剩余,但是用户无法创建文件,会有哪些情况?当时只想到可能是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一起了解一下

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据