16.12. ファイルシステムクォータ

クォータは OS の持っているオプショナルな機能であり、 ファイルシステム毎にユーザやグループのメンバが使用するディスク容量やファイルの数を制限することができます。 この機能は、あるユーザやグループに割り当てられるリソースの量を制限することが望ましいようなタイムシェアリングシステムにおいてよく用いられます。 この機能を用いることによって使用可能なディスク容量の全てを一人のユーザやユーザのグループが使ってしまうことを防ぐことができます。

16.12.1. ディスククォータを使うためのシステム設定

ディスククォータの設定を始める前に、 まずはカーネルにクォータが組み込まれていることを確認しましょう。 カーネルのコンフィグレーションファイルに次の行を入れます。

options QUOTA

標準の GENERIC カーネルでは、 この機能は有効になっていませんので、 ディスククォータを利用するためには上記を設定後カーネルを構築しなおし、 作成されたカスタムカーネルをインストールしなければいけません。 カーネルのコンフィグレーションに関しては 第9章 をご覧ください。

次に /etc/rc.conf でディスククォータを有効にする必要があります。 次の行を加えましょう。

enable_quotas="YES"

起動時の動作をさらに細かくコントロールするためにもう一つ設定用の変数があります。 通常、起動時には quotacheck(8) によりそれぞれのファイルシステムのクォータの整合性がチェックされます。 quotacheck(8) の役割は、 クォータデータベースのデータが正しくファイルシステム上のデータを反映しているか確認することです。 これはかなり時間を食う処理であり、 起動にかかる時間に大きな影響を及ぼします。 このステップをとばしたい人のために /etc/rc.conf に次の変数が用意されています。

check_quotas="NO"

もし 3.2-RELEASE よりも前の FreeBSD を使っているならば設定はもっと単純で、一つの変数のみです。 次の行を /etc/rc.conf で設定してください。

check_quotas="YES"

最後に、ファイルシステム毎にディスククォータを有効にするために /etc/fstab を編集する必要があります。 ここでユーザもしくはグループ、 あるいはその両方にクォータを設定することができるのです。

あるファイルシステム上にユーザ毎のクォータを有効にする場合には、 /etc/fstab 中でクォータを有効にしたいファイルシステムエントリのオプション部に userquota を加えます。 例えば次のようになります。

/dev/da1s2g   /home    ufs rw,userquota 1 2

同様に、グループクォータを有効にするには userquota キーワードの代わりに groupquota を用います。 ユーザとグループの両方のクォータを有効にするには次のようにします。

/dev/da1s2g    /home    ufs rw,userquota,groupquota 1 2

デフォルトでは、 クォータファイルはそのファイルシステムのルートディレクトリに ユーザ用、グループ用それぞれ quota.user, quota.group という名前で置かれます。さらに詳しい情報は fstab(5) をご覧ください。fstab(5) マニュアルには別の場所を指定することができると書いてはありますが、 あまり勧められません。なぜなら、 様々なクォータ関係のユーティリティがそれにうまく対処できるようにないためです。

この時点で、 一度システムを再起動して新しいカーネルで立ち上げましょう。 /etc/rc が自動的に適当なコマンドを実行し、 /etc/fstab で有効にした全てのクォータ用に初期ファイルを作ってくれます。 従って、空のクォータファイルを手で作る必要は一切ありません。

通常の運用では quotacheck(8)quotaon(8), quotaoff(8) といったコマンドを手で動かす必要はないのですが、 慣れるためにもこれらのマニュアルは読んでおきましょう。

16.12.2. クォータリミットの設定

一旦クォータを有効にしたら本当に有効になっているのか確認しておきましょう。簡単な方法は次のコマンドを実行することです。

# quota -v

ディスクの使用状況と、クォータが有効になっているファイルシステムのクォータリミットが一行にまとめて出力されるでしょう。

さあ、edquota(8) でクォータリミットを設定する準備ができました。

ユーザやグループが使用できるディスク容量や作成できるファイルの数に制限をかけるにはいくつかのオプションがあります。割り当てディスク容量を制限 (ブロッククォータ) することもファイル数を制限 (inode クォータ) することも、両者を組み合わせることもできるのです。 これらの制限はそれぞれさらに二つのカテゴリ、 ハードリミットとソフトリミット、に分けることができます。

ハードリミットを越えることはできません。 あるユーザが一旦ハードリミットにたっした場合、 そのファイルシステムではそれ以上の割り当ては望めません。 例えばあるファイルシステム上に 500 ブロックのハードリミットが設定されており現在 490 ブロックを使用している場合、さらに 10 ブロックしか使えないのです。 11 ブロックを使おうとすると失敗します。

