首页 > 代码库 > Linux系统管理14——磁盘配额(Quota)

Linux系统管理14——磁盘配额(Quota)

Linux系统管理14——磁盘配额(Quota(课外知识补充02)

磁盘配额Quota)概述

Linux系统中,由于是多人多任务环境,所以会有很多人共同使用一个硬盘空间的情况发生,如果其中少数几个使用者大量的占用硬盘空间的话,那势必会压缩其他用户的使用权力,因此,管理员应该适当的限制硬盘的容量给用户,以妥善分配系统资源。

 

1Quota的规范设定项目

1)容量限制(block 此方法较为常见

2)文件数量限制(inode

 

2、柔性劝导与硬性规定(soft/hard

不管是inode还是block限制,分别都有两个限制值,即softhard。通常hard限制比soft要高。

例如,若限制项目为block,可以限制hard500M,而soft400M。那么,用户使用量绝对不可以高于500M,一旦超过,系统会锁住该用户的磁盘使用权,用户需自行删除一些无用的文件以减少磁盘使用量。若用户在用量低于400M时,可以正常使用。若用户使用量介于400M~500M之间,则每次用户登入系统时,系统会主动发出磁盘即将爆满的警告信息,且会给予一个宽限时间(grace time),默认为7天,若7天内使用者将用量降至400M以下,则宽限时间会停止,否则超过7天后系统将以400M作为硬性规定(取代500M)限制,锁住用户的磁盘使用权。

技术分享

二、磁盘配(Quota)的设置

1、涉及命令:

1quotacheck命令:扫描文件系统并建立Quota的记录文件

1>格式:quotacheck [选项] [挂载点目录]

2>常用选项:

-a:扫描所在/etc/mtab内,含有quota支持的文件系统,加上此参数后可不写 挂载点目录。

-u:针对用户扫描文件与目录的使用情况,建立aquota.user文件

-g:针对组扫描文件与目录的使用情况,建立aquota.group文件

-v:显示扫描过程的详细信息

-f:强制扫描文件系统,并写入新的quota配置文件(危险)

-M:强制以读写的方式扫描文件系统(只有在特殊情况下才会使用)

常用选项组合:quotacheck -avug

 

2quotaon/quotaoff命令:启动/关闭quota服务

1>格式:quotaon/quotaoff [选项] [挂载点目录]

2>常用选项:

-a:根据/etc/mtab内的文件系统设定启动有关的quota服务,若不加此参数, 需在后面指定文件系统

-u:针对用户启动quotaaquota.user

-g:针对组启动quotaaquota.group

-v:显示启动过程的详细信息

启动/关闭全部用户及组的quota服务:quotaon/quotaoff -avug

启动/关闭某一文件系统的用户quota服务:quotaon/quotaoff -uv 挂载点目录

 

3edquota命令:edit quota,编辑用户、组的限值与宽限时间

1>格式:edquota [选项] [用户|]

2>常用选项:

-u:后面跟用户,可以直接进入quota的编辑界面去设定该用户的限制值

-g:后面跟组,可以直接进入quota的编辑界面去设定该组的限制值

-t:可以修改宽限时间

-p:复制前一个设置的范本到下一个用户或组

 

4setquota命令:命令设定quota限额

1>格式:

setquota [-u|-g] [用户|] [block(soft)] [block(hard)] [inode(soft)] [inode(hard)] [文件系统]

 

5quoa命令:单一用户或组的quota报表

1>格式:quota [选项] [用户|]

2>常用选项:

-u:后面跟用户,显示出该用户的quota限制值,若不跟用户则显示执行者的 quota限制值

-g:后面跟组,显示该组的quota限制值

-v:显示每个用户在文件系统的quota

-s:人性化单位显示

6repquota命令:针对文件系统的的限制配额做报表

1>格式:repquota [选项] [参数]

2>常用选项:

-a:查找/etc/mtab中具有quota标志的文件系统,并报告quota的结果

-u:显示出用户的quota限值(默认显示此值)

-g:显示出某个群组的quota限制值

-v:显示文件系统的详细信息

-s:人性化单位显示

磁盘配额示例

实验描述:

新添加10G硬盘/dev/sdb,格式化为ext4格式的文件系统,将/home内容备份,挂载此硬盘到/home下,恢复原/home下的数据。新增5个用户(user1-5),属组均为gtest,要求对/home下的磁盘空间进行磁盘配额设置,要求如下:

5个用户(user1-5)每个用户磁盘用量不超过500M,当达到400M时进行提醒,若14天后还未处理磁盘空间将进行锁定。

gtest组磁盘用量不超过1500M,达到1200M时提醒。

 

1、备份/home/下的数据,格式化文件系统,挂载,增加quota服务,拷贝原数据。

[root@crushlinux ~]# mkdir /bakhome

[root@crushlinux ~]# cp -rp /home/* /bakhome/

[root@crushlinux ~]# ll /bakhome/

总用量 4

drwx------ 4 amber amber 4096 2月   4 15:56 amber

[root@crushlinux ~]# fdisk /dev/sdb

Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel

Building a new DOS disklabel with disk identifier 0xc1489f90.

Changes will remain in memory only, until you decide to write them.

After that, of course, the previous content won‘t be recoverable.

 

Warning: invalid flag 0x0000 of partition table 4 will be corrected by w(rite)

 

WARNING: DOS-compatible mode is deprecated. It‘s strongly recommended to

         switch off the mode (command ‘c‘) and change display units to

         sectors (command ‘u‘).

 

Command (m for help): n

Command action

   e   extended

   p   primary partition (1-4)

p

Partition number (1-4): 1

First cylinder (1-1305, default 1):

Using default value 1

Last cylinder, +cylinders or +size{K,M,G} (1-1305, default 1305):

Using default value 1305

 

Command (m for help): p

 

Disk /dev/sdb: 10.7 GB, 10737418240 bytes

255 heads, 63 sectors/track, 1305 cylinders

Units = cylinders of 16065 * 512 = 8225280 bytes

Sector size (logical/physical): 512 bytes / 512 bytes

I/O size (minimum/optimal): 512 bytes / 512 bytes

Disk identifier: 0xc1489f90

 

   Device Boot      Start         End      Blocks   Id  System

/dev/sdb1               1        1305    10482381   83  Linux

 

Command (m for help): wq  

The partition table has been altered!

 

Calling ioctl() to re-read partition table.

Syncing disks.

[root@crushlinux ~]# partx -a /dev/sdb

BLKPG: Device or resource busy

error adding partition 1

[root@crushlinux ~]# mkfs.ext4 /dev/sdb1

mke2fs 1.41.12 (17-May-2010)

文件系统标签=

操作系统:Linux

块大小=4096 (log=2)

分块大小=4096 (log=2)

Stride=0 blocks, Stripe width=0 blocks

655360 inodes, 2620595 blocks

131029 blocks (5.00%) reserved for the super user

第一个数据块=0

Maximum filesystem blocks=2684354560

80 block groups

32768 blocks per group, 32768 fragments per group

8192 inodes per group

Superblock backups stored on blocks:

32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632

 

正在写入inode: 完成                            

Creating journal (32768 blocks): 完成

Writing superblocks and filesystem accounting information: 完成

 

This filesystem will be automatically checked every 23 mounts or

180 days, whichever comes first.  Use tune2fs -c or -i to override.

[root@crushlinux ~]# mount /dev/sdb1 /home/

[root@crushlinux ~]# mount -o remount,usrquota,grpquota /home

[root@crushlinux ~]# mount |grep /home

/dev/sdb1 on /home type ext4 (rw,usrquota,grpquota)

[root@crushlinux ~]# grep /dev/sdb1 /etc/mtab

/dev/sdb1 /home ext4 rw,usrquota,grpquota 0 0

[root@crushlinux ~]# vim /etc/fstab

 /dev/sdb1               /home                   ext4    defaults,usrquota,grepquota 1 2

[root@crushlinux ~]# cp -rp /bakhome/* /home/

[root@crushlinux ~]# ll /home/

总用量 20

drwx------ 4 amber amber  4096 2月   4 15:56 amber

drwx------ 2 root  root  16384 2月   4 15:59 lost+found

 

2、新增5个用户(user1-5),属组为gtest

[root@crushlinux ~]# groupadd gtest

[root@crushlinux ~]# useradd -g gtest user1

[root@crushlinux ~]# useradd -g gtest user2

[root@crushlinux ~]# useradd -g gtest user3

[root@crushlinux ~]# useradd -g gtest user4

[root@crushlinux ~]# useradd -g gtest user5

[root@crushlinux ~]# echo "123" | passwd --stdin user1 &> /dev/null

[root@crushlinux ~]# echo "123" | passwd --stdin user2 &> /dev/null

[root@crushlinux ~]# echo "123" | passwd --stdin user3 &> /dev/null

[root@crushlinux ~]# echo "123" | passwd --stdin user4 &> /dev/null

[root@crushlinux ~]# echo "123" | passwd --stdin user5 &> /dev/null

 

3、扫描文件系统并建立Quota记录文件

[root@crushlinux ~]# quotacheck -avug

quotacheck: Your kernel probably supports journaled quota but you are not using it. Consider switching to journaled quota to avoid running quotacheck after an unclean shutdown.

quotacheck: Scanning /dev/sdb1 [/home] done

quotacheck: Cannot stat old user quota file /home/aquota.user: 没有那个文件或目录. Usage will not be substracted.

quotacheck: Cannot stat old group quota file /home/aquota.group: 没有那个文件或目录. Usage will not be substracted.

quotacheck: Cannot stat old user quota file /home/aquota.user: 没有那个文件或目录. Usage will not be substracted.

quotacheck: Cannot stat old group quota file /home/aquota.group: 没有那个文件或目录. Usage will not be substracted.

quotacheck: Checked 32 directories and 18 files

quotacheck: Old file not found.

quotacheck: Old file not found.

[root@crushlinux ~]# ll /home/a*

-rw------- 1 root  root  7168 2月   4 16:23 /home/aquota.group

-rw------- 1 root  root  7168 2月   4 16:23 /home/aquota.user

 

4、启动quota服务

[root@crushlinux ~]# quotaon -auvg

/dev/sdb1 [/home]: group quotas turned on

/dev/sdb1 [/home]: user quotas turned on

 

5、编辑用户、组的限制值与宽限时间

 

Disk quotas for user user1 (uid 520):
Filesystem blocks soft hard inodes soft hard
/dev/sdb1 32 409600 512000 8 0 0

[root@crushlinux ~]# edquota -p user1 -u user2

[root@crushlinux ~]# edquota -p user1 -u user3

[root@crushlinux ~]# edquota -p user1 -u user4

[root@crushlinux ~]# edquota -p user1 -u user5

 

[root@crushlinux ~]# edquota -g gtest

Disk quotas for group gtest (gid 523):
Filesystem blocks soft hard inodes soft hard
/dev/sdb1 160 1536000 1228800 40 0 0

注意:修改quota限值时的单位为Kb

 

 

[root@crushlinux ~]# 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/sdb1 14days 7days

6、查看quota报表

1)查看user1quota报表

 

[root@crushlinux ~]#
[root@crushlinux ~]# quota -uvs user1
Disk quotas for user user1 (uid 520):
Filesystem blocks quota limit grace files quota limit grace
/dev/sdb1 40 400M 500M 10 0 0
[root@crushlinux ~]#

发现此时增加grace,但没有数据,因为我们此时使用量未达到soft值(400M

 

2)查看gtest组的quota报表

 

Disk quotas for group gtest (gid 523):
Filesystem blocks quota limit grace files quota limit grace
/dev/sdb1 120 1500M 1200M 30 0 0
[root@crushlinux ~]#

 

3)查看文件系统的限额报表

 

 

