«前の日記(2012-02-17) 最新 次の日記(2012-02-29)» 編集

meta's blog - The Power To Serve

筆者について

FreeBSDを通じてOSSにささかな貢献を。

OSS活動をご支援いただける方を募集しています


2012-02-27 FreeBSD の rc スクリプト実行順序

FreeBSD の rc スクリプトの実行順序

FreeBSD の rc スクリプトの実行順序を決定するには rcorder (8) を使う。

$ rcorder {,/usr/local}/etc/rc.d/*
/etc/rc.d/hostid
/etc/rc.d/zvol
/etc/rc.d/dumpon
(snip)

各 rc スクリプトには以下のようなサービスの依存関係を記述する含まれていて、 rcorder はこれを解析して依存関係を解決する順番に各サービスを出力する。

# PROVIDE: resolv
# REQUIRE: netif
# KEYWORD: nojail

どうしてこれを取り上げたのかはまたあとで書く。

追記

8.0-RELEASE から service (8) コマンドが追加されていて、以下のコマンドで rc スクリプトの実行順序を調べることもできる。

$ service -e

-e オプションは /etc/rc.conf で有効化されているものだけを表示する。代わりに -r オプションを使用するとすべての rc スクリプトが対象になる。

net/mpd5 を ipfw より先に起動させる

うちのサーバのネットワークインターフェースは以下のようになっていて、WAN 側は PPPoEでネットワークに繋いでいる。

$ ifconfig
bge0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
        options=c019b<RXCSUM,TXCSUM,VLAN_MTU,VLAN_HWTAGGING,VLAN_HWCSUM,TSO4,VLAN_HWTSO,LINKSTATE>
        ether d8:d3:85:ae:4c:17
        media: Ethernet autoselect (100baseTX <full-duplex>)
        status: active
ng0: flags=88d1<UP,POINTOPOINT,RUNNING,NOARP,SIMPLEX,MULTICAST> metric 0 mtu 1438
        inet 124.41.57.17 --> 210.247.16.1 netmask 0xffffffff

サービスの起動順序は以下のようになっていて ipfw が mpd より先に起動してしまうため、ipfw 起動時点では PPPoE インターフェイス ng0 が存在せず通信できなくなってしまう。

$ service -e | cat -n |grep -e ipfw -e mpd
     7  /etc/rc.d/ipfw
    18  /usr/local/etc/rc.d/mpd5
    19  /usr/local/etc/rc.d/snmpd

この状態に陥ってしまうと PPPoE 接続確立後に ipfw を restart するまでネットワークに繋がらないので困る(◞‸◟) リモートからリブートも仕掛けられない。

net/mpd5 の起動を ipfw より先にすればいいのはわかっているので、/etc/rc.d/ipfw を眺めていると…あった。

    6  # PROVIDE: ipfw
    7  # REQUIRE: ppp
    8  # KEYWORD: nojail

ベースシステムに含まれる ppp はちゃんと ipfw に依存関係が記述されているので、ここに mpd も書いてやる。7行目を以下のように変更する。

    7  # REQUIRE: ppp mpd

変更すると、ipfw より前に mpd が起動するようになった。

    8	/usr/local/etc/rc.d/mpd5
    9	/etc/rc.d/ipfw
   18	/usr/local/etc/rc.d/snmpd

これで万事解決。