よくわからないエンジニア

よく分からないエンジニアの日々の記録

よくわからないエンジニア

CentOS7 XFSのクォータ設定

年間の6分の1が終了しました。この時期になると花粉症の影響が出始めるのか、慢性的な眠さや倦怠感に苛まれ、仕事の能率が極端に下がります。

それはさておき、今回はクォータ設定の手順をまとめました。

目次

ディスククォータについて

クォータの設定について凄い簡単に説明すると、指定した単位によって、使用可能なディスク容量に制限をかける機能です。例えば、、共用サーバで各ユーザーが自分のディレクトリに糞でかいファイルとかを置いていると、ファイルの容量を圧迫し、他のユーザーに迷惑をかけます。そのような自体をさける為、各ユーザー、グループ等で使用できる上限を設定したい。そんな時にディスククォータ機能を使用します。

※他にも使い所はたくさんあると思いますが、貧困な発想の為思いつきませんでした。

制限をかける単位

今回紹介するXFSでのクォータ設定では以下三種類の制限をかけられます。

  1. ユーザー単位
  2. 所属グループ単位
  3. プロジェクト単位

1,2についてはほとんど説明不要かと思います。ユーザーAの上限は100M,ユーザーBは50M..みたいな制限がユーザー単位です。グループ単位は、ユーザーABCが所属するGroup1の上限は200M..みたいな感じです。
そして聞きなれない制限単位であるプロジェクトですが、こちらは実際に設定しながら説明します。

それでは実際に設定してみましょう。

クォータの有効化

まずクォータを設定したいパーティションに対して、設定を有効化する必要があります。mount時にオプション指定で有効化する方法がありますが、今回は/etc/fstabにmountオプションを指定して実行します。

尚、ディスククォータはパーティション毎の設定になるので、今回のように/homeに設定したい場合はパーティションを分ける必要があります。

# vi /etc/fstab 
#/dev/mapper/centos-home /home                       xfs     defaults,noatime,uquota,gquota,pquota      0 0

uquota=userquota , gquota = groupquota , pquota = project quota といった感じで、有効化したいクォータを記述します。ググると再マウントすると有効化されるらしいです。

#mount -o remount /home
#/dev/mapper/centos-home /home xfs rw,noatime,attr2,inode64 0 0

…しかし何度やっても有効化されませんでした。やむなく再起度します。

#reboot 

(再起動後)再度mountオプションを確認します。

#cat /etc/mtab |grep home
/dev/mapper/centos-home /home xfs rw,noatime,attr2,inode64,usrquota,prjquota,grpquota 0 0

マウントされている状態の限りでは有効になっているっぽい。念の為、コマンドで確認します。

# xfs_quota -x -c state /home
User quota state on /home (/dev/mapper/centos-home)
  Accounting: ON
  Enforcement: ON
  Inode: #67 (6 blocks, 6 extents)
Group quota state on /home (/dev/mapper/centos-home)
  Accounting: ON
  Enforcement: ON
  Inode: #68 (3 blocks, 3 extents)
Project quota state on /home (/dev/mapper/centos-home)
  Accounting: ON
  Enforcement: ON
  Inode: #68 (3 blocks, 3 extents)
Blocks grace time: [7 days]
Inodes grace time: [7 days]
Realtime Blocks grace time: [7 days]

なんか有効になっているっぽいですね。では引き続き設定していきます。

クォータ設定の確認

設定や内容確認はxfs_quota を使用。 /homeのquota設定状況を確認する。-xを指定するとモードが切り替わりますが、今回は-cをプラスして、コマンドをぶん投げる形で設定します。まずは対象パーティションの設定を確認します。

# xfs_quota -x -c 'report -h' /home
User quota on /home (/dev/mapper/centos-home)
                        Blocks
User ID      Used   Soft   Hard Warn/Grace
---------- ---------------------------------
root            0      0      0  00 [------]
userA         12K      0      0  00 [------]
userB         12K      0      0  00 [------]
userC         20K      0      0  00 [------]

Group quota on /home (/dev/mapper/centos-home)
                        Blocks
Group ID     Used   Soft   Hard Warn/Grace
---------- ---------------------------------
root            0      0      0  00 [------]
groupA        56K      0      0  00 [------]
groupB        12K      0      0  00 [------]
groupC        12K      0      0  00 [------]

Project quota on /home (/dev/mapper/centos-home)
                        Blocks
Project ID   Used   Soft   Hard Warn/Grace
---------- ---------------------------------
#0            80K      0      0  00 [------]

ユーザーやグループの設定状況を確認出来ます。下はreportのオプションです。
※reportのオプション → report [-bir] [-gpu] [-ahnt] [-f file] – report filesystem quota information

ユーザークォータの設定

それでは早速、ユーザークォータの設定をします。今回はuserCのソフトリミットを1M、ハードリミットを2Mに設定します。

# xfs_quota -x -c 'limit bsoft=1m bhard=2m userC' /home
# xfs_quota -x -c "report -h -u" /home
User quota on /home (/dev/mapper/centos-home)
                        Blocks
User ID      Used   Soft   Hard Warn/Grace
---------- ---------------------------------
root            0      0      0  00 [------]
userA         12K      0      0  00 [------]
userB         12K      0      0  00 [------]
userC         20K     1M     2M  00 [------]

