筆者について
FreeBSDを通じてOSSにささかな貢献を。
- 日本xrdpユーザ会発起人
- xrdp developer
- FreeBSD developer
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
これで万事解決。