2005年1月 3日

【jailスクリプト】


FreeBSD 4.5 での jail 環境を構築した時の情報です。
jail の構築のやり方については、man jail やその他ウェブ上にたくさん転がっていますので、そちらを参照してみるといいと思います(たぶん man jail だけで十分だと思います)。ここでは、jail 環境構築後に jail 内でデモンを自動起動/停止を行うためのスクリプトについて紹介します。
※ もちろん、いろいろやり方があって人それぞれでしょうが、私はこんなやり方をやってみました。というものです。

  • /usr/local/etc/rc.d/jail.shの作成

    /usr/local/etc/rc.d 配下に以下のようなスクリプトを置きます。

    #!/bin/sh
    
    JAILTOP=jailのトップディレクトリ
    JAILHOST=jail環境のホスト名(FQDN)
    JAILADDR=`fgrep "${JAILHOST}." /etc/hosts | awk '{print $1}'`
    
    case ${1:-help} in
      start)
        if [ -x /usr/sbin/jail -a -e $JAILTOP/etc/rc.jail ] ; then
            echo -n ' ^[[1m[JAIL:^[[0m^[[5m'
            /usr/sbin/jail $JAILTOP $JAILHOST $JAILADDR /bin/sh /etc/rc.jail $1
            echo -n '^[[0m^[[1m]^[[0m'
        fi
        ;;
      stop)
        if [ -e $JAILTOP/etc/rc.jail ] ; then
            echo -n ' ^[[1m[JAIL:^[[0m^[[5m'
            /bin/sh $JAILTOP/etc/rc.jail $1
            echo -n '^[[0m^[[1m]^[[0m'
        fi
        ;;
      *)
        echo "Usage: `basename $0` {start|stop}" >&2
        ;;
    esac
    
    exit 0
    

    赤字の部分を各環境に合わせて変更します。
    要は、/usr/sbin/jail があって、かつ、jail 環境内の /etc に rc.jail があればそれを起動する。というものです。
    ※ ^[ はエスケープコードです。vi とかなら CTRL+V, CTRL+[。emacs なら CTRL+q, CTRL+[ で入力できます。


  • /etc/hosts

    上の JAILADDR の設定が /etc/hosts から IP アドレスを自動取得するようになっているので、/etc/hosts に jail のエントリを追加します。例えば以下、

    192.168.0.128   jail.foo.bar.
    
    ↑ jail 用の IP アドレスが 192.168.0.128 で名前が jail.foo.bar だった場合。

    これでスクリプトが自動的に jail 用の IP アドレスを探しあててくれます。もちろん、JAILADDR にベタに IP アドレスを記述してもかまいません。


  • $JAILTOP/etc/rc.jailの作成

    jail 環境内の /etc に rc.jail というスクリプトを置きます。

    JAILRCDIR=/usr/local/etc/rc.jail
    
    for f in $JAILRCDIR/*
    do
        [ -x $f ] && $f $1
    done
    
    exit 0
    

    jail 環境内に、/usr/local/etc/rc.jail というパスを作成し、そこへ jail 環境内で起動するデモンを実行するためのスクリプトを放り込んでいきます。たとえば ports 等で apache をインストールすると、/usr/local/etc/rc.d に apache 起動のためのスクリプトがインストールされますが、それを jail 環境内の /usr/local/etc/rc.jail 内に置いてやればいいわけです。
    それらのスクリプトに実行権がついてなければ、chmod +x してやりましょう。

    ただし、これだと jail 環境内の各種サービス起動スクリプトと、ホストシステム側のサービス停止スクリプトを別に用意することになります。それだとちょっと面倒なので私は unionfs を利用しています。unionfs の説明は割愛しますが、これを利用すると既存のパスを別のパスへマウントさせることができます。例えば、/etc/fstab に以下を記述します。

    /usr/local/etc/rc.jail  /jail/usr/local/etc/rc.jail union ro    0       0
    
    ※ ↑はjail 用のディレクトリが /jail だった場合です。

    で試しに手動でマウントしてみると。

    # mount /jail/usr/local/etc/rc.jail
    # mount | grep rc.jail
    <above>:/usr/local/etc/rc.jail on /jail/usr/local/etc/rc.jail (union, local,rea
    d-only, noclusterw)
    

    これでホストシステム側の /usr/local/etc/rc.jail にスクリプトを放り込めば、= jail 環境内の /usr/local/etc/rc.jail に同じスクリプトを放り込むことになるわけです。ちなみに、jail 環境内での rc.jail 配下のスクリプトを更新されないように read-only マウントしています。

    これで自動起動/停止の環境ができたと思います。
    システム起動時は、/usr/local/etc/rc.d/jail.sh start → $JAILTOP/etc/rc.jail start(ここで jail の起動) が呼び出され、→ jail 環境内の /usr/local/etc/rc.jail 配下のスクリプト群が start オプション付きで呼び出される。ということになります。
    システムシャットダウンの際には、同様のシーケンスで stop オプションがつけられることになります。ただし、停止処理は jail 環境の外(つまりホストシステム側)で実行されるため、/var/run 配下の pid ファイルを参照しているスクリプトは $JAILTOP/var/run 配下を見るよう変更を施しておく必要があります。


  • rc.jail配下のスクリプト

    たとえば、以下は jail 内で apache を起動する際の /usr/local/etc/rc.jail/apache.sh です。

    #!/bin/sh
    
    JAILTOP=jailのトップディレクトリ
    
    case ${1:-help} in
      start)
        if [ -x /usr/local/sbin/apachectl ] ; then
            /usr/local/sbin/apachectl start >/dev/null 2>&1
            echo -n ' apache'
        fi;;
    
      stop)
        if [ -e $JAILTOP/etc/rc.jail -a -e $JAILTOP/var/run/httpd.pid ] ; then
            kill -TERM `cat $JAILTOP/var/run/httpd.pid`
            rm -f $JAILTOP/var/run/httpd.pid
            echo -n ' apache'
        fi
        ;;
      *)
        echo "Usage: `basename $0` {start|stop}" >&2
        ;;
    esac
    
    exit 0
    

    前述しましたが、注意しなければならないのは、起動時のスクリプト実行は jail 内。停止時のスクリプト実行はホストシステム側で行われるという事です。




トラックバック

このエントリーのトラックバックURL:
http://www.nomadic.jp/admin/MT/mt-tb.cgi/444

コメントを投稿

コメント: (スタイル用のHTMLタグが使えます)