funini.com 自由研究 Solaris 10

Solaris 10

Sparc版Solaris 10のサーバ (v440)のセットアップをしました。

Misc

電源回復時に自動的に起動するようにする

scadmというコマンドで、ALOMという層を設定します。
# scadm show
# scadm help
で、状態を見たりします。
# scadm set sc_powerstatememory true
これで、ALOMに自動起動の情報が書き込まれました。

ntpの設定

Solaris 10だと標準でxntpdが入っていますが、設定はされていないので適宜設定します。
/etc/inet/ntp.clientを/etc/inet/ntp.confにコピー。内容は、multicastclientて行をコメントアウトして
#multicastclient 224.0.1.1
server  ntp.nc.u-tokyo.ac.jp
これで、svcadmで自動起動の設定をする。
# svcadm -v enable ntp
いきなり同期が始まるので、/var/adm/messagesとかで設定がうまくいったか確認。
Jul 11 13:19:04 localhost ntpdate[22558]: [ID 774510 daemon.notice] step time server 
133.11.x.x offset -269.671427 sec
Jul 11 13:19:04 localhost xntpd[22560]: [ID 702911 daemon.notice] xntpd 3-5.93e+sun 0
3/08/29 16:23:05 (1.4)

ネットワークの設定

フリーソフト(emacs,gcc)など。

付属のDVD-ROMから入れます。
# cd /cdrom/cdrom0/Solaris_10/(適当なディレクトリ).../
# pkgadd -d .
(パッケージ一覧が表示されるので、適宜選択)

iPlanetのLDAPサーバ(iDS)を入れる

http://www.rinneza.com/junya/tech/solaris10_x86/mail/cyrus_sasl_2_1_22.html にしたがってインストールしました。 コンパイルはうまく行かなかったので、 http://kumo.jp/wiki.cgi?page=Solaris10%A4%C7%B9%D4%A4%B3%A4%A6%A1%AA を参考に作りました。
使ったオプションです。
./configure --prefix=/usr/local \
 --enable-login --enable-plain --disable-anon --disable-digest
--disable-krb4 --disable-gssapi --disable-
otp --disable-sql --with-plugindir=/usr/local/lib/sasl2
--with-saslauthd=/var/cyrus --with-pwcheck=/var/c
yrus  \
--includedir=/usr/include/sys \
--with-dbpath=/etc/sasldb2 \
--with-bdb-libdir=/usr/local/BerkeleyDB.4.5/lib \
--with-bdb-incdir=/usr/local/BerkeleyDB.4.5/include
あと saslauthd/auth_getpwent.c のdes.hが無いと怒られたので、以下の変更をしましたた。
//#include 
#include  //(追加)

nisの設定

http://www.db.is.kyushu-u.ac.jp/computer/solarisserver/NIS.html を参考にさせていただきました。
nisで共有するファイルは、/var/etc/におくことにします。一般に /var/etc/yp/nis.input と書かれているので、読み替えます。
groupとhostsはとりあえず分けて、/var/etc/groupと/var/etc/hostsにしました。 nsswitch.confをnis用にします。
# cp nsswitch.nis nsswitch.conf
ディレクトリを設定しました
(/var/yp/Makefile)
DIR=/var/etc
PWDIR=/var/etc/
あと、余計なものを共有しないようにしました。
all: passwd group ipnodes ...
all: passwd group hosts

nfs

共有したいraid装置のディスク(仮に/dev/dsk/c1t1...)をnewfsします。
# newfs /dev/dsk/c1t1...
として、/etc/vfstabに
/dev/dsk/c1t1...       /dev/rdsk/c1t1...      /raid1  ufs     1
 yes     -
の一行を書いて、/raid1としてraidが見えるようにしました。 /etc/dfs/dfstabに以下の記述をします。
share -F nfs -o rw=クライアントののホスト名 /raid1/home
その後、shareallコマンドを実行します。
# shareall
# /etc/init.d/nfs.server stop
# /etc/init.d/nfs.server start

Berkeley DB + Cyrus-SASL