[root@crushlinux ~]# repquota -auvs
*** Report for user quotas on device /dev/sdb1
Block grace time: 14days; Inode grace time: 7days
Block limits File limits
User used soft hard grace used soft hard grace
----------------------------------------------------------------------
root -- 20 0 0 2 0 0
segment -- 32 0 0 8 0 0
test1 -- 40 0 0 10 0 0
test2 -- 32 0 0 8 0 0
lidi -- 40 0 0 10 0 0
haha -- 40 0 0 10 0 0
user3 -- 40 400M 500M 10 0 0
wang -- 40 0 0 10 0 0
lisi -- 40 0 0 10 0 0
zhangsan -- 40 0 0 10 0 0
amber -- 40 0 0 10 0 0
u1 -- 40 0 0 10 0 0
user1 -- 40 400M 500M 10 0 0
usr -- 40 0 0 10 0 0
user2 -- 40 400M 500M 10 0 0
user5 -- 40 400M 500M 10 0 0
user4 -- 40 400M 500M 10 0 0

7、测试

1)测试user1磁盘使用量达到450M

[root@crushlinux ~]# su - user1

[user1@crushlinux ~]$ dd if=/dev/zero of=./bigfile bs=1M count=450

sdb1: warning, user block quota exceeded. 【警告:用户块配额快要超出了】

