Solaris に負けるな


いろいろとはまることの多い Solaris 固有の設定とかをまとめてみる。

Apache の設定

Solaris 10 からは 今までの起動スクリプトに変わって SMF が導入されているため、 標準の package ではなく 自分でコンパイルしたバイナリを使いたい場合は、 RC スクリプトを書き換えるのではなく、 svccfg コマンドを使って プロパティを書き換えることになる。

具体的な手順は以下の通り。 元々、 別に用意した起動スクリプトを実行するようになっていたため、 変更内容はすっきりとしている。

svccfg -s http:apache2 listprop svccfg -s http:apache2 setprop start/exec = \"/usr/local/etc/rc.d/apache start\" svccfg -s http:apache2 setprop stop/exec = \"/usr/local/etc/rc.d/apache stop\" svccfg -s http:apache2 setprop refresh/exec = \"/usr/local/etc/rc.d/apache refresh\" svccfg -s http listprop svccfg -s http setprop tm_man_httpd/manpath = /usr/local/apache/man svcadm disable http svcadm refresh http svcadm enable http

BIND の設定

Solaris 10 からは 今までの起動スクリプトに変わって SMF が導入されているため、 標準の package ではなく 自分でコンパイルしたバイナリを使いたい場合は、 RC スクリプトを書き換えるのではなく、 svccfg コマンドを使って プロパティを書き換えることになる。

具体的な手順は以下の通り。

svccfg -s dns/server:default listprop svccfg -s dns/server:default setprop config_data/entities = file://localhost/etc/namedb/named.conf svccfg -s dns/server:default setprop start/user = root svccfg -s dns/server:default setprop start/group = bind svccfg -s dns/server:default setprop start/privileges = \ basic,\!proc_session,\!proc_info,\!file_link_any,net_privaddr,file_dac_read,file_dac_search,sys_resource,proc_setid svccfg -s dns/server:default setprop start/exec = \"/usr/local/etc/rc.d/named start\" svccfg -s dns/server:default setprop start/working_directory = /etc/namedb svccfg -s dns/server listprop svccfg -s dns/server setprop tm_man_named/manpath = /usr/local/bind/man svccfg -s dns/server setprop tm_man_named/section = 8 svcadm disable dns/server svcadm refresh dns/server svcadm enable dns/server

OpenSSH の設定

Solaris 10 からは 今までの起動スクリプトに変わって SMF が導入されているため、 標準の package ではなく 自分でコンパイルしたバイナリを使いたい場合は、 RC スクリプトを書き換えるのではなく、 svccfg コマンドを使って プロパティを書き換えることになる。

具体的な手順は以下の通り。

svccfg -s ssh listprop svccfg -s ssh setprop config_data/entities = file://localhost/usr/local/etc/sshd_config svccfg -s ssh setprop start/exec = \"/usr/local/etc/rc.d/sshd start\" svccfg -s ssh setprop stop/exec = \"/usr/local/etc/rc.d/sshd stop\" svccfg -s ssh setprop refresh/exec = \"/usr/local/etc/rc.d/sshd restart\" svccfg -s ssh setprop tm_man_sshd/manpath = /usr/local/share/man svccfg -s ssh setprop tm_man_sshd/section = 8 svcadm disable ssh svcadm refresh ssh svcadm enable ssh

OpenSSL の作成

Solaris 10 上で Sun Studio 11 を使用して OpenSSL をコンパイルすると、 一見正常にコンパイルできたようにみえるが、 AES の暗号化関数が正常に動作せず、 make test で失敗してしまう。

この壊れた crypto ライブラリを OpenSSH にリンクすると、 sshd 自体は起動するが、 接続しようとすると Bad packet length というエラーが出て 異常終了してしまう。

これは Sun Studio の最適化に問題があるようで、 最適化を全て無効にすることで正常なバイナリが作成されるようになる。

Configure に対するパッチ

MH の作成

Solaris で MH をコンパイルすると、 コンパイルオプションで CONTENT_LENGTH の定義が有効になり、 メール本文の行頭に 'From ' があっても '>' を追加しないようになる。 Solaris ではスプールでのメールの境界を Content-Length: ヘッダにより判別しており、 mail.local が Content-Length: ヘッダを追加してくれるため、 通常は問題になることはない。

しかし、 MH に付属の rcvstore を利用してメールをスプールに格納すると、 rcvstore は Content-Length: ヘッダを追加しないため、 メールの境界は行頭の 'From ' によって判別することになる。 この時、 メール本文の行頭に 'From ' があると、 そこをメールの境界と誤判断してしまい、 メールが途中で分断されることになってしまう。

MH の Content-Length: ヘッダに対する対応が不十分であるため このような事になってしまうので、 行頭に 'From ' があった場合は無条件で '>' を追加することで、 この問題を回避することができる。

無条件で '>' を追加するパッチ

anthy の作成

Solaris 10 上で Sun Studio 11 を使用して anthy をコンパイルしようとすると、 alloca() がシンボル解決できなくてエラーとなってしまう。 alloca() を使っているソースで alloca.h を include してあげることで、 コンパイルできるようになる。

また anthy-7900 だと、 途中の mkdepgraph を実行するところでプロセスサイズが膨大化し、 CPU を 100% 使いきって そのまま止まってしまう。 この解決方法はよくわからず、 /usr/sfw/bin に入っている gcc を使用してコンパイルすると、 正常にコンパイルすることが出来る。 これは anthy-8322 では直っているので、 最新版を使えば問題は無い。

Solaris Solstice DiskSuite (Volume Manager) でミラーリングをする場合

Volume Manager を使ってミラーリングをする場合、 metadb で作成するメタデバイスの状態データベースは 3 つ以上の HDD 上に作成すること。 でないと、HDD に障害が発生して再起動した場合に、 起動できなくなってしまう。 ハードウェアが活性挿抜に対応していて、 再起動せずに HDD の交換が可能な場合は、 2 つだけでも構わない。


にゃん <nyan@furiru.org>