http://cyrusimap.web.cmu.edu/downloads.html#imapを参考に、 Cyrus-SASL + Cyrus-IMAPの環境を構築しようとしたのですが、Cyrus SASLのインストールまではうまく行きましたが、Cyrus IMAPのコンパイルの際にBerkeleyDB 4.5 + CyrusIMAP2.3.8だとうまくいかなくて、BerkeleyDB 4.5 + CyrusIMAP2.3.8(CVS)はautoconfが止まってしまいました。
 (メモ:cvsからcyrus-imapを取ってくる方法)
 cvs -d :pserver:anoncvs@cvs.andrew.cmu.edu:/cvs login
 [anonymous]
 cvs -d :pserver:anoncvs@cvs.andrew.cmu.edu:/cvs co -d cyrus-imapd cyrus
そこで、BDBを4.4に戻して、cyrus-saslとcyrus-imapdをコンパイルしました。 用いたconfigureオプションは以下の通りです。
CC=gcc ./configure --with-sasl=/usr/local \
--with-bdb=/usr/local/BerkeleyDB.4.4/  --with-snmp=no \
--with-perl=/usr/local/bin/perl
途中、まずpod2manが無いと言われるので、以下のコマンドを実行しました。
ln -s /usr/perl5/5.6.1/bin/pod2man /usr/bin/pod2man
また、imtest/imtest.cのコンパイル中に以下の二つのファイルをinclude出来ないと 言って止まってしまいました。
sasl/md5.h
sasl/md5global.h
そこで、ソースを以下のように直して継続しました。
//#include 
//#include 
#include  // 追加
#include  // 追加
あと、perl/imap以下のコンパイルの際に、どうしてもSunのCCを使おうとして 止まってしまっていました。これは、perl/以下のディレクトリで用いられる Makefileを自動生成しているMakefile.PLが、このスクリプトを実行するperlを コンパイルしたコンパイラを強制指定する仕様になっていたためでした。 これは、configureでperlとして/usr/local/bin/perlを使うように指定することで 回避できました。 (参考: http://symreq.justplayer.co.jp/?Solaris%209)
さらに、saslauthdをpamを見るようにして立ち上げるスクリプトを、/etc/init.d/saslauthdに書きました。内容は以下のようにします。
[/etc/init.d/saslauthd]
#!/sbin/sh

case "$1" in
'start')
       if [ -x /usr/local/sbin/saslauthd ]; then
               /usr/local/sbin/saslauthd -a pam
       fi
       ;;

*)
       echo "Usage: $0 { start }"
       exit 1
       ;;
esac
exit 0
/etc/rc2.d/にシンボリックリンクを張っておきます。
# ln -s /etc/init.d/saslauthd /etc/rc2.d/S87sasl
これで、認証デーモン(saslauthd)が自動起動するようになります。

Cyrus-IMAP (設定)

cyrus-saslがインストール済みとします。

samba