记录了450+0 的读入

记录了450+0 的写出

471859200字节(472 MB)已复制,1.62548 秒,290 MB/

[user1@crushlinux ~]$ du -sh

450M .

 

[root@crushlinux ~]# repquota -auvs
*** Report for user quotas on device /dev/sdb1
Block grace time: 14days; Inode grace time: 7days
Block limits File limits
User used soft hard grace used soft hard grace
----------------------------------------------------------------------
root -- 20 0 0 2 0 0
segment -- 32 0 0 8 0 0
test1 -- 40 0 0 10 0 0
test2 -- 32 0 0 8 0 0
lidi -- 40 0 0 10 0 0
haha -- 40 0 0 10 0 0
user3 -- 40 400M 500M 10 0 0
wang -- 40 0 0 10 0 0
lisi -- 40 0 0 10 0 0
zhangsan -- 40 0 0 10 0 0
amber -- 40 0 0 10 0 0
u1 -- 40 0 0 10 0 0
user1 +- 451M 400M 500M 13days 11 0 0
usr -- 40 0 0 10 0 0
user2 -- 40 400M 500M 10 0 0
user5 -- 40 400M 500M 10 0 0
user4 -- 40 400M 500M 10 0 0

Statistics:
Total blocks: 8
Data blocks: 1
Entries: 17
Used average: 17.000000