userCのSoft,Hard行に1M,2Mが追加されました。これでuserCにクォータが設定されました。この状態の場合、「/home以下でuserCが所有者になっているファイルの容量が1Mを超えた状態が続いた場合、又は2Mを超えた場合」対象パーティションでは所有しているファイルのサイズを増やせなくなります。当然新規ファイルの作成も不可です。
ソフトリミットはデフォルトでは無制限に設定されていますが、もちろん変更可能です(後述)。なおブロックサイズだけでなく、inodeの数でも制限をかける事が出来ます。

グループクォータの設定

今度はグループ単位でクォータを設定します。groupAに制限をかけます。

# xfs_quota -x -c 'limit -g bsoft=1m bhard=2m groupA' /home
# xfs_quota -x -c 'report -h -g' /home
Group quota on /home (/dev/mapper/centos-home)
                        Blocks
Group ID     Used   Soft   Hard Warn/Grace
---------- ---------------------------------
root         9.0M      0      0  00 [------]
iphtech       68K     1M     2M  00 [------]
munin         12K      0      0  00 [------]
fabric        12K      0      0  00 [------]

ユーザークォータ同様に設定が出来ました。尚、グループとユーザーどちらにも設定している場合はグループが優先される為、同時に設定する場合は、ユーザークォータの値を少なく設定しないと意味がなくなります。

プロジェクトクォータの設定

これは用途がちょっと特殊です。これはグループ/ユーザーの制限ではなく、指定したディレクトリをプロジェクトという単位にして、制限をかけます。projectはproject ID(Name)を指定して管理します。/etc/projectsファイルに対象のディレクトリとIDを記載し、/etc/projidファイルにIDとNameの紐付けを記載します。上記までと比べると少し複雑ですね。

今回は例として、「/home/test1と/home/test2を、プロジェクト名"testpro"としてクォータをかける」ような設定をします。尚プロジェクト番号は適当に35とします。

# echo 35:/home/test1 >> /etc/projects
# echo 35:/home/test2 >> /etc/projects
# echo testpro:35 >> /etc/projid
# xfs_quota -x -c 'project -s testpro' /home
# xfs_quota -x -c 'limit -p bhard=5m testpro' /home
# xfs_quota -x -c 'report -h -p' /home
Project quota on /home (/dev/mapper/centos-home)
                        Blocks
Project ID   Used   Soft   Hard Warn/Grace
---------- ---------------------------------
#0            48K      0      0  00 [------]
testpro         0      0     5M  00 [------]

これでtest1,test2のディレクトリには、合計5M以上のデータを保存する事ができなくなります。
尚、同じディレクトリを複数プロジェクトに所属させる事は出来ないのでご注意下さい。

タイマー設定

上記のソフトを超過してから使用できなくなるまでの猶予期間の設定です。m(分),h(時),d(日),w(週)で設定可能です。今回は22時間を猶予期間と設定します。

# xfs_quota -x -c 'state' /home
User quota state on /home (/dev/mapper/centos-home)
  Accounting: ON
  Enforcement: ON
  Inode: #67 (6 blocks, 6 extents)
Group quota state on /home (/dev/mapper/centos-home)
  Accounting: ON
  Enforcement: ON
  Inode: #68 (3 blocks, 3 extents)
Project quota state on /home (/dev/mapper/centos-home)
  Accounting: ON
  Enforcement: ON
  Inode: #68 (3 blocks, 3 extents)
Blocks grace time: [--------]
Inodes grace time: [--------]
Realtime Blocks grace time: [--------] 
 
# xfs_quota -x -c 'timer -bir 22h' /home
 
# xfs_quota -x -c 'state' /home
User quota state on /home (/dev/mapper/centos-home)
  Accounting: ON
  Enforcement: ON
  Inode: #67 (6 blocks, 6 extents)
Group quota state on /home (/dev/mapper/centos-home)
  Accounting: ON
  Enforcement: ON
  Inode: #68 (3 blocks, 3 extents)
Project quota state on /home (/dev/mapper/centos-home)
  Accounting: ON
  Enforcement: ON
  Inode: #68 (3 blocks, 3 extents)
Blocks grace time: [0 days 22:00:00]
Inodes grace time: [0 days 22:00:00]
Realtime Blocks grace time: [0 days 22:00:00]

Expertモード

xfs_quota -x でexportモードに移行します。timer,limit,report等のコマンドをそのまま実行出来るようになります。

# xfs_quota -x /home/
xfs_quota> report -h
User quota on /home (/dev/mapper/centos-home)
                        Blocks
User ID      Used   Soft   Hard Warn/Grace
---------- ---------------------------------
root            0      0      0  00 [------]
userA         12K      0      0  00 [------]
userB         12K      0      0  00 [------]
userC         20K      0      0  00 [------]

Group quota on /home (/dev/mapper/centos-home)
                        Blocks
Group ID     Used   Soft   Hard Warn/Grace
---------- ---------------------------------
root            0      0      0  00 [------]
groupA        56K      0      0  00 [------]
groupB        12K      0      0  00 [------]
groupC        12K      0      0  00 [------]

Project quota on /home (/dev/mapper/centos-home)
                        Blocks
Project ID   Used   Soft   Hard Warn/Grace
---------- ---------------------------------
#0            80K      0      0  00 [------]

xfs_quota> quit

終了時はquitでエキスパートモードを終了します。