« Bodhiでの不要エフェクト(Shake)除去、ibus起動方法 | トップページ | Bodhi(Ubuntu)での起動スクリプト:SysVinit編 »

2011/08/12

Bodhi(Ubuntu)での起動スクリプト:Upstart編

F1A75-Vに苦労している今日この頃です。F1A75-Vが悪いのもあるのだけど、やっぱり自分がWindows7に対してあまりにもシロートさんなのが何よりも悪いと言えるかも。
作業記録取る方法も確立出来ていないし・・・

さて、気を取り直してBodhiです。BodhiのForum読んでいるとLinuxの起動スクリプトを全く知らない人が余りに多い感じです。あそこのForumは人はいいんだけど、UbuntuについてどころかLinuxについてすらまともな知識を持っている人がほとんどいない感じなので、あまり一般化は出来ないとは思いますが。
丁度自分も前に書いたBodhi LinuxのEeePCへのセットアップという記事でBodhi Forum流のいい加減な起動スクリプトを使っていますので、それを訂正する意味でも書いておくにはいいと思います。

起動スクリプトですが、Bodhiのフォーラムでは今でも堂々と/etc/rc.localが推奨されています(自分も前に書いたBodhi LinuxのEeePCへのセットアップという記事で使ってますが)。
そもそもこれを調べだしたきっかけが、この起動時スクリプトのうちlaptop_modeとdirty_writeback_centisecsが設定されていないんじゃ? ということからでした。
(結果的にはスクリプトは間違っていなくて、Jupiterが上書きしていただけでした)

ちなみにJupiterが書いているものは/usr/lib/jupiter/kernel 以下のファイルにあります。興味のある方はどうぞ。見ればわかりますが、powerがAC電源が有効になった場合に、batteryがバッテリ動作状態に入った時に実行されます。

さて、自分は上で/etc/rc.local使ったのですが、これは既にubuntuでは出来るだけ避けるべきとされています。
現状は/etc/rc.localでなく、UpstartかSysVinitを使うのが一般的です。各々の特徴は、

  1. SysVinit
  2. Runレベル毎の起動・停止管理。ファイルは各デーモンやらサービス毎に細分化。rc.localは互換性維持のために起動の最後に実行するように取り込まれている。
  3. Upstart
  4. Ubuntu現在の推奨。Runレベルに限らずInitデーモンが受け取れるイベント全てについて起動・停止管理が可能。ファイルの細分化はSysVinitよりマシ。互換性維持のためSysVinitを取り込んで動作。

まぁArchの場合には今でも/etc/rc.conf に全部書けよ! が理念な訳ですが。Ubuntuの世界では互換性維持のために過去のしくみはまだ使えるものの、Upstartに移行するのがオススメみたいです。
とはいえ、勉強のためにSysVinitを使った場合にどうなるかもやってみました。

[目的]

  • 起動時に幾つかのコマンドを実行させる。
  • コマンドは1回実行されればOK
  • デーモンについては、ここでは書きません。基本は同じなので参考資料を読んでもらえばわかると思います。

と、やることは至ってシンプルです。

  1. とりあえず最初の準備とデバッグ方法
  2. 今までの起動スクリプトが正常に動作しているか確認した方法をまず書いておきます。 とりあえずlaptop_modeの値が怪しかったのでスクリプト実行前後の値をファイルに書かせてみました。
    gksu leafpad /etc/rc.local &

    して、

    for dir in apparmor apt cups dist-upgrade ConsoleKit fsck gdm installer samba unattended-upgrades ;
    do
        if [ ! -e /var/log/$dir ] ; then
            mkdir /var/log/$dir
        fi
    done
    sysctl -w vm.swappiness=1
    sysctl -w vm.vfs_cache_pressure=50
    sysctl -w vm.dirty_writeback_centisecs=1500
    sysctl -w vm.laptop_mode=5
    

    となっていたものを、sysctl -w vm.dirty_writeback_centisecs=1500 行の後を、

    # このスクリプトを実行した事をメモ
    echo " set parameter start" > /tmp/setparam.txt
    date '+%Y/%m/%d %H:%M:%S.%N' >> /tmp/setparam.txt
    echo " script execute by $(whoami)" >> /tmp/setparam.txt 
    # 書き込み実行前の値をメモ
    echo " before" >> /tmp/setparam.txt
    cat /proc/sys/vm/laptop_mode >> /tmp/setparam.txt
    echo "" >> /tmp/setparam.txt
    sysctl -w vm.laptop_mode=5
    # 書き込み実行後の値をメモ
    echo " after" >> /tmp/setparam.txt
    cat /proc/sys/vm/laptop_mode >> /tmp/setparam.txt
    echo "" >> /tmp/setparam.txt
    

    のように変えます。これで

    cat /tmp/setparam.txt
    set parameter start
    2011/08/09 14:39:56.980816442
    script execute by root
    before
    0
     
    after
    5
    

    のようにスクリプトが実行されたか確かめることが出来ます。
    ちなみに今回/etc/rc.local は使用しなくするので、現状の/etc/rc.localの内容は全てコメントアウトします。

  3. Upstartの場合

  4. 説明やらは、いますぐ実践! Linux システム管理 / Vol.188の辺りやら適当にupstart UbuntuでGoogle先生に聞けば情報は幾らでも出て来るかと。
    やることは簡単です。
    Upstartスクリプトは/etc/init/ 以下に置いて拡張子をconfにするのが決まりです。今回はノートPC用の省電力スクリプトなので、 /etc/init/laptop.conf を作りました。

    gksu leafpad /etc/init/laptop.conf
    

    以下の内容を記述して保存。

    # power saving script for laptop
    #
    description	"power saving script for laptop"
    
    

    start on runlevel [2345]
    script
    for dir in apparmor apt cups dist-upgrade ConsoleKit fsck gdm installer samba unattended-upgrades ;
    do
    if [ ! -e /var/log/$dir ] ; then
    mkdir /var/log/$dir
    fi
    done
    sysctl -w vm.swappiness=1
    sysctl -w vm.vfs_cache_pressure=50
    end script

    テストには、

    initctl start laptop
    

    とかやってみればOKです。問題があった場合には、dmesg 等で確認すると良いと思います。
    また、rc.localの箇所で書いたデバッグ用のメッセージを入れるという方法も動作確認には有効ですよね。

SysVinitについては長くなったので別にまとめます。

« Bodhiでの不要エフェクト(Shake)除去、ibus起動方法 | トップページ | Bodhi(Ubuntu)での起動スクリプト:SysVinit編 »

Bodhi Linux」カテゴリの記事

コメント

コメントを書く

(ウェブ上には掲載しません)

トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/28800/52396265

この記事へのトラックバック一覧です: Bodhi(Ubuntu)での起動スクリプト:Upstart編:

« Bodhiでの不要エフェクト(Shake)除去、ibus起動方法 | トップページ | Bodhi(Ubuntu)での起動スクリプト:SysVinit編 »