(1/2)静かに活躍の場を広げているFreeBSD。そのFreeBSDに昔から搭載されているのに知られることなくお蔵入りしている機能や、新しく開発された機能を取り上げ、紹介していきます。最初のテーマは、ホスティングサービスなどでニーズの高いリソース制御機能です。日本の企業では、エンタープライズ目的のLinuxとしてCentOSを採用することが多い。同じような用途ではFreeBSDも人気がある。どちらもできることは似ており、適材適所で使い分けされているようだ。インターネットサーバOSとして人気の高いFreeBSDだが、最近では高性能アプライアンスや組み込みデバイスで採用されるシーンが広がっており、静かに活躍の場を広げている。その活用の広さの割には、FreeBSDがもともと提供している「あの機能」を知らないで使っているという方も多い。日本語での情報が少ない機能の中には、知られることなくお蔵入りしているものがある。これはもったないことだ。FreeBSDは新規開発も積極的で、特にここ数年はエンタープライズでの利用に要求される機能が活発に開発され、最新版に統合されている。本連載では、昔から搭載されていながらあまり知られていない機能や、新しく開発された機能を取り上げ、紹介していこうと思う。静かに浸透するFreeBSD、これを活用する際の参考資料として使っていただければ幸いだ。プロセス単位でリソースを制限、setrlimit(2)FreeBSDに要求される機能として、特にホスティングサービス業者から要望が高い機能がリソース制御機能だ。FreeBSDをホスティングOSとして採用しているベンダは、たいてい、独自のリソース管理機能をFreeBSDに独自に実装して使っている。Jailと便利に併用できるリソース制御機能を望む声が多い。FreeBSDは、4.2BSDで導入されたsetrlimit(2)システムコールを持っているため、プロセス単位でリソース制限を実施することができる。CPU時間、メモリ使用量、プロセス数、ファイルディスクリプタ、共有メモリなどに対して上限値を設けることができる。この機能を活用すれば、求めるリソース制御は実現できる。ディスク容量の制限であれば、同じく4.2BSDに導入されたディスククォータの機能を利用すればよい。setrlimit(2)でリソース制限はできるが、運用時の柔軟性という面では若干面倒なところがある。setrlimit(2)は、そのシステムコールを実行したプロセスがリソース制限の対象となり、この値は子プロセスへ引き継がれる。通常はログイン時に設定されるようになっており、適用の対象はログインクラスで選ぶ仕組みになっている。この方法には次のような面倒な点がある。制限を超えた場合に任意の動作を設定することができないつまり、機能自体はあるが、柔軟に利用しようとすると難がある。これが従来のリソース制御機能だ。rctl(8)FreeBSDはこうした問題に対して、新しいリソース制御機能としてRACCT/RCTLの実装を追加した。10-CURRENTや9-STABLEではすでに利用できる。RACCTはカーネル内部でリソース使用量を把握するためのフレームワークで、RCTLはRACCTを使用してリソース制限を実施するためのフレームワークだ。実際にはrctl(8)コマンドでリソース制限を実施する。rctl(8)で設定できるリソースはsetrlimit(2)とあまり変わらないが、設定できる対象と自由度が異なる。制限値を超えた場合の挙動も自由に設定できる。rctl(8)であると考えてもらってよいだろう。rctl(8)では設定対象を、ログインクラスのみならず、ユーザー、プロセス、Jailに対して指定できる。制限を超えた場合の動作も、拒否のみならずログの取得、シグナル送付、devd(8)への通知といった選択肢から選択できる。devd(8)に通知した場合にはdevd(8)経由で任意の動作をさせることが可能だ。rctl(8)はホスティング事業者向けの機能と思われるかもしれないが、安定したサーバ運用を支援する機能としても活用できるし、学生/新入社員向けのUNIX学習環境における安全策としても利用できる。rctl(8)の基本的な使い方RACCT/RCTLの機能は、執筆現在のカーネルではデフォルトになっていない。次のカーネルオプションを追加してカーネルを再構築すると利用できるようになる(10-CURRENT、9-STABLE)。RCTLrctl(8)コマンドの使い方は簡単で、-aでルールを追加し、-rでルールを削除、-uで対象とする主体が現在利用しているリソース量を表示する、というものだ。-aで追加したルールは、フィルタという形でまとめて指定できる。指定するルールは次のような形をとっている。perは指定しなくてもよく、「○○の中の□□に対して」といった指定が必要な場合に利用することになる。ルールを適用する主体。subjectを特定するIDを指定。subjectが指定した制限を超えた場合にどのアクションを起こすかを指定。要求の拒否、警告をコンソールへ出力、devd(8)へ通知、指定したプロセスへシグナルの送付を指定可能。制限を適用する範囲を指定。rctl(8)コマンドで指定できるルール指定できるリソースは次のとおりだ。setrlimit(2)で指定できるリソースとかぶっている。データサイズの最大値。スタックサイズの最大値。コアダンプサイズの最大値。物理メモリ使用量の最大値。ロックされているメモリ使用量の最大値。アドレス空間のメモリ使用量の最大値。スワップ使用量の最大値。SysVメッセージキュー最大値。SysV共有メモリサイズの最大値。rctl(8)コマンドで指定できるリソースrctl(8)はいつ実行してもよい。設定はシステムを再起動するとクリアされるため、システムが再起動しても適用させたい場合には/etc/rctl.confファイルに設定を追加し、/etc/rc.confにrctl_enable="YES"を追加しておく。メールマガジンをご購読ください。申し込みページへITmediaはアイティメディア株式会社の登録商標です。