一方、 ソフトリミットはある限られた時間内であれば越えることができます。 この時間は猶予期間として知られており、デフォルトでは 1 週間です。 あるユーザが自分のソフトリミットを猶予期間よりも長い間越えているとソフトリミットはハードリミットに変わり、それ以上使用することはできなくなります。 ユーザがソフトリミットよりも減らせば猶予期間はリセットされます。

以下は edquota(8) コマンドを実行した時に見ることになるであろう例です。 edquota(8) コマンドが起動されると環境変数 EDITOR で指定されるエディタに入ります。 EDITOR が設定されていない場合には vi が起動されます。 ここでクォータリミットを編集します。

# edquota -u test
Quotas for user test:
/usr: blocks in use: 65, limits (soft = 50, hard = 75)
        inodes in use: 7, limits (soft = 50, hard = 60)
/usr/var: blocks in use: 0, limits (soft = 50, hard = 75)
        inodes in use: 0, limits (soft = 50, hard = 60)

通常、クォータが有効になっているファイルシステム毎に 2 行あります。 一つはブロックリミット用でもう一つは inode リミット用です。 クォータリミットを変更したいところを書き変えるだけでかまいません。 たとえばこのユーザのブロックリミットを、ソフトリミットは 50 から 500 へ、ハードリミットは 75 から 600 に変更する場合、

/usr: blocks in use: 65, limits (soft = 50, hard = 75)

から

 /usr: blocks in use: 65, limits (soft = 500, hard = 600)

へ書き換えます。新しいクォータリミットはエディタを終了すれば設定されます。

ある範囲の UID に対してクォータリミットを設定したい場合がありますが、このような時には edquota(8) コマンドの -p オプションを使うといいでしょう。まず、 あるユーザに割り当てたいクォータリミットを設定し、次に edquota -p protouser startuid-enduid を実行するのです。例えばユーザ test にお望みのクォータリミットが付いているとしましょう。 次のコマンドにより 10,000 から 19,999 の間の UID に対して同じクォータリミットを付けることができるのです。

# edquota -p test 10000-19999

さらに詳しいことは edquota(8) のマニュアルページをご覧ください。

16.12.3. クォータリミットとディスク使用状況のチェック

quota(1) または repquota(8) といったコマンドを使ってクォータリミットやディスクの利用状況を確認することができます。 quota(1) コマンドは個々のユーザやグループのクォータやディスク利用状況を確認するのに使えます。 ユーザは自身のクォータ、そして所属するグループのグループのみ確認することができます。 スーパーユーザのみが他のユーザや所属していないグループのクォータと利用状況を見ることができます。 repquota(8) コマンドを使うと、クォータが有効になっているファイルシステム用の全てのクォータやディスク容量のサマリを得ることができます。

以下は二つのファイルシステムにクォータ制限がかけられているユーザに対するquota -v コマンドの出力例です。

Disk quotas for user test (uid 1002):
     Filesystem  blocks   quota   limit   grace   files   quota   limit   grace
           /usr      65*     50      75   5days       7      50      60
       /usr/var       0      50      75               0      50      60

上の例で、/usr ファイルシステム上ではこのユーザは現在 50 ブロックというソフトリミットを 15 ブロックオーバーし 5 日間の猶予期間が残っています。アスタリスク * はクォータリミットを越えているユーザを示していることに注意してください。

通常、そのユーザが全く使っていないファイルシステムは、 クォータリミットが付けられているとしても quota(1) コマンドの出力には現われません。 -v オプションを用いればそのようなファイルシステム、 上の例では /usr/var、 を表示することができます。

16.12.4. NFS 上の クォータ

クォータは NFS サーバ上のクォータサブシステムにより実行されます。 rpc.rquotad(8) デーモンにより、NFS クライアント上の quota(1) コマンドは情報を得ることができ、クライアントマシン上のユーザが自分のクォータの統計を見ることができます。

/etc/inetd.conf において以下のように rpc.rquotad を有効にしましょう。

rquotad/1      dgram rpc/udp wait root /usr/libexec/rpc.rquotad rpc.rquotad

そして以下のように inetd を再起動します。

# kill -HUP `cat /var/run/inetd.pid`

本文書、および他の文書は ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/ からダウンロードできます。

FreeBSD に関する質問がある場合には、ドキュメント を読んだ上で <questions@FreeBSD.org> まで (英語で) 連絡してください。
本文書に関する質問については、<doc@FreeBSD.org> まで電子メールを (英語で) 送ってください。