发现此时查看磁盘配额报表,user1后面出现了宽限时间倒数,还剩13天。

 

2)测试user2磁盘使用量达到500M,尝试写入501M内容

[root@crushlinux ~]# su - user2

[user2@crushlinux ~]$ dd if=/dev/zero of=./bigfile bs=1M count=501

sdb1: warning, user block quota exceeded.

sdb1: write failed, user block limit reached.

dd: 正在写入"./bigfile": 超出磁盘限额

记录了500+0 的读入

记录了499+0 的写出

524251136字节(524 MB)已复制,1.50541 秒,348 MB/

[user2@crushlinux ~]$ du -sh

500M .

 user2     +-    500M    400M    500M 13days      11     0     0     

此时,user113天之内还可以正常写入文件,user2则无法写入任何文件。

 

8、使用setquota命令修改user2的磁盘配额,block(soft)=550M block(hard)=650M

 

[root@crushlinux ~]#
[root@crushlinux ~]# quota -uvs user2
Disk quotas for user user2 (uid 523):
Filesystem blocks quota limit grace files quota limit grace
/dev/sdb1 500M* 400M 500M 13days 11 0 0
[root@crushlinux ~]# setquota -u user2 563200 665600 0 0 /home
[root@crushlinux ~]# quota -uvs user2
Disk quotas for user user2 (uid 523):
Filesystem blocks quota limit grace files quota limit grace
/dev/sdb1 500M 550M 650M 11 0 0

 

9、关闭quota服务

[root@crushlinux ~]# quotaoff -ug /home

[root@crushlinux ~]# quotaoff -a

Linux系统管理14——磁盘配额(Quota)