現場ですぐに役立つ知識を欲するあなたに贈る珠玉のTips集。今回は、ユーザーごとに使用できるディスク容量やiノード数に制限を設けるためのコマンド「quota」を解説する。
Solaris 8でサーバを管理しています。これまでユーザーに対して、特に何か制限を設けるといったことは行っていなかったため、先日、サーバ上で「file system is full」というメッセージが表示されてしまいました。今後は、このような状態を避けるために、ユーザーごとに使える領域を制限したいと考えています。何かいい方法はありませんか?
この場合は、quotaコマンドを用いるといいでしょう。quotaとは、ユーザーごとに使用できるディスク容量やiノード数に制限を設けるためのコマンドです。このコマンドはシステム管理の上で必須となるものではありませんが、有限なシステム資源の有効な利用という観点や、またご質問の内容から考えると、quotaを用いることが有効な手段といえます。
quotaの設定方法は、次に挙げる3段階のステップを踏みます。
1.マウントオプションの変更
/etc/vfstabファイルの内容を以下のように編集します。
2.rcファイルの変更
/etc/rc2.d/S01MOUNTFSYSファイルの最後に、リスト1の5行をつけ加えます。この内容は、OS起動の際に「quotacheck -a」によるquotaチェックを行い、「quotaon -a」でquotaを起動するというものです。
#Enable checking quotas
echo -n 'checking quotas:' > /dev/console
/usr/sbin/quotacheck -a > /dev/console 2>&1
echo 'done.' > /dev/console
/usr/sbin/quotaon -a
3.quotaファイルの作成
quotaによって制限を設けるファイルシステムの幹に当たるディレクトリ(ここでは/export/home)に移って、次のようにquotasファイルを作成します。
# cd /export/home; touch quotas; chmod 600 quotas
これで、システムを再起動するとquotaが使える状態になります。
ufsファイルシステムに対して、ユーザー単位でquotaを設定するには、edquotaコマンドを利用します。このコマンドを次のように実行すると、viが呼び出されます。
# cd /export/home
# edquota <ユーザー名>
書き込む内容の例は以下のとおりです。弱い制限値とは、ユーザーが一時的に超えることができる制限値で、強い制限値はユーザーが超えられない制限値を意味します(詳細は後述)。
repquotaコマンドは、各自のquota情報を表示します。スーパーユーザーは、ほかのユーザーのquota情報を確認できます(実効例1)。また、例えば、実効例1のユーザーbbbと同じquota情報をユーザーcccに割り当てたいという場合は、「-p」オプションで基になるユーザーbbbを指定し、ユーザーcccに対してedquotaコマンドを実行します(実行例2)。
# repquota -v /dev/md/dsk/d3
/dev/md/dsk/d3(/export/home):
Block limits File limits
User used soft hard timeleft used soft hard timeleft
aaa -- 0 2560 3072 0 0 0
bbb -- 0 1280 1536 0 0 0
# edquota -p bbb ccc
# repquota -v /dev/md/dsk/d3
/dev/md/dsk/d3(/export/home):
Block limits File limits
User used soft hard timeleft used soft hard timeleft
aaa -- 0 2560 3072 0 0 0
bbb -- 0 1280 1536 0 0 0
ccc -- 0 1280 1536 0 0 0
ユーザーが弱い制限値を超えるとタイマーが作動し始め、期限切れ(デフォルトは7日間)の時点でユーザーの使用率が弱い制限値を超えていた場合、弱い制限値は、強い制限値として実施されます(期限設定は「edquota -t」コマンドで変更)。期限切れ以降は、ユーザーはその領域への書き込みができなくなります。
ただ、これら制限値のサイズを超えても、ユーザーに対して警告などが表示されるわけではありません。そのため、ユーザーから「突然書き込みできなくなった」というクレームが出るケースが想定できます。その場合に備え、次のような対処を行っておくといいでしょう。
set groupline=`/usr/bin/groups`
if ($groupline[1] == groupa || $groupline[1] == groupb ) then /usr/sbin/quota -v
endif
unset groupline
運用中に、さらに大きな領域を要求してくるユーザーもいるはずです。この場合は、まず共有領域を使っていることを理解してもらい、各ユーザーに「不必要なファイルを捨てる」ことを徹底させましょう。それを実行してもなお領域が必要になった場合は、quotaの切り直しを行うよりも、次のような対応を取るといいでしょう。
Copyright © ITmedia, Inc. All Rights Reserved.