Quota を使ってディスク使用容量を制限する

SETUP


Quota

quota とはディスクスペースをユーザごとに制限する仕組みです。これをつかうことによって、利用できる容量を制限したり、作成できるファイル数を制限したりすることができます。

今回は、Linux Slackware 7.1 (Kernel 2.2.16) を想定して話を進めています。

 

Quota を設定するためには

Quota を利用するためには Linux カーネルに "Quota support" が組み込まれている必要がありますので、まだの場合はこれを組み込む必要があります。

Filesystems --->

[*] Quota support

今回は既にこの "Quota support" が組み込まれているものとして話を進めていきます。

組み込まれていない場合は Linux カーネルを再構築するなどしてください。ただし、カーネルの再構築は起動不能になるなどのトラブルを起こしやすいので、各自の責任のもと、よく注意して行いましょう。

 

 

また、Quota 制限をかけたい領域はシステムとは別のパーティションにある必要があるそうです。

なので容量制限を行いたいデータはあらかじめ別パーティションに保存しておくか、新しいパーティションを追加してそこへ移動するといった作業が必要となります。

というか、システムパーティションに quota を設定するとシステムが立ち上がらなくなるとか…。遠隔操作のコンピュータに入れてみてるので実際には試していませんが。

 

quota をインストールしてみる(途中で中止)

既に quota というプログラムがインストールされていれば特に必要はないと思いますが、とりあえず quota をインストールするところから書いてみようと思います。

と、ここでいきなり苦労してしまったのですが^^;;

 

まずはソースファイルを入手します。

どこからダウンロードできるかよくわからなかったため、強引に Slackware ソースの中 ftp://ftp.slackware.com/pub/slackware/slackware-9.0/source/ap/quota/ から quota-3.08.tar.gz を入手しました。

これをとりあえず /usr/src/ ディレクトリにおいて、展開してコンパイルします。

cd /usr/src

tar xvzf quota-3.08.tar.gz

 

cd quota-tools/

 

./configure

make

 

すると、コンパイルエラーとなってしまいました。

quotacheck.c: In function `ext2_direct_scan':

quotacheck.c:408: structure has no member named `i_uid_high'

quotacheck.c:409: structure has no member named `i_gid_high'

quotacheck.c:375: warning: `uid' might be used uninitialized in this function

