Novell(クラウドコンピューティングのセキュリティ・仮想化ソリューションを実現)

 

uid xxxxに対して開いているファイル数の制限rlimit 1024に達したました

This document (3302273) is provided subject to the disclaimer at the end of this document.

環境

Novell SUSE Linux Enterprise Server 9
Novell SUSE Linux Enterprise Server 9 Service Pack 3

問題の状況

現象:

「/var/log/messages」に警告「uid xxxxに対して開いているファイル数の制限rlimit 1024に達しました」が表示されます。
コマンド「ulimit -n」を使用してシェルにuid xxxxのユーザとしてログインすると、開いているファイルの制限値には1024より大きい値が表示されます。
「/etc/security/limits.conf」ファイルは正常に変更されており、「soft nofile」と「hard nofile」の制限はuid xxxのユーザに対して1024よりも大きな値に増加されています。
「/etc/pam.d/」配下の該当するPAM関連のファイルが正常に変更されており、「session required pam_limits.so」の行が追加されています。

変更:

これまで手動で実行していたタスクが、uid xxxxのユーザから、cronデーモンによる自動実行にスケジュールされました。
同じ操作をuid xxxxのユーザとしてシェルにログインして実行した場合、すべて正常に機能し、「/var/log /messages」にエラーは記録されません。

Novell SUSE Linux Enterprise Server 9では、cronデーモンはPAMを認識しません。

解決策

Novell SUSE Linux Enterprise Server 9では、cronデーモンはPAMを認識しませんが、「/etc/pam.d/」配下のどのファイルを変更してもcronデーモンの動作は変更されず、「/etc/security/limits.conf」で指定された制限が使用されません。

その代わり、cronデーモンはデフォルトの環境としてシェル「/bin/sh」を使用し、ここからデフォルトの制限値を取得します。

この問題に対処し、cronがスケジュールされたタスクの制限を増加する方法はいくつかありますが、ここでは2つのソリューションを示します。

1) ファイル「/etc/init.d/cron」に行「ulimit -n 65536」(括弧は除く)を追加して変更します。

行を挿入する場所は、次のようにcronスクリプト自身の「start)」というラベルのセクションが適しています。

[...]
case "$1" in
    start)
        ulimit -n 65536 
        for al_de in {allow,deny}{,.rpmsave,.rpmorig} ; do
                if [ -f /var/spool/cron/$al_de ] ; then
                        allow_deny_move_info
                        break
                fi
        done
        echo -n "Starting CRON daemon"
        ## Start daemon with startproc(8). If this fails
        ## the echo return value is set appropriate.

        # NOTE: startproc return 0, even if service is
        # already running to match LSB spec.
        startproc $CRON_BIN

        # Remember status and be verbose
        rc_status -v
        ;;
[...]

これによって、開くファイルのソフトおよびハード制限値が65536まで増加し、cronが実行するすべてのタスクについて有効になります。この変更を反映するには、サーバを再起動する必要があります。

2) 「/etc/initscript」ファイルを使用します。

initscriptのマニュアルページ(man initscript)に記述してあるように、ファイル「/etc/initscript」を作成して、各プロセスに対してulimitおよびumaskのデフォルト値などの設定に使用できます。次のinitscriptでは、開いているファイルのハード制限を各プロセスについて65536に増加します。

                # Increase the hard file descriptor limit for all processes
                # to 65536.  The soft limit is still 1024, but any unprivileged
                # process can increase it's soft limit up to the hard limit
                # with "ulimit -Sn xxx" (needs a 2.2.13 or later Linux kernel).
                ulimit -Hn 65536

                # Execute the program.
                eval exec "$4"

この方法では、開くファイルのハード制限はシステム内のすべてのプロセスに対して増加しますが、ソフト制限はデフォルト値の1024のままであることに注意してください。

マニュアルページのNOTESセクションをよくお読みください。

このスクリプトは、デーモンなどのスタートアップスクリプト用ではありません。rc.localスタイルのスクリプトとは
関係ありません。単に/etc/inittabから実行されるもののハンドラです。このスクリプトを実行するとシステムが起動(再起動)できなくなります。

説明した対応策は両方とも実験環境と運用環境でテストされ、cronでスケジュールされたタスクで開くファイルのデフォルト値が1024を正常に超えました。ただし、最初の対応策は、cronを実行するタスクのみについて制限を増加し、2番目の方法のようにすべてのプロセスについて増加しないため、影響度と危険度が低くなります。

追加情報

Novell SUSE Linux Enterprise Server 10では、cronデーモンはPAMを認識するようになり、「/etc/pam.d/crond」がcronデーモン自身のPAM構成ファイルです。行「session required pam_limits.so」を「/etc/pam.d/crond」に追加すると、cronデーモンがデフォルトエントリ(*)について「/etc/security/limits.conf」で指定された制限を使用するようになります。

Disclaimer

この情報は、米国Novell, Inc.およびノベル株式会社の内外から発生したものです。本文書の内容または本文書を使用した結果について、いかなる保証、表明または約束も行っていません。また、本文書の商品性、および特定目的への適合性について、いかなる黙示の保証も否認し、排除します。

本文書に記載されている会社名、製品名はそれぞれ各社の商品、商標または登録商標です。

  • ドキュメントID: 3302273
  • 作成年月日: 21-AUG-2007
  • 修正年月日: 03-MAR-2009
  • ドキュメントリビジョン:
  • 分類:
  • 対象NOVELL製品およびバージョン: SUSE Linux Enterprise Server
  • カテゴリ: