Quotaの設定(xfsファイルシステム)



●クォータの設定範囲

 CentOS7で扱うxfsファイルシステムでディスククォータを設定する方法です。

 xfsファイルシステムでは3種類の範囲でクォータ設定を行うことが出来ます。
  • ユーザ
  • グループ
  • プロジェクト
 プロジェクトは、ディレクトリをプロジェクトという範囲でまとめて使用できるサイズの制限を行います。この場合、制限するディレクトリを複数のプロジェクトに所属させることはできませんので注意が必要です。

●クォータの設定

 xfsファイルシステムでクォータを設定する場合には、制限を行う対象があるパーティションをマウントする際に以下のオプションを指定する必要があります。/homeに対してクォータの設定を行いたい場合、/homeパーティションを事前に作成しておく必要があります。

オプション 説明
uquota ユーザのクォータ設定
uqnoenforce ユーザ毎のクォータ設定(通知のみ)
gquota グループのクォータ設定
gqnoenforce グループのクォータ設定(通知のみ)
pquota プロジェクトのクォータ設定
pqnoenforce プロジェクトのクォータ設定(通知のみ)


 マウントオプション設定

 /etc/fstabでクォータ設定を行いたいパーティションにマウントオプションを追加します。
 /homeディレクトリでクォータでサイズ制限を行いたい場合、下記のようにマウントオプションをします。
 下記は「ユーザ(uquota)」「グループ(gquota)」「プロジェクト(pquota)」の全てを使用できるようにする場合の設定例です。
# vi /etc/fstab
/dev/centos/home /home xfs defaults,uquota,gquota,pquota 0 0
 リブートします。
# reboot


 「/」にクォータ設定を行いたい場合

 xfsファイルシステムで「/」パーティションでクォータの設定を行いたい場合は、/etc/fstabにマウントオプションを指定しても反映されませんので、
 rootflagsでOS起動時のマウントオプションとして指定する必要があります。
 実際の設定は/etc/default/grubのGRUB_CMDLINE_LINUXにrootflags=マウントオプションを追加して、/boot/grub2/grub.cfgに反映させます。
# vi /etc/default/grub

 設定内容

 GRUB_CMDLINE_LINUXにrootflagsでマウントオプションを指定します。

 変更前

 環境により設定されている内容は異なるかもしれませんが、下記の部分に設定を追加していきます。
GRUB_CMDLINE_LINUX="rd.lvm.lv=centos/root rd.lvm.lv=centos/swap rhgb quiet"

 変更後

 最後にrooglags=uquota,gquota,pquotaを追加しました。
GRUB_CMDLINE_LINUX="rd.lvm.lv=centos/root rd.lvm.lv=centos/swap rhgb quiet rootflags=uquota,gquota,pquota"

 /boot/grub2/grub.cfgに設定反映

 /etc/default/grubの編集が完了しましたら、grub2-mkconfigコマンドを使用して/boot/grub2/grub.cfgに設定を反映させます。
# grub2-mkconfig -o /boot/grub2/grub.cfg
 最後にサーバの再起動を行ってマウントオプションが反映されているか確認してください。
# reboot

 マウントオプション確認方法

 現在適用されているマウントオプションは、mountコマンドや/etc/mtabを確認することで確認することが出来ます。

 mountコマンド実行結果

 「/dev/mapper/centos-root on /」部分で「usrquota,prjquota,grpquota」が有効になっていることが確認できます。
# mount | grep quota
/dev/mapper/centos-root on / type xfs (rw,relatime,attr2,inode64,usrquota,prjquota,grpquota)
/dev/sda1 on /boot type xfs (rw,relatime,attr2,inode64,noquota)
/dev/mapper/centos-home on /home type xfs (rw,relatime,attr2,inode64,usrquota,prjquota,grpquota)

 /etc/mtab表示

 上記同様「/dev/mapper/centos-root on /」部分で「usrquota,prjquota,grpquota」が有効になっていることが確認できます。
# cat /etc/mtab | grep quota
/dev/mapper/centos-root / xfs rw,relatime,attr2,inode64,usrquota,prjquota,grpquota 0 0
/dev/sda1 /boot xfs rw,relatime,attr2,inode64,noquota 0 0
/dev/mapper/centos-home /home xfs rw,relatime,attr2,inode64,usrquota,prjquota,grpquota 0 0


●クォータ設定確認

 xfsファイルシステムで、クォータの設定や情報表示等はxfs_quotaコマンドを使用します。
 まず、現状のクォータ設定状況を下記コマンド確認してみてください。
# xfs_quota -x -c 'report -h' パーティション
 /homeパーティションのクォータ設定情報を確認してみます。
# xfs_quota -x -c 'report -h' /home
User quota on /home (/dev/mapper/centos-home)
                        Blocks              
User ID      Used   Soft   Hard Warn/Grace   
---------- --------------------------------- 
root         104K      0      0  00 [------]
authtest      40K      0      0  00 [------]
user1         12K      0      0  00 [------]
user2         12K      0      0  00 [------]

Group quota on /home (/dev/mapper/centos-home)
                        Blocks              
Group ID     Used   Soft   Hard Warn/Grace   
---------- --------------------------------- 
root         104K      0      0  00 [------]
authtest      40K      0      0  00 [------]
user1         12K      0      0  00 [------]
user2         12K      0      0  00 [------]

Project quota on /home (/dev/mapper/centos-home)
                        Blocks              
Project ID   Used   Soft   Hard Warn/Grace   
---------- --------------------------------- 
#0           4.1G      0      0  00 [------]
 /homeパーティションにはマウントオプションとしてuquota、gquota、pquotaが設定されているので、ユーザ、グループ、プロジェクトそれぞれのクォータ設定について表示されました。
 「'report -h'」の部分に「-u」「-g」「-p」を追加すると、それぞれ「ユーザ」「グループ」「プロジェクト」に関する情報だけを表示させることが出来ます。
  • 'report -h -u' ユーザのクォータ情報を表示
  • 'report -h -g' グループのクォータ情報を表示
  • 'report -h -p' プロジェクトのクォータ情報を表示


●ユーザクォータ設定

 ユーザごとにクォータで制限を設定する場合は下記のように設定を行います。
# xfs_quota -x -c 'limit bsoft=サイズ bhard=サイズ 設定ユーザ' パーティション
  • bsoft ソフトリミット
  • bhard ハードリミット


 ソフトリミット

 この値を超えた場合一定期間はサイズを超えたままにしておけますが、期限が過ぎた場合は、データの作成・追加を行うことが出来なくなります。

 ハードリミット

 この値を超えてデータの作成・追加が行うことが出来なくなります。

 設定例

 ユーザauthtestにソフトリミット100MB、ハードリミット200MBでクォータの設定を行います。
# xfs_quota -x -c 'limit bsoft=100m bhard=200m authtest' /home
 設定を確認してみるとauthtestユーザにクォータの制限が設定されていることが確認できます。
# 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         104K      0      0  00 [------]
authtest      40K   100M   200M  00 [------]
user1         12K      0      0  00 [------]
user2         12K      0      0  00 [------]
 実際にauthtestユーザでファイルを作成して、クォータの動作確認を行います。
 まずは、ソフトリミットを超える150MBのデータを作成します。
$ fallocate -l 150m 150m_data
$ ls -lh 150m_data
-rw-r--r-- 1 authtest authtest 150M Jan  4 11:28 150m_data
 クォータの状況を確認すると、「Used」部分で「150.0M」使用している事と、ソフトリミットの制限期限が適用されていることが確認できました。
# 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         104K      0      0  00 [------]
authtest   150.0M   100M   200M  00 [7 days]
user1         12K      0      0  00 [------]
user2         12K      0      0  00 [------]
 次に、ハードリミットを超えるデータを作成して動作確認を行います。
 追加で100MBのデータを作成すると、150MB + 100MB でクォータで制限したハードリミットの200MBを超えるので、その際の動作について確認します。
$ fallocate -l 100m 100m_data
fallocate: fallocate failed: ディスク使用量制限を超過しました
 ハードリミットを超えた場合は「failed」となり、データを作成することが出来ませんでしたので、クォータの制限が正常に動作していることが確認できました。

 制限の解除

 クォータの制限を解除する場合はサイズを「0」で設定します。
# xfs_quota -x -c 'limit bsoft=0m bhard=0m authtest' /home
 クォータの状態を確認すると、「Soft」「Hard」ともに「0」となっていることが確認できます。
# 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         104K      0      0  00 [------]
authtest   150.0M      0      0  00 [------]
user1         12K      0      0  00 [------]
user2         12K      0      0  00 [------]


●グループクォータ設定

 グループの範囲でクォータを適用させたい場合は、サイズを指定する際に「limit -g」と指定します。
