目录
用法[root@localhost ~]# xfs_quota-x -c"report -ubih"/mnt/
一、centos7和6的区别
1.Ctos6(ext文件系统)仅能针对分区做磁盘配额限制。
Ctos(xfs文件系统)可对目录和用户或者组和用户设置磁盘配额
2.对目录设置配额,对所有用户生效包括root
3.CtOS 7 超过软限制不警告
4.不用开启quota挂载成功自动开启
5.C7需要使用xfs_quota -x -c 进行非交互式设置。
6.在挂载之后如果没有指定quota选项remount不生效,需要卸载后重新挂载。
7.不需要关闭SELinux
xfs_quota -x -c "report -ugrbi" /test1 #查看挂载点磁盘配额使用情况。用户、组、实时运行区、block、inode
xfs_quota -x -c "state" #查看是否开启了usrquota、grpquota、prjquota、宽限天数。
二、Quota磁盘配额
1、为什么要有磁盘配额
由于Linux是多任务多用户的操作系统,所以多个用户使用同一块硬盘的情况时有发生。而Linux默认又不限制每个用户使用磁盘空间的大小。假如某个用户因为疏忽或恶意沾满磁盘空间,那么会导致磁盘无法写入甚至崩溃。为了保证系统磁盘得到足够的保护,我们需要对用户和组进行磁盘空间使用限制
2、quota能做什么
限制用户和组的容量限制和文件数量限制(block和inode)
限制block就限制了用户可以使用的磁盘容量,限制inode就可以限制用新建的文件数量。
限制某一目录的最大磁盘配额(directory project):
在之前的版本的centos当中,使用的是ext系列文件系统。ext系列文件系统在做磁盘配额的时候主要是针对整个文件系统来进行磁盘配额的限制。而不能直接做到只针对某个目录进行磁盘配额的限制。在使用xfs文件系统的情况下,就可以使用project模式了。
内核必须支持quota:在cent7.x以后都已经默认支持quota功能:
【】# grep CONFIG_QUOTA /boot/config-3.10.0-123.el7.x86_64
CONFIG_QUOTA=y
CONFIG_QUOTA_NETLINK_INTERFACE=y
# CONFIG_QUOTA_DEBUG is not set
CONFIG_QUOTA_TREE=y
CONFIG_QUOTACTL=y
CONFIG_QUOTACTL_COMPAT=y
查看quota命令是否安装:
【】# rpm -qa | grep "quota"
quota-4.01-11.el7.x86_64
quota-nls-4.01-11.el7.noarch
quota只对一般身份用户有效(例如root就不能设置quota)
三、磁盘配额的基本概念
软限制(soft):
用户在低于软限制的时候可以正常使用磁盘,但如果超过软限制之后且低于硬限制的时候,每次用户登录系统时系统会发出警告信息,并且超出部分会有宽限天数,宽限天数到期后超出的部分会被清空。但是,如果在宽限天数到期前将容量降低到软限制范围内,宽限天数会停止。
硬限制(hard):
表示用户的用量绝对不会超过这个限制值,如果超过硬限制则会锁住该用户对磁盘的使用权。
宽限天数:
宽限时间只有在用户的磁盘用量介于软限制和硬限制之间时会出现。由于达到硬限制的时候用户的磁盘使用权会被锁住。为了避免用户使用量直接到达硬限制磁盘使用权限被锁住,所以设置了软限制。当磁盘使用量超过软限制即将到达硬限制时,系统会进行警告,但也会给时间让用户自行管理磁盘。宽限天数默认为7天,如果宽限天数内不进行任何删除文件等操作,到达期限后超出部分会被清空。
四、流程步骤及演示
1.总体流程:
C7磁盘配额:
1.通过挂载开启磁盘配额
1)临时
2)永久
注意:若已经挂载想修改需要卸载再挂载 remount无效
2.xfs_quota -x -c "limit -u bsoft=10M bhard=15M user1" /test1/
#限制用户user1使用block软限制为10MB硬限制为15MB,在/test1生效。
[root@localhost ~]# xfs_quota-x -c"report -ubih"/test1/
#查看是否生效
3开启目录配额限制:
1)目录不能和组同时开启:目录prjquota生成配置文件
[root@localhost ~]# echo "15:/mnt/u1dir">> /etc/projects
#15代表标识符可自定义,冒号后边是要限制的路径。
[root@localhost ~]# echo "myprjquota:15">> /etc/projid
#冒号前边是此次目录配额限制的名称,可自定义。后边是前边定义过的标识符。
[root@localhost ~]# xfs_quota-x -c"project -s myprjquota"
2)使用mount和xfs_quota -x -c "state"进行查看。
3)xfs_quota -x -c "limit -p isoft=7 ihard=9 myprj" /test1/
#设置myprj能够创建的文件数量软限制为7,硬限制为9。指定路径时不能指定子目录,需要指定上级目录。
4)xfs_quota -x -c "limit -p bsoft=70M bhard=90M myprj" /test1/
#设置myprj能够写入block的限制。
5)在设置生效后任何用户都会受到限制(包括root)。
3.stat
访问:cat
更改:vim
改动:chown更改属性
2.磁盘配额实验演示:
添加新的硬盘或分区,进行格式化挂载:
创建被限制的用户和组,分别是zhangsan,lisi,wangwu。用户组:user1,将三个用户添加到user1组内。
user1组的磁盘配额:
硬限制为500MB,软限制为450MB,文件个数不做限制。zhangsan用户硬限制为50MB,软限制为40MB文件个数硬限制为10个。软限制为8个。用户lisi,wangwu硬限制为250MB,软限制为200MB,文件个数不做限制。
三个用户相加的总限制为550MB超过了user1组的限制,这样的话肯定有一个用户达不到自己最大的硬限制就会无法写入了。因为,用户限制和组限制同时存在时,越小的越先生效。 修改系统宽限天数为9天。
步骤:
创建的分区大于550MB,不然会影响实验效果:
【】# df -hT /dev/sdb1
文件系统 类型 容量 已用 可用 已用% 挂载点
/dev/sdb1 xfs 3.0G 33M 3.0G 2% /quota.test
#首先查看文件系统是否为XFS,这决定了是否可以实现单独限制目录的功能。
创建用户和组
1)临时开启磁盘配额:
#查看挂载信息,发现成功开启了quota磁盘配额。
【】# df -h
/dev/sdb1 5.0G 33M 5.0G 1% /mnt
#在centos7.0当前版本中,使用mount -o remount,usrquota....虽然可以成功执行命令。但是执行命令之后,使用mount命令查看挂载分区状态时会发现quota并未生效。
2)永久开启磁盘配额:
【】# blkid | grep "sdb1"
/dev/sdb1: UUID="52583761-4a66-4bf2-a458-d1bbfc2b00ed" TYPE="xfs" PARTLABEL="Linux filesystem" PARTUUID="52aa5c18-3810-
4ccf-922c-c3b701d6a9ea"
【】# vim /etc/fstab
UUID=52583761-4a66-4bf2-a458-d1bbfc2b00ed /mnt xfs defaults,usrquota,grpquota 0 0
#直接修改/etc/fstab文件,之后再执行mount -a命令,可以达到临时且永久同时生效。
【】# mount -a
(修改配置文件之后进行重新挂载)
【】# mount | grep "mnt"
/dev/sdb1 on /mnt type xfs (rw,relatime,seclabel,attr2,inode64,usrquota,grpquota)
(usrquota,grpquota配置生效)
xfs_quota -x -c "命令"
-x:启用“专家模式”允许对磁盘配额进行编辑。
-c:quota可以在交互模式和命令模式两种方式下执行,添加-c命令可以让quota顺序执行-c选项后的命令。
命令:
print:列出所具XFS有设备标识的路径。
df:与df命令相同,可以添加-b(block)、-i(inode)等。
report:列出目前的磁盘配额详细信息,需要结合ugrbi等选项。
state:目前支持磁盘配额的文件系统信息。
例:
【】# xfs_quota -x -c "print"
Filesystem Pathname
/ /dev/mapper/centos-root
/boot /dev/sda1
/mnt /dev/sdb1 (uquota, gquota)
#列出所有设备及其路径。
【】# xfs_quota -c "df -h"
Filesystem Size Used Avail Use% Pathname
/dev/mapper/centos-root
17.5G 4.5G 13.0G 26% /
/dev/sda1 496.7M 118.4M 378.3M 24% /boot
/dev/sdb1 5.0G 32.2M 5.0G 1% /mnt
Filesystem Size Used Avail Use% Pathname
/dev/mapper/centos-root17.5G 4.5G 13.0G 26% /
/dev/sda1 496.7M 118.4M 378.3M 24% /boot
/dev/sdb1 5.0G 32.2M 5.0G 1% /mnt
Filesystem Size Used Avail Use% Pathname
/dev/mapper/centos-root
17.5G 4.5G 13.0G 26%/
/dev/sda1 496.7M118.4M378.3M 24%/boot
/dev/sdb1 5.0G 32.2M 5.0G 1%/mnt
#和原本的df-h命令类似。
【】# xfs_quota-x -c"report -ugbih"/mnt/
#在report选项中,如果不加-x选项则不能够成功执行命令。report后的选项分别是u:用户。g:组。b:block块。i:inode号。h:以常见单位大小显示。
User quota on /mnt (/dev/sdb1) #显示了在/mnt下对于用户的配额限制。
Blocks Inodes
User ID Used Soft Hard Warn/Grace Used Soft Hard Warn/Grace
---------- --------------------------------- ---------------------------------
root 0 0 0 00 [------] 3 0 0 00 [------]
user1 0 0 0 00 [------] 1 0 0 00 [------]
Group quota on /mnt (/dev/sdb1) #显示了在/mnt下对于组的配额限制。
Blocks Inodes
Group ID Used Soft Hard Warn/Grace Used Soft Hard Warn/Grace
---------- --------------------------------- ---------------------------------
root 0 0 0 00 [------] 3 0 0 00 [------]
user1 0 0 0 00 [------] 1 0 0 00 [------]
#soft/hard为0表示没有配额限制。
【】# xfs_quota-x -c"state"
User quotastate on /mnt (/dev/sdb1)
Accounting:ON #是否记录。
Enforcement:ON #是否执行(quota)。
Inode: #131 (2 blocks, 2 extents)
Group quotastate on /mnt (/dev/sdb1)
Accounting:ON
Enforcement:ON
Inode: #132 (2 blocks, 2 extents)
Project quotastate on /mnt (/dev/sdb1)
Accounting:OFF
Enforcement:OFF #project关闭状态。
Inode: #132 (2 blocks, 2 extents)
Blocks gracetime:[7 days 00:00:30]
Inodes gracetime:[7 days 00:00:30]
Realtime Blocks gracetime:[7 days 00:00:30] #gracetime 宽限天数。
#返回结果由上至下分别说明了:所有者、所属组、目录的相关信息。
3)设置磁盘配额:
xfs_quota-x -c"limit -u/g bsoft=N bhard=N usrname/grpname"quota path
【】# xfs_quota-x -c"limit -u bsoft=50Mbhard=70Muser1"/mnt/
【】# xfs_quota-x -c"report -ubih"/mnt/
User quota on /mnt (/dev/sdb1)
Blocks Inodes
User ID Used Soft Hard Warn/Grace Used Soft Hard Warn/Grace
---------- --------------------------------- ---------------------------------
root 0 0 0 00 [------] 3 0 0 00 [------]
user1 0 50M 70M 00 [------] 0 0 0 00 [------]
#查看到结果,/mnt/用户磁盘配额设置成功。
【】# xfs_quota-x -c"report -gbih"/mnt/
Group quota on /mnt (/dev/sdb1)Blocks Inodes
Group ID Used Soft Hard Warn/Grace Used Soft Hard Warn/Grace
---------- --------------------------------- ---------------------------------
root 0 0 0 00 [------] 3 0 0 00 [------]
user1 0 0 0 00 [------] 0 10 15 00 [------]
#对user1组使用的inode号进行限制(block上面已经演示,不再重复)。
【】# xfs_quota-x -c"timer -u -bir 15days"/mnt/
【】# xfs_quota-x -c"state"/mnt/
User quotastate on /mnt (/dev/sdb1)
Accounting:ON
Enforcement:ON
Inode: #131 (2 blocks, 2 extents)
Group quotastate on /mnt (/dev/sdb1)
Accounting:ON
Enforcement:ON
Inode: #132 (2 blocks, 2 extents)
Project quotastate on /mnt (/dev/sdb1)
Accounting:OFF
Enforcement:OFF
Inode: #132 (2 blocks, 2 extents)
Blocks gracetime:[15 days 00:00:30]
Inodes gracetime:[15 days 00:00:30]
Realtime Blocks gracetime:[15 days 00:00:30]
#对宽限时间进行修改,修改为15天。
【】$ touch a{1..10}.txt
[user1@localhostmnt]$ ls
a10.txt a1.txt a2.txt a3.txt a4.txt a5.txt a6.txt a7.txt a8.txt a9.txt
【】$ touch a11.txt
【】$ touch a12.txt
【】$ touch a13.txt
【】$ touch a14.txt
【】$ touch a15.txt
【】$ touch a16.txt
touch:无法创建"a16.txt":超出磁盘限额
#受到磁盘配额的限制,创建文件a16.txt失败。
【】# xfs_quota-x -c"report -gbih"/mnt/
Group quota on /mnt (/dev/sdb1)
Blocks Inodes
Group ID Used Soft Hard Warn/Grace Used Soft Hard Warn/Grace
---------- --------------------------------- ---------------------------------
root 4K 0 0 00 [------] 3 0 0 00 [------]
user1 0 0 0 00 [------] 15 10 15 00 [15 days]
#查看当前磁盘配额状态。限制成功,删除创建测试文件,测试block限制效果。达到配额硬限制之后会显示宽限时间。
3.project限制目录:
我们知道一个分区是被挂载到一个目录下进行使用的。但是在挂载目录下就不会产生其他的子目录了吗?这一定是不现实的。所以说,如果我们能够只限制一个分区下的子目录的话那么磁盘配额就会变得灵活许多。这就要说到project了:project可以实现对目录进行磁盘配额的限制,但是在进行限制的时候一定要注意。目录的磁盘配额和组的磁盘配额不能够同时开启。比如说(按照之前的实验效果),在组中限制了user1组可使用空间为70M,而user1用户组也的确使用了这些空间。那么如果限制一个目录/mnt/test1/的话。如果对于user1这个用户进行使用空间的限制,那么将没有任何意义。所以在挂载的时候,如果同时指定grpquota和prjquota的话就会有报错信息。避免的两种限制同时存在的情况。
【】# vim/etc/fstab
UUID=52583761-4a66-4bf2-a458-d1bbfc2b00ed /mnt xfs defaults,usrquota,prjquota 0 0
【】# umount /mnt/
【】# mount -a
【】# xfs_quota-x -c"state"
User quotastate on /mnt (/dev/sdb1)
Accounting:ON
Enforcement:ONInode: #131 (2 blocks, 2 extents)
Group quotastate on /mnt (/dev/sdb1)
Accounting:OFF
Enforcement:OFF
Inode:N/A
Project quotastate on /mnt (/dev/sdb1)
Accounting:ON
Enforcement:ON #开启prjquota。
Inode:N/A
Blocks gracetime:[15 days 00:00:30]
Inodes gracetime:[15 days 00:00:30]
Realtime Blocks gracetime:[15 days 00:00:30]
接下来想要开始
使用project还需要生成两个配置文件:
1)生成配置文件:
【】# echo "15:/mnt/u1dir">> /etc/projects
#15代表标识符可自定义,冒号后边是要限制的路径。
【】# echo "myprjquota:15">> /etc/projid
#冒号前边是此次目录配额限制的名称,可自定义。后边是前边定义过的标识符。
【】# xfs_quota-x -c"project -s myprjquota"
Processed 1 (/etc/projectsand cmdline) paths for projectmyprjquota with recursion depth infinite(-1).
【】# echo $?
0 #可以检查一下命令是否执行成功。
【】# xfs_quota-x -c"print"/mnt/
Filesystem Pathname
/mnt /dev/sdb1 (uquota, pquota)
/mnt/u1dir /dev/sdb1 (project 15, myprjquota) #设置生效。
【】# xfs_quota-x -c"report -pbih"/mnt/
#命令中选项p:project的意思。b:block块。i:inode号。h:常见单位大小。
Project quota on /mnt (/dev/sdb1)
Blocks Inodes
Project ID Used Soft Hard Warn/Grace Used Soft Hard Warn/Grace
---------- --------------------------------- ---------------------------------
myprjquota 0 0 0 00 [------] 1 0 0 00 [------]
2)设置目录配额
【】# xfs_quota-x -c"limit -p bsoft=40Mbhard=50Mmyprjquota"/mnt/
#设置配额限制大小为:软限制40M,硬限制50M。
【】$ dd if=/dev/zero of=/mnt/u1dir/test1 bs=1M count=40
记录了40+0 的读入
记录了40+0 的写出
41943040字节(42 MB)已复制,0.0419267 秒,1.0 GB/秒
【】$ dd if=/dev/zero of=/mnt/u1dir/test2 bs=1M count=40
dd: 写入"/mnt/u1dir/test2" 出错: 设备上没有空间
记录了10+0 的读入
记录了10+0 的写出
41943040字节(42 MB)已复制,0.0419267 秒,1.0 GB/秒
【】$ ll -h
总用量 50M
-rw-rw-r--. 1 user1 user1 40M 12月 19 22:28 test1
-rw-rw-r--. 1 user1 user1 10M 12月 19 22:28 test2
#成功进行了block空间的限制。
【】# touch /mnt/u1dir/rtest
touch: 无法创建"/mnt/u1dir/rtest": 超出磁盘限额
#不光对普通用户进行了限制,而且对超级用户也进行了限制。因为达到了目录的block硬限制。
4、关闭磁盘配额:
disable:临时关闭磁盘配额限制,但系统仍然做配额记录。可选项-u:用户。-g:组。-p:目录。
【】# xfs_quota -x -c "disable -up" /mnt/
#取消了/mnt的用户和目录的限制。
【】# xfs_quota -x -c "state" /mnt/
User quota state on /mnt (/dev/sdb1)
Accounting: ONEnforcement: OFF
Inode: #131 (2 blocks, 2 extents)
Group quota state on /mnt (/dev/sdb1)
Accounting: OFF
Enforcement: OFF
Inode: N/A
Project quota state on /mnt (/dev/sdb1)
Accounting: ON
Enforcement: OFF
Inode: N/A
Blocks grace time: [15 days 00:00:30]
Inodes grace time: [15 days 00:00:30]
Realtime Blocks grace time: [15 days 00:00:30]
#可以发现,仍然记录,但并不执行quota的限制了,所以enable也叫做临时关闭quota限制。
【】# xfs_quota-x -c"enable-up"/mnt/
【】# xfs_quota-x -c"state"/mnt/
#会发现原本的 Accounting:ON变成了 Accounting:OFF。
【】# xfs_quota-x -c"off-up"/mnt/
#关闭磁盘配额off命令。
【】# xfs_quota-x -c"state"/mnt/ #关闭之后查不到任何信息。
【】# xfs_quota-x -c"enable-up"/mnt/
XFS_QUOTAON:函数未实现
#关闭之后无法用enable开启。off:永久关闭当前指定路径的文件系统的配额。再次打开需要重新挂载才可以。
【】# xfs_quota-x -c"remove-up"/mnt/
#remove:清空所有指定路径中磁盘配额限制。此操作必须在磁盘配额未启用时使用,在磁盘配额启用过程中使用则报错。
#在当前XFS文件系统下的磁盘配额,软限制并不会进行提示。而是直到硬限制时直接锁住硬盘空间。
五、相关命令:
xfs_quota -x -c "命令"
-x:启用“专家模式”允许对磁盘配额进行编辑。
-c:quota可以在交互模式和命令模式两种方式下执行,添加-c命令可以让quota顺序执行-c选项后的命令。
命令:
1.print:
列出所具XFS有设备标识的路径。
用法:[root@localhost ~]# xfs_quota -x -c "print"
2.df:
与df命令相同,可以添加-b(block)、-i(inode)等。
用法:[root@localhost ~]# xfs_quota -c "df -h"
3.report:
列出目前的磁盘配额详细信息,需要结合ugrbi等选项。
用法[root@localhost ~]# xfs_quota-x -c"report -ubih"/mnt/
4.state:
目前支持磁盘配额的文件系统信息。
用法:【】# xfs_quota-x -c"state"
5.disable:
临时关闭磁盘配额限制,但系统仍然做配额记录。
可选项 -u:用户。-g:组。-p:目录。
用法:[root@localhost u1dir]# xfs_quota -x -c "disable -up" /mnt/
#取消了/mnt的用户和目录的限制。
设置磁盘配额:
xfs_quota-x -c"limit -u/g bsoft=N bhard=N usrname/grpname"quota path
【】# xfs_quota-x -c"report -gbih"/mnt/
【】# xfs_quota-x -c"timer -u -bir 15days"/mnt/
补充命令: stat
stat:文件命、文件大小、占用block数量、单个block大小、所在设备编号、inode号、硬链接数、权限、属主、属组、访问时间、数据修改时间、状态修改时间。
其中inode的内容:
文件的字节数
文件所有者UID
文件GID
文件的读、写、执行权限
链接数量
文件block块的位置
文件的时间戳:时间戳分三部分分别是ctime、mtime和atime。
mtime:modify time 修改文件内容时间。(echo、vim)
atime:access time 访问文件内容时间。(cat)
ctime:changetime 指inode上一次文件属性变动的时间。(chmod)