14.15. リソースの制限

寄稿: Rhodes Tom [FAMILY Given].

長年にわたり FreeBSD は、 リソースを制限するためのデータベースとしてフラットファイル形式の /etc/login.conf により管理していました。 この方法は、現在でも使われていますが、 リソースを管理する方法としては最適な方法でないことが、 以前から議論されています。 フラットファイル形式では、 クラスとして知られるグループラベルにユーザを分類する必要があります。 この場合、フラットファイルだけではなく、 パスワードデータベースに対しても変更が必要となります。 潜在的に、より多くの制限を加えられたユーザ対してはラベルの追加や、 cap_mkdb を使ったリソースデータベースの再構築、 /etc/master.passwd への変更が必要となります。 さらに、パスワードデータベースは、 pwd_mkdb を使って再構築する必要があります。 この複数回に渡るプロセスは、 多くのユーザについて設定する必要がある場合には、 大変な時間の浪費につながる可能性があります。

FreeBSD の新しいコマンドである rctl(8) は、 ユーザに対して、 よりきめ細かにリソースの制限を管理する方法を提供します。 このコマンドは、ユーザだけではなく、プロセス、jails およびオリジナルのログインクラスに対してもリソースの制限を行うことができます。 これらの高度な機能は、管理者およびユーザに対し、 リソースをコマンドラインで管理したり、 設定ファイルを用いることで、システムの初期化時に、 ルールを設定する方法を提供します。

この機能を有効にするには、以下の行を GENERIC またはカスタムカーネルコンフィグレーションファイルに追加し、 再構築してください。

options         RACCT
options         RCTL

その後、システムの再起動が必要になります。 この過程の手順については、8章FreeBSD カーネルのコンフィグレーション をご覧ください。 これらの準備が完了すると、rctl を用いてシステムにルールを設定できるようになります。

ルールの構文は簡単で、 subject, subject-id, resource および action を使って管理されます。 以下のルールの例を参照してください。

user:trhodes:maxproc:deny=10/user

これは基本的なルールです。 ここで、subject は user、 subject-id は trhodes です。 maxproc はもちろんプロセスの最大数であり、resource です。 ここで action は、deny と設定されており、 新しいプロセスの生成がブロックされます。 この例では、ユーザ trhodes のプロセスは 10 個に制限され、それ以上のプロセスは作成できません。 コンソールにログを出力したり、 devd(8) に対し通知したり、プロセスに sigterm を送ったりといった、 他の action も利用できます。

ルールを追加する際には、注意すべき点がいくつかあります。 上の例では、ログインして screen セッションを実行してしまうと、 不幸にもユーザは最も簡単なタスクの実行ですらブロックされてしまうでしょう。 リソースの制限が適応されると、エラーが出力されます。 この例では以下のような出力が行われます。

% man test
    /usr/bin/man: Cannot fork: Resource temporarily unavailable
eval: Cannot fork: Resource temporarily unavailable

他の例としては、rctl(8) を使って jail がメモリの制限を超えることを防ぐことができます。 このルールは以下のように書くことができます。

# rctl -a jail:httpd:memoryuse:deny=2G/jail

ルールを /etc/rctl.conf に追加すると、 再起動してもルールは持続します。 フォーマットは、ルールから最初のコマンドの部分を除いたものとなります。 たとえば、上のルールを追加するには、 以下のように追加してください。

# Block jail from using more than 2G memory:
jail:httpd:memoryuse:deny=2G/jail

ルールを削除するには、rctl に対し、 リストから削除するように指定してください。

# rctl -r user:trhodes:maxproc:deny=10/user

マニュアルページには、 ルールをすべて削除する方法が記載されています。 しかしながら、特定のユーザのルールをすべて削除するには、 以下のようなコマンドを実行してください。

# rctl -r user:trhodes

subjects をコントロールするリソースは他にも多く用意されています。 これらについて知るには、rctl(8) をご覧ください。

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

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

本文書に関する質問については、 <doc@FreeBSD.org> まで電子メールを (英語で) 送ってください。