# xfs_quota -x -c 'limit -g bsoft=サイズ bhard=サイズ 設定グループ' パーティション


 設定例

 事前に作成しておいたuserグループにクォータの設定を行います。
# xfs_quota -x -c 'limit -g bsoft=100m bhard=200m user1' /home
 設定を確認するとuserグループの「Soft」と「Hard」にサイズ制限が設定されていることが確認できました。
# 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         104K      0      0  00 [------]
authtest   150.0M      0      0  00 [------]
user1         12K   100M   200M  00 [------]
user2         12K      0      0  00 [------]
 userグループに所属しているユーザでソフトリミットの制限に該当するサイズのファイルを作成してみます。
$ fallocate -l 100m 100m_data
 userグループの「Used」で100MB使用されていることと、ソフトリミットの制限期限が適用されていることが確認できました。
# 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         104K      0      0  00 [------]
authtest   150.0M      0      0  00 [------]
user1      100.0M   100M   200M  00 [7 days]
user2         12K      0      0  00 [------]
 次にハードリミットの動作確認を行うために、追加でサイズが150MBのファイルを作成しようとしましたが、ハードリミットの制限を超えてしまうためにファイルを作成することが出来きず、クォータの制限が正常に動作していることが確認できました。
$ fallocate -l 150m 150m_data
fallocate: fallocate failed: デバイスに空き領域がありません


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

 プロジェクトでクォータによる制限を行う場合、まずプロジェクトの設定を行う必要があります。
 プロジェクトの設定は/etc/projectsと/etc/projidファイルで行います。
  • /etc/projid:プロジェクト名とプロジェクトIDの紐づけ設定
  • /etc/projects:プロジェクトIDとディレクトリの組み合わせ設定


 /etc/projid

 /etc/projidファイルにはプロジェクト名とプロジェクトIDの紐づけを下記のように記述します。
プロジェクト名:プロジェクトID
 下記の内容で実際に/etc/projidファイを作成していきます。
  • プロジェクト名 test_project
  • プロジェクトID 10
# vi /etc/projid
 設定内容は下記の通りとなります。
test_project:10


 /etc/projects

 /etc/projectsプロジェクトIDとディレクトリをの組み合わせを下記の書式で設定します。
プロジェクID:ディレクトリ
 下記内容で/etc/projectsファイルを作成していきます。
  • プロジェクトID 10
  • ディレクトリ /home/user1
  • ディレクトリ /home/user2
# vi /etc/projects
 設定内容は下記の通りとなります。
10:/home/user1/
10:/home/user2/


 プロジェクト作成

 /etc/projidと/etc/projectsファイルの作成が完了しましたら、次に下記コマンドでプロジェクトの登録を行います。
xfs_quota -x -c 'project -s プロジェクト名' パーティション
 先ほど作成した/etc/projidと/etc/projectsファイルをもとに「test_project」プロジェクトを作成します。
# xfs_quota -x -c 'project -s test_project' /home
Setting up project test_project (path /home/user1/)...
Setting up project test_project (path /home/user2/)...
Processed 2 (/etc/projects and cmdline) paths for project test_project with recursion depth infinite (-1).


 クォータ設定

 プロジェクト範囲でクォータを適用させたい場合は、xfs_quotaコマンドでサイズを制限する際に「limit -p」と指定します。
# xfs_quota -x -c 'limit -p bsoft=サイズ bhard=サイズ プロジェクト名' パーティション


 設定例

 先ほど作成した「test_project」にクォータによるサイズ制限を設定していきます。
# xfs_quota -x -c 'limit -p bsoft=100m bhard=200m test_project' /home
 クォータの設定情報を確認してみると、「test_project」に制限が掛かっている事が確認できました。
# 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           4.2G      0      0  00 [------]
test_project    32K   100M   200M  00 [------]

 動作確認

 プロジェクトとして登録した/home/user1ディレクトリで150MBのデータを作成してソフトリミットの制限に掛かるか確認してみます。
$ pwd
/home/user1
$ fallocate -l 150m 150m_data
$ ls -l 150m_data
-rw-rw-r--. 1 user1 user1 157286400 11月 29 10:05 150m_data
「Used」で作成したファイルサイズ150MBが認識されていて、「Warn/Grace」を確認するとソフトリミットの制限に掛かっていることが確認できます。
# 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           4.2G      0      0  00 [------]
test_project 150.0M   100M   200M  00 [6 days]
 追加で100MBのデータを/home/user2ディレクトリ状に作成して、ハードリミットの制限に掛かるかどうか確認してみます。