quotacheck.c:376: warning: `gid' might be used uninitialized in this function

このあたりがエラーメッセージのようです。

構造体が i_uid_high および i_gid_high と言う名前のメンバー変数を持っていない、uid および gid という変数が初期化せずに利用されている、といったエラーのような感じです。

エラーが出ているのが quotacheck.c というファイルから察するに、Quota 関連のソースの一部でエラーが発生しているようなので、これはどうしたものか…。

 

エラー発生源となっている ext2_direct_scan 関数を見てみると、おそらく uid と gid が初期化せずに使われていると言う部分は、構造体に指定されたメンバー変数が見つからないことが影響して発生しているような感じです。

そして、メンバーが見つからない構造体は inode という名前の構造体で、次のように関数内のスコープで次のように定義されていました。

struct ext2_inode inode;

つまり、ext2_inode という構造体の別名です。

この ext2_inode という構造体は、quotacheck.c の中では宣言されていないようで、どうやら #include されているヘッダーのどれかで宣言されているようです。とすると、ライブラリのバージョンの違いなどに影響されているかもしれませんね。

今回は既にシステムに quota がインストールされていたようなので、-V オプションを指定してバージョンを見てみたところ、組み込み済みの quota のバージョンは 1.70 でした。今回入手してきた 3.08 とはメジャーバージョンで 2 も違うので、そのあたりもせいもありそうです。

 

この ext2_inode という構造体、よくよく考えればあたりまえだったのですけど、調べてみるとどうやら Linux の ext2 ファイルシステムに関連する構造体のようです。

ファイルシステムの仕様がころころ変わるということはないと思いますけど、まあそう考えるとシステムが新しくなったり、開発ライブラリが新しくなったりしたときに、互換性を欠いたり何かする可能性はありますね。

 

ライブラリを新しくしたりいろいろと試してみても良かったのですけど、システムよりな部分だけに何か大変なこと(?)があったりするとまずいので、今回はもともと quota が実装されていたわけだし、それを無難に使ってみることにします。

quota がまだ実装されていないシステムの場合は、その Linux ディストリビューション用の公開されているものを探して利用するのが安全ではないかと思います。

もしそれが見つからない場合はとりあえず新しいバージョンの quota ソースを入手してコンパイルし、エラーが出るようならば低いバージョンのソースをもってきてコンパイル…、正常にコンパイルできたものを利用する、といった感じでいいのではないでしょうか。

もっとも、確かめていないので確実なことはいえませんが。

 

Quota を起動させる

Quota を起動するに当たっての準備と、Linux の起動にあわせて Quota を有効にするようにシステムを調整します。

バージョンによって共通かどうかはわかりませんが、今回は quota 1.70 を使って設定してみました。

 

制限するパーティションの決定

まず、Quota を設定するパーティションを決定します。今回は /home に容量制限を設けたいので、このパーティションに設定しようと思います。

 

たとえば /home にマウントされているパーティションに制限をかけることに決定したら、まずここに quota.user というファイルを次の手順で作成します。

cd /home

 

touch quota.user

chmod 600 quota.user

 

続いて、パーティションのマウント情報が記録された /etc/fstab ファイルを修正し、どのパーティションにて Quota を有効にするかを指定します。

これは、fstab ファイルの 4 番目の項目に "usrquota" を指定します。たとえば次のような感じです。

/dev/hda1 swap swap defaults 0 0

/dev/hda2 / ext2 defaults 1 1

/dev/hda3 /var ext2 defaults 1 1

/dev/hda4 /home ext2 defaults,usrquota 1 1

none /dev/pts devpts gid=5,mode=620 0 0

none /proc proc defaults 0 0

このような感じ (上記の /dev/hda4 の行) に usrquota 指定を追記したら /etc/fstab の編集は完了です。

 

quota を Linux 起動時に開始する

/etc/rc.d/ ディレクトリ内に起動スクリプトを用意します。内容は次のような感じになります。

#!/bin/sh

QUOTA_PATH=/sbin

 

if [ -x ${QUOTA_PATH}/quotacheck ]; then

echo "checking quota ... "

${QUOTA_PATH}/quotacheck -avug

fi

 

if [ -x ${QUOTA_PATH}/quotaon ]; then

echo "starting quota ... "

${QUOTA_PATH}/quotaon -avug

fi

 

この内容のファイルを今回は rc,quota という名前で用意します。そしてこのファイルに実行権限を与えます。実行権限はたとえば次のようにすることで与えることができます。

chmod 755 rc.quota

実行権限の設定が終わったら、rc.local ファイル内でこのスクリプト ( rc.quota ) を呼び出すようにして、Linux の起動とともに Quota を有効にします。

/etc/rc.d/rc.local ファイル内に次の内容を追加します。

if [ -x /etc/rc.d/rc.quota ]; then

. /etc/rc.d/rc.quota

fi

これで準備完了です。

あとは Linux を再起動して今行った変更を有効にします。

 

容量制限を設定する

ユーザに制限をかける

"edquota" というツールを使って、ユーザごとの容量制限を設定してみます。今回は tempuser というユーザが登録されているものとして、そのユーザに制限をかけてみようと思います。

edquota tempuser

このようにするとエディタが起動し、tempuser の制限を設定することができます。

 

Quotas for user tempuser:

/dev/hda4: blocks in use: 12, limits (soft = 0, hard = 0)

inodes in use: 3, limits (soft = 0, hard = 0)

たとえば、このようなデータがエディタで開かれます。ここで制限できる種類は次のとおりとなります。

blocks 利用できる要領を kB 単位で指定します。
inodes 利用できるファイル数を指定します。

またこれらには次の 2 種類の制限方法があります。

soft limit 制限を越えると警告されるもの。その後、一定時間 (Grace period) は継続利用可能。
hard limit 制限を越えて利用することができないもの。警告ではなくこれを超えることは許されない。

 

これらを調整して利用できる領域を制限していきます。

ここで in use: の後に書かれている数字は実際に現在利用されている容量を示していて、制限の指定は limits の後の部分で指定します。

制限の指定は inodes ならば個数で、blocks ならば kB 単位で指定します。どちらの場合も 0 を指定した場合は無制限ということになります。

 

とりあえず今回は、個数は無制限で、容量を 200MB に設定してみることにします。

指定は kB 単位なので 200MB = 200 * 1,024 kB = 204,800 kB を指定します。個数は無制限なので 0 を指定すると次のような感じになります。一応、今回は blocks の soft limit を 200,000 に設定しておきましょう。

Quotas for user tempuser:

/dev/hda4: blocks in use: 12, limits (soft = 200000, hard = 204800)

inodes in use: 3, limits (soft = 0, hard = 0)

適切な部分を書き換えて変更を保存、エディタを終了させると、特に再起動などをしなくてもその時点から新しい制限が有効になります。

 

制限の設定を複製する

多数のユーザに制限を設けるなどの場合は、わざわざ各ユーザごとにエディタを使って編集しなくてもいい設定方法があるようです。

たとえば今、tempuser というユーザに制限を設定したとして、新しいユーザ、newuser というアカウントにもそれと同じ制限を設定したい場合は次のようにします。

edquota -p tempuser newuser

このようにするとエディタで設定ファイルを編集することなく、tempuser で設定した制限と同じのが newuser にも設定されます。

 

Grace period を設定する

soft limit の制限を越えたときの猶予期間 Grace period を設定する場合には、次のようにして edquota を実行します。

edquota -t

すると次のようなデータがエディタで開かれます。

Time units may be: days, hours, minutes, or seconds

Grace period before enforcing soft limits for users:

/dev/hda4: block grace period: 7 days, file grace period: 7 days

 

ここの次の項目を適切な値に書き換えます。

block grace period block (容量 kB) の soft limit を超えた場合の猶予期間。
file grace period inode (個数) の soft limit を超えた場合の猶予期間。

 

ここで使用できる単位には、次のものがあるようです。

days 日単位で期間を指定します。
hours 時間単位で期間を指定します。
minutes 分単位で期間を指定します。
seconds 秒単位で期間を指定します。
week 週間単位で期間を指定します。
month 月単位で期間を指定します。

 

利用状況を確認する

管理者が確認する場合

現在どのような利用状況になっているかを調べるには、次のような命令を実行します。

quotacheck -a; repquota -a

すると現在の設定状況および利用状況を確認することができます。確認できる内容は次のとおりです。

  Block limits File limits
User used soft hard grace used soft hard grace
アカウント名 利用容量 容量制限 容量制限 ファイル数 個数制限 個数制限

grace の項目が示す意味は良くわからないのですけど、おそらくは soft limit にかかった場合に猶予時間が刻まれるのではないかと思います。

 

各ユーザが確認する場合

各ユーザが自分の状況を確認したい場合は、単純に次のコマンドを実行します。ここでレポートされる内容は上記で触れたものと同じです。

quota