ドキュメントソース
普通にconfigureしてmakeしたところ、
/usr/ccs/bin/ld: illegal option -- E
...
というエラーが出てしまった。
LD=/usr/local/bin/ld
などと指定してもうまくいかないので、下のサイトを参考に ldを入れ替えてしまって対応した。 http://www.rinneza.com/junya/tech/solaris9_x86/network/samba_3.0.7.html
# cd /usr/ccs/bin
# mv ld ld.default2
# ln -s /usr/ucb/ld /usr/ccs/bin/ld
そうしたら今度は、
snprintf.c:(.text+0x14): undefined reference to `VA_COPY'
というエラー。 http://lists.samba.org/archive/samba/2006-July/122406.html を参考に、lib/snprintf.cを編集して対応。
//ファイルの先頭に以下の一行を追加。
#define VA_COPY(dest, src) (dest) = (src)

以下の記述をコメントアウト。
//#ifndef VA_COPY
//#ifdef HAVE_VA_COPY
//#define VA_COPY(dest, src) __va_copy(dest, src)
//#else
//#define VA_COPY(dest, src) (dest) = (src)
//#endif
//#endif
あとはinetdでサービスを登録。 古い書式の設定ファイルを一度書いて、インポートするのがお手軽。 以下のようにファイルを書く
swat    stream  tcp     nowait  root    /usr/local/samba/bin/swat       /usr/loc
al/samba/bin/swat
これをinetconvでインポート
# inetconv -i inetd.conf_swat
現在の設定の確認します。まずは登録名を確認します。
# inetadm | grep swat
enabled   online         svc:/network/swat/tcp:default
設定を詳しく確認するには、inetadm -lを実行します。
# inetadm -l /network/swat/tcp
SCOPE    NAME=VALUE
        name="swat"
        endpoint_type="stream"
        proto="tcp"
        isrpc=FALSE
        wait=FALSE
        exec="/usr/local/samba/bin/swat"
        arg0="/usr/local/samba/bin/swat"
        user="root"
default  bind_addr=""
...
設定を変更するには、inetadm -m を用います。 例えば実行されるコマンド名を変更する場合は
# inetadm -m /network/swat/tcp exec="/usr/local/samba/bin/swat"
デーモンを有効化 /無効化します。
無効化
# inetadm -d /network/swat/tcp
有効化
# inetadm -e /network/swat/tcp
サービスの再起動。 inetに登録されたものは、自動的にsvcsの方にも入っています。
# svcadm refresh /network/swat/tcp (リロードに相当)
# svcadm restart /network/swat/tcp (再起動に相当)

stunnel

cyrus-imapで立てたimapサーバ(ポート143)がimapsサーバ(ポート993)になります。 (TLSにはなりません)
ソースはstunnel.orgから落としてきます。
--with-sslでopensslの場所を指定して、かつLD_LIBRARY_PATHに ライブラリの場所も設定する。
export LD_LIBRARY_PATH=/usr/sfw/lib
./configure --with-ssl=/usr/sfw
そうしないと
checking size of unsigned char... configure: error: cannot compute
sizeof (unsigned char), 77
というエラーが出た (ldは元々/usr/ccs/binにあったものに戻してあります) sslのディレクトリを指定してコンパイルしたところ、libwrapをリンクできないエラーが出てしまいました。
# ./configure --with-ssl=/usr/sfw
# make 
.....
gcc -g -O2 -Wall -Wshadow -Wcast-align -Wpointer-arith -I/usr/sfw/include \
-o stunnel file.o client.o log.o options.o protocol.o network.o resolver.o \
ssl.o ctx.o verify.o sthreads.o stunnel.o pty.o  -lz -ldl -lsocket -lnsl \
-lpthread -L/usr/sfw/lib -lssl -lcrypto -lwrap
Undefined                       first referenced
 symbol                             in file
deny_severity                       /usr/sfw/lib/libwrap.so
allow_severity                      /usr/sfw/lib/libwrap.so
ld: fatal: Symbol referencing errors. No output written to stunnel
collect2: ld returned 1 exit status
*** Error code 1
make: Fatal error: Command failed for target `stunnel'
たぶんlibwrapをコンパイルしたのと同じccを使えばいいのでしょうが、 今回はgccしか使えないので、とりあえずlibwrapなしでコンパイルしてみました。 (セキュリティはiptablesでの制限で確保しましょう)
./configure --with-ssl=/usr/sfw --disable-libwrap
/usr/local/etc/stunnel/stunnel.confを適切に書いて、コマンドラインでstunnelと打つとデーモンが起動します。
[/usr/local/etc/stunnel.conf]
cert = /usr/local/etc/stunnel/stunnel.pem
pid = /usr/local/var/run/stunnel/stunne.pid

setuid = nobody
setgid = nogroup

; Protocol version (all, SSLv2, SSLv3, TLSv1)
sslVersion = all

; Some performance tunings
socket = l:TCP_NODELAY=1
socket = r:TCP_NODELAY=1

[pop3s]
accept = 995
connect = 110

[imaps]
accept = 993
connect = 143
あとは起動スクリプトを書きます。 (すごい「とりあえず」なスクリプトなので、stopできません。 ps -ej | grep stunnelとかしてプロセスidを調べて、killして下さい。) はじめ、stunnel.confで
; Protocol version (all, SSLv2, SSLv3, TLSv1)
sslVersion = SSLv3
と書いていたところ、古いThunderbirdで接続時に「このサーバへの接続最大数を超えています 」というエラーが出て、接続がうまくいきませんでした。これは実際のところはsslのバージョンが合っていなかったためで、SSLv3をallにしたところ、うまく接続できるようになりました。

Apache2が立ち上がらない!?

なぜか標準の状態だとApache2が自動で立ち上がらず、手で上げないといけないので、調査してみました。
apache2の設定を詳しく見てみます。
# svcs -l svc:/network/http:apache2