$ fallocate -l 100m 100m_data
fallocate: fallocate failed: デバイスに空き領域がありません
 無事ハードリミットの制限に掛かり「デバイスに空き領域がありません」とエラーになり、データを作成することが出来ませんでした。

●warnquotaでクォータの警告メールを送信

 CentOS 7でwarnquotaを使用して、クォータの制限を超えたユーザに警告をメール送信を行えるようにする手順です。警告をメールを送信するため、SMTPサーバが使用できることが前提条件となります。

 インストール

 warnquotaのインストールします。
# yum install quota-warnquota


 設定

 警告メール送信するために、下記のファイルを設定してきます。
  • /etc/quotatab
  • /etc/warnquota.conf


 quotatab

 warnquotaから送信される警告メールには、ディスク使用量に関するレポートが記述されるのですが、/etc/quotatabで設定を行わない場合、クォータの制限に該当した場所がデバイス名で表示されてしまいます。
 例えば、/homeにクォータの制限を設定している場合、警告メールにはクォータの制限に掛かっているパーティション情報として/dev/mapper/centos-homeといったデバイス名が記述されますが、一般のユーザはどのパーティションの事なのか判別しづらいと思われます。
# df -h | grep /home
/dev/mapper/centos-home   245G  4.3G  241G    2% /home
 実際の警告メールに表示されるレポートは下記のようになります。
/dev/mapper/centos-home ← この部分が分かりづらい

                        Block limits               File limits
Filesystem           used    soft    hard  grace    used  soft  hard  grace
/dev/mapper/centos-home
               +-    167M    100M    200M  5days      28     0     0
/etc/quotatabに、下記の書式でデバイス名に分かりやすい名前をマッピングすると、一般ユーザがどのパーティションについての警告なのかが分かりやすくなります。
デバイス名: マッピング名
 では、実際に設定を行っていきます。
# cp -p /etc/quotatab /etc/quotatab_yyyymmdd
# vi /etc/quotatab

 設定内容

 /dev/mapper/centos-homeが「/home Directory」と表示されるように設定を行っています。
/dev/mapper/centos-home:  /home Directory

 表示例

/etc/quotatab編集後は、下記のようにどこのパーティションについてのことなのかが、わかりやすく表示されます。
/home Directory (/dev/mapper/centos-home) ← 何処のことかが分かりやすくなります

                        Block limits               File limits
Filesystem           used    soft    hard  grace    used  soft  hard  grace
/dev/mapper/centos-home
               +-    151M    100M    200M  6days      28     0     0 

 設定は必須ではありません

 /etc/quotatabは設定を行わなくても警告メールを送信することが出来るのですが、特に手間も掛かりませんので設定しておいたほうがユーザにやさしいので設定を行っておいたほうが良いでしょう。

 warnquota.conf

 /etc/warnquota.confでは、警告メールのメッセージの内容を設定することが出来ます。
# cp -p /etc/warnquota.conf /etc/warnquota.conf_yyyymmdd
# vi /etc/warnquota.conf

 変更内容

 とりあえず動作確認を行うために、送信元のメールアドレスを変更してみます。
 設定項目は下記の項目で、root@example.comの部分を自サーバの情報に変更します。
  • FROM
  • CC_TO
  • SUPPORT
  • SIGNATURE
 今回はroot@example.comをroot@www.bigbang.mydns.jpに変更しました。

FAIL項目について

 下記の設定がある場合は、頭に「#」をつけて「FAIL」無効化してください。
FAIL           = "configure /etc/warnquota.conf before running warnquota"
 ↓
#FAIL           = "configure /etc/warnquota.conf before running warnquota"


●warnquota実行

 設定が完了したら実際にwarnquotaコマンドを実行しクォータの状態をチェックさせますが、「ユーザに設定されているクォータ」と「グループに設定されているクォータ」ではチェックの方法が異なりますので、それぞれの方法について説明します。

 ユーザに設定されているクォータのチェック

 「warnquota -s」コマンドを実行することで、ユーザクォータの状態をチェックしサイズ制限を超過しているユーザにメールを送信してくれます。
 「-s」オプションは、警告メールに記述するディスク使用量のレポートの数字を分かりやすく表示させるためのオプションです。
