|
女主宣言: 前言inux Disk Quota是一种限制文件系统资源使用的技术,quota意思是份额、配额的意思,它用来限制用户使用磁盘的额度。可以实现针对用户、群组、目录多维度限制,保证磁盘空间不会因为单一用户或目录导致使用过度,造成磁盘不可用的情况。本文我们来探讨基于XFS文件系统Linux Disk Quota的应用方案。PS:丰富的一线技术、多元化的表现形式,尽在“360云计算”,点击关注哦!01TIPS: quota的一些使用条件:Linux内核必须支持quota功能,xfs文件系统本身内置quotaquota在usrquota/grpquota模式下只针对普通用户有效,root老仙法力无边,无法进行限制关闭SElinux(测试建议关闭)ext文件系统仅针对整个挂载点限制(即只能基于用户 或 群组进行容量限制,无法针对某一目录进行容量限制)如果限制目录,尽量不要针对根目录"/"quota针对整个filesystem进行限制 quota的使用模式:usrquota:针对用户的设定,仅对普通用户生效,对root无效grpquota:针对群组的设定prjquota:针对某个目录的设定,不可与grpquota同时使用(xfs_quota支持) quota的操作主要流程:关闭SELinux(测试建议关闭)编辑/etc/fstab,针对某个文件系统添加quota激活选项重新挂载指定挂载点验证quota功能是否生效使用quota相关命令针对某用户、用户组或某目录设置限制策略验证磁盘quota策略是否生效查看磁盘quota使用情况 xfs_quota命令概述:xfs_quota命令在下面用到很多,简单总结一下常用参数和作用,如下所示: 关于grace time:grace time的主要作用是当超过quota soft限制用量的情况下,给予一定的宽限时间,当超过grace time,则不可写入,如下图所示。下面案例中会具体用到。 准备:确定Selinux关闭# sestatus -vSELinux status: disabled# 如果是enable状态,临时关闭setenforce 0# 持久关闭vi /etc/selinux/configSELINUX=disabled注:如果线上需要开启,可详细查看selinux支持quota的相关参数。好了,说了那么多,下面开始实战吧~02:基于用户的配额限制 添加quota激活选项根据quota限制维度,添加参数usrquota(用户配额),grpquota(组配额)# vi /etc/fstab###此处忽略其它配置项,追加如下内容#####只针对user限制(如果同时需要用户和组限制,添加usrquota,grpquota)/dev/sdb1 /data xfs defaults,nodiratime,noatime,usrquota 1 2 remount 挂载点# umount /data# mount -a注:xfs文件系统无法通过mount -o remount方式来启动quota功能,必须使用上述方式;下面检查是否生效:# mount |grep data/dev/sdb1 on /data type xfs (rw,noatime,nodiratime,attr2,inode64,logbufs=8,logbsize=32k,usrquota)注:如果umount时报错:umount: /data: target is busy,就用lsof /data 查看是否有进程在使用,kill掉进程重试。 查看配额是开启# xfs_quota -x -c "state"User quota state on /data (/dev/sdb1) #可以看到只有user quota是开启的 Accounting: ON Enforcement: ON Inode: #71 (2 blocks, 2 extents)Group quota state on /data (/dev/sdb1) Accounting: OFF Enforcement: OFF Inode: #67 (1 blocks, 1 extents)Project quota state on /data (/dev/sdb1) Accounting: OFF Enforcement: OFF Inode: #67 (1 blocks, 1 extents)Blocks grace time: [7 days]Inodes grace time: [7 days]Realtime Blocks grace time: [7 days]注:如果提示没有xfs_quota命令,则需要 yum -y install xfsprogs安装 对mysql用户进行quota限制soft配额10M,hard配额20M,grace time 1分钟##mysql是用户名,配额 soft 10M,hard 20M# xfs_quota -x -c "limit -u bsoft=10M bhard=20M mysql" /data##超过Soft配额1分钟后,被限制# xfs_quota -x -c 'timer -u -b 1minutes' /data##当超过soft阈值后,Warn/Grace会开始1分钟倒计时# xfs_quota -x -c "report -ubih" /dataUser quota on /data (/dev/sdb1) Blocks InodesUser ID Used Soft Hard Warn/Grace Used Soft Hard Warn/Grace---------- --------------------------------- ---------------------------------root 0 0 0 00 [0 days] 2 0 0 00 [0 days]mysql 0 10M 20M 00 [------] 0 0 0 00 [------] 测试场景一:超过hard配额,被限制。# su - mysql$ pwd/data$ dd if=/dev/zero of=test.dat bs=1M count=30dd: error writing ‘test.dat’: Disk quota exceeded21+0 records in20+0 records out20971520 bytes (21 MB) copied, 0.0284925 s, 736 MB/s##Blocks(Used)表示写入了20M数据,超过Blocks(Hard)配额后,直接被限制写入$ xfs_quota -x -c "report -ubih" /dataUser quota on /data (/dev/sdb1) Blocks InodesUser ID Used Soft Hard Warn/Grace Used Soft Hard Warn/Grace---------- --------------------------------- ---------------------------------mysql 20M 10M 20M 00 00:00:41 3 0 0 00 [------]场景二:超过soft配额,并且超过设置的1分钟grace time,被限制。# su - mysql$ pwd/data$ dd if=/dev/zero of=test.dat bs=1M count=1515+0 records in15+0 records out15728640 bytes (16 MB) copied, 0.0206793 s, 761 MB/s##Blocks(Used)表示只写入了15M数据,bsoft> /etc/projects##创建项目id与项目名称的对应关系,即给项目id起个别名# echo "mysqldata:1" >> /etc/projid初始化项目语句如下:# xfs_quota -x -c "project -s mysqldata"Setting up project mysqldata (path /data/mysqldata)...Processed 1 (/etc/projects and cmdline) paths for project mysqldata with recursion depth infinite (-1).Setting up project mysqldata (path /data/mysqldata)...Processed 1 (/etc/projects and cmdline) paths for project mysqldata with recursion depth infinite (-1).Setting up project mysqldata (path /data/mysqldata)...Processed 1 (/etc/projects and cmdline) paths for project mysqldata with recursion depth infinite (-1).注:会显示上述一堆这样的信息,不要害怕,是OK的,一切尽在掌握之中此时可以查看到目录是否存在对应项目:# xfs_quota -x -c "print" /dataFilesystem Pathname/data /dev/sdb1 (pquota)/data/mysqldata /dev/sdb1 (project 1, mysqldata) 设置目录quota大小##针对项目mysqldata设置10M容量硬限制# xfs_quota -x -c "limit -p bsoft=6M bhard=10M mysqldata" /data##查看是否生效,以及使用情况# xfs_quota -x -c "report -bih" /dataProject quota on /data (/dev/sdb1) Blocks InodesProject ID Used Soft Hard Warn/Grace Used Soft Hard Warn/Grace---------- --------------------------------- ---------------------------------#0 20M 0 0 00 [------] 4 0 0 00 [------]mysqldata 0 6M 10M 00 [------] 1 0 0 00 [------]说明:bsoft是软限制,磁盘空间超过bsoft,但小于bhard,此时将进入“宽限期”(grace time)倒计时,如果在宽限期间内将容量降低到bsoft以下,则grace time消失,否则拒绝继续写入;bhard是硬限制,超过此限制值,将无法再继续写入; 测试此时在目录/data/mysqldata/下写入15M文件,则报错,并且只写入了10M内容# dd if=/dev/zero of=/data/mysqldata/test.dat bs=1M count=15dd: error writing ‘/data/mysqldata/test.dat’: No space left on device11+0 records in10+0 records out10485760 bytes (10 MB) copied, 0.296038 s, 35.4 MB/s# du -sh /data/mysqldata/*10M /data/mysqldata/test.dat此时可以通过如下命令查看使用情况:# xfs_quota -x -c "df -h" /data/Filesystem Size Used Avail Use% Pathname/dev/sdb1 6.0G 62.2M 5.9G 1% /data/dev/sdb1 6M 10M 8192.0E 167% /data/mysqldata如果想要另外添加新的限制目录,就根据上面步骤进行即可;至此,基于单一目录的quota方案,部署就完成了。04常用运维命令: 暂时关闭quota限制功能# xfs_quota -x -c "disable -up" /data# xfs_quota -x -c "state" /dataUser quota state on /data (/dev/sdb1) Accounting: OFF Enforcement: OFF Inode: #71 (2 blocks, 2 extents)Group quota state on /data (/dev/sdb1) Accounting: OFF Enforcement: OFF Inode: #67 (1 blocks, 1 extents)Project quota state on /data (/dev/sdb1) Accounting: ON Enforcement: OFF ##可以看到OFF状态了 Inode: #67 (1 blocks, 1 extents)Blocks grace time: [7 days]Inodes grace time: [7 days]Realtime Blocks grace time: [7 days重新开启quota功能xfs_quota -x -c "enable -p" /data彻底关闭quota功能xfs_quota -x -c "off -up" /data注:之后就不能再通过enable方式启动了,必须执行:umount /data;mount -a 重新激活quota功能 调大容量限制直接重新执行一遍设置就好:##针对用户xfs_quota -x -c "limit -u bsoft=100M bhard=200M mysql" /data##针对目录xfs_quota -x -c "limit -p bsoft=60M bhard=100M mysqldata" /data 重建目录会影响quota限制吗?重建目录会影响quota限制,无论是如下哪种方式新建的相同名字目录都会失去quota的限制:mv /data/mysqldata /data/mysqldata_bakmkdir /data/mysqldata或者:rm -rm /data/mysqldatamkdir /data/mysqldata解决方法:使用如下方式重新初始化这个项目:xfs_quota -x -c "project -s mysqldata"注:仅仅这样初始化一下就好,无需再去重新设定限制 如何调整“宽限期”(grace time)宽限期,分为user、group、project维度,通过timer -u -g -p修改##针对user,用户的grace time时间xfs_quota -x -c "timer -u -b 14days" /data##针对group,用户组的grace time时间xfs_quota -x -c "timer -g -b 14days" /data##针对project,单一目录的grace time时间xfs_quota -x -c "timer -p -b 14days" /data05总结:本文写作本着实用至上的原则,让读者可以快速部署磁盘配额。主要介绍针对XFS文件系统的Quota方案,并且只是基于blocks的容量限制,不涉及其它文件系统,以及文件数量配额限制。参考:RedHat :https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/6/html/storage_administration_guide/ch-disk-quotashttps://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/7/html/storage_administration_guide/xfsquotaLinux manual page:https://man7.org/linux/man-pages/man8/xfs_quota.8.html《鸟哥的Linux私房菜》:http://linux.vbird.org/linux_basic/0420quota.php#quota_flow
|
|