fmri         svc:/network/http:apache2
name         Apache 2 HTTP server
enabled      true
state        maintenance
next_state   none
state_time   Wed May 16 14:52:26 2007
alt_logfile  /etc/svc/volatile/network-http:apache2.log
restarter    svc:/system/svc/restarter:default
contract_id
dependency   require_all/error svc:/network/loopback:default (online)
dependency   optional_all/error svc:/network/physical:default (online)
state が maintenance になっているので、何かトラブルがあることが分かります。 ここのalt_logfile /etc/svc/volatile/network-http:apache2.logというところに、 svcが出力したログがあります。 これを見ると、
mkdir: "/var/run/apache2": 読み取り専用のファイルシステムです。
(30)Read-only file system: httpd: could not open error log
file /var/apache2/logs/error_log.
Unable to open logs
[  5月 16 14:52:26 Method "start" exited with status 1 ]
となっていたので、/var/apache2/logsのオーナーを変更し、/var/runのパーミッションも 777に変えました。
# chown webservd:webservd /var/apache2/logs/
その上で、デーモンを再起動しました。
svcadm restart apache2
これで確かに立ち上がるのですが、しかし再起動すると元に戻ってしまいます。 まとめると、"/"がread onlyでマウントされた状態で立ち上がってしまうのが問題みたいです。これは起動順序の変更で解決できると思うので、smfの設定を見てみます。
まずは現在の設定をexportしました。
# svccfg export http > ~/smf/http.xml
そして、これを編集します。 起動順序を遅らせるために、(特に)以下の二つを追加しました。
<dependency name='name-services' grouping='require_all'

restart_on='none' type='service'>

<service_fmri value='svc:/milestone/name-services'/>
</dependency>

<dependency name='milestone' grouping='require_all' restart_on='none'
type='service'>
<service_fmri value='svc:/milestone/sysconfig'/>
</dependency>
そして、これを再度importさせます。
# svccfg import /smf/http.xml
これで再起動しても正しくapacheが立ち上がるようにはなりました。

SMF

/etc/init.d/以下にスクリプトを書いたりする代わりに、直接起動するプロセスを指定することで、デーモンの管理がらくらくになるらしい。慣れるまでは戸惑いますけど。
とりあえずhttp://blogs.sun.com/yappri/entry/smf_service_management_facilityを参考に、stunnelをsmf管理にしてみました。
まず、LD_LIBRARY_PATHを設定してstunnelを実行する、start_stunnel.sh スクリプトを書きました。
[ /usr/local/sbin/start_stunnel.sh ]
#!/sbin/sh
LD_LIBRARY_PATH=/usr/lib:/usr/sfw/lib
export LD_LIBRARY_PATH
/usr/local/sbin/stunnel
chmodしておきます。
# chmod 755 /usr/local/sbin/start_stunnel.sh
そして、このスクリプトを実行する設定を書いたXMLファイルを /var/svc/manifest/system/stunnel.xml に書きました。
# cat /var/svc/manifest/system/stunnel.xml
<?xml version="1.0"?>
<!DOCTYPE service_bundle SYSTEM "/usr/share/lib/xml/dtd/service_bundle.dtd.1">
<service_bundle type='manifest' name='SUNWcsr:stunnel'>

<service name='system/stunnel' type='service' version='1'>
       <create_default_instance enabled='false' />
       <single_instance/>
       <!-- milestoneデーモン群よりも後で起動 -->
       <dependency name='milestone' grouping='require_all'
               restart_on='none' type='service'>
               <service_fmri value='svc:/milestone/sysconfig' />
       </dependency>

       <!-- ここは何をしているのかよく分からない -->
       <dependent name='stunnel_single-user' grouping='optional_all'
               restart_on='none'>
               <service_fmri value='svc:/milestone/multi-user' />
       </dependent>

       <!-- 起動や終了の動作 -->
       <exec_method type='method' name='start'
               exec='/usr/local/sbin/start_stunnel.sh' timeout_seconds='600' />
       <exec_method type='method' name='stop' exec=':kill'
timeout_seconds='60' />
       <exec_method type='method' name='refresh' exec=':kill -HUP'
timeout_seconds='60' />

       <property_group name='general' type='framework'>
               <propval name='action_authorization' type='astring'
                       value='solaris.smf.manage.stunnel' />
       </property_group>

       <stability value='Unstable' />
       <template><common_name><loctext xml:lang='C'>
         Stunnel Daemon</loctext></common_name></template>
</service>
</service_bundle>
そして、これを登録しました。
# svccfg -v import /var/svc/manifest/system/stunnel.xml
# svccfg disable svc:/system/stunnel:default
# svccfg enable svc:/system/stunnel:default
これで、stunnelのプロセスをkillしても、また立ち上がってきます。