# warnquota -s
 クォータのsoftlimit制限に該当しているユーザがいる場合、該当ユーザとrootユーザに下記のようなメールが送信されます。
 差出人、CC、署名の表示がwarnquota.confで設定した通りになっていることも確認できます。

quota-mail1.jpg

 ちなみに、「-s」オプションを設定せずにwarnquotaを実行すると、ディスクの使用量が一目ではわかりづらい表記になってしまいます。

 グループに設定されているクォータのチェック

 グループに設定されているクォータをチェックしてメールを送信する場合は「-g」オプションを指定します。
# warnquota -g -s
 この場合、メールの送信先は/etc/quotagrpadminsで設定されているユーザとなります。
 /etc/quotagrpadminsの書式は中身を確認してみてもらうとすぐにわかりると思いますが、下記のようになっています。
グループ: ユーザ

 設定例

 userグループに設定されているクォータの制限を超過した場合、authtestユーザに警告メールを送信するには下記のように設定を行います。
# cp -p /etc/quotagrpadmins /etc/quotagrpadmins_yyyymmdd
# vi /etc/quotagrpadmins 
user: authtest


●warnquota定期実行

 手動で「warnquota」を実行して警告メールが正常に届くことが確認できましたら、「warnquota」を定期的に実行させるように設定を行っていきます。
 warnquota自体には定期的に実行する機能が無いため、定期的に実行するためには「crontab」等に登録する必要があります。
 本手順では/etc/crontabに登録して定期的に実行させることにします。
 warnquotaを実行させる間隔は適宜決めてください。
# cp -p /etc/crontab /etc/crontab_yyyymmdd
# vi /etc/crontab


 設定例

 1時間ごとにメールを送信

 毎時「0」分に実行したい場合は下記のように設定します。
0 * * * * root warnquota -s

一日一回メールを送信

毎朝7:00に実行したい場合は下記のように設定します。
0 7 * * * root warnquota -s


●警告メッセージの編集

 初期設定で用意されている警告メールは、件名や本文がすべて英文なのでユーザにあまりやさしくありませんが、/etc/warnquota.confで簡単に内容を編集してメッセージの内容や件名を日本語に設定することができます。
 設定できる項目は色々とありますが、通常は下記の項目を編集するぐらいで大丈夫だと思います。

項目 説明
FROM 送信元メールアドレス
SUBJECT 件名
CC_TO CCで送信するメールアドレス
SUPPORT サポート連絡先とするメールアドレス(「SIGNATURE」または「GROUP_SIGNATURE」の設定がない場合有効)
PHONE 電話番号(「SIGNATURE」または「GROUP_SIGNATURE」の設定がない場合有効)
MESSAGE ユーザクォータ制限用メール通知文
SIGNATURE ユーザクォータ制限警告メールの最後に記述する文
GROUP_MESSAGE グループクォータ制限用メール通知文
GROUP_SIGNATURE グループクォータ制限警告メールの最後に記述する文
CHARSET 文字コード指定


 特殊文字

 MESSAGESとGROUP_MESSAGEでメッセージを設定する際には下記の特殊文字を使用することが出来ます。
  • %d:ドメイン名
  • %h:ホスト名
  • %i:ユーザ名
  • %s:グループ名
  • %%:%を表示
  • |:改行
  • \:メッセージを複数行に分割して記述する際に使用


 設定例

 設定例として下記の内容で設定を行ってみました。
# vi /etc/warnquota.conf
FROM = "root@www.bigbang.mydns.jp"
CC_TO = "root@www.bigbang.mydns.jp"
SUBJECT = "データサイズ超過のお知らせ"
MESSAGE = %h で /home/%i ディレクトリのデータサイズが規定値を超えていますので\
必要のないデータを消去してください。||\
Block limits|used:現在のデータサイズ|soft:データサイズの制限値|\
hard:データサイズの最大値|grace:データ削除までの猶予期間|
SUPPORT = root@www.bigbang.mydns.jp
PHONE = (xxx)xxxx 
SIGNATURE = ご不明な点があれば root@www.bigbang.mydns.jp までご連絡ください。|\
電話の場合は (xxx)xxxx までご連絡おねがいします。
 上記設定の場合、このようなメールになります。

quota-mail3.jpg
 ※root宛メールを別アカウントに転送しています。

 メッセージは自由に設定できるので、色々と試してみてください。