2009年10月12日

●sennaをsolaris@sparcでコンパイルした

今年の三月に、mysqlなどで利用する組み込み型前文検索エンジンのsennaがsparcで動作しているsolarisでコンパイルできないと書いた。

仕事でなかなかに膨大な量のテキストデータベースを扱っているのだが、このsennaをmysqlに組み込む事で、一万件程度のテーブルでの複数カラム内のテキストデータの検索が一瞬で終わるくらいの恐ろしい速度で、単語ベースの精度の高い日本語インデックス検索が可能になるので、ぜひともsolarisで、しかも大好きなsparcで動作させたかったのだ。
あれから、Sparcには対応してない事を知って以来ずっと気になっていたのだが、最近仕事でSparcのサーバーを入れなおしたのを機会にもう一度チャレンジした。
そして無理やりではあるが、ソースコードにちょっとした手を加える事でコンパイルに成功したのでその方法を書いてみる。
なんというか、ちょっとした悲願達成である。

まず現時点での最新安定版のバージョン1.1.4ではどう頑張っても無理だったので、2009年10月1日の時点での開発版の最新ソースコードのtarballをダウンロードしてくる。
このサイトでは常に最新のソースコードに更新されてゆくので、一応ココに2009/10/01版をおいておく。

で、とりあえず特に変わったことをせずにmakeすると、
SunStudioのコンパイラccでは


/opt/SUNWspro/bin/cc -D_REENTRANT -I. -I. -I.. -I/usr/local/include -fno-strict-aliasing -g -I/usr/local/include -c store.c -KPIC -DPIC -o .libs/store.o
cc: 警告: 不正オプション -fno-strict-aliasing
"store.c", 427 行目: 警告: 1 番目の引数は、プロトタイプ宣言の型と互換性がありま せん:
プロトタイプ: volatile unsigned long longへのポインタ : "/usr/include/sys/atomic.h", 196 行目
引数 : struct _sen_ja_einfo {unsigned short seg, unsigned short pos, unsigned short size, unsigned charの配列[2] tail}へのポインタ
"store.c", 427 行目: 2 番目の引数は、プロトタイプ宣言の型と互換性がありません:
プロトタイプ: unsigned long long : "/usr/include/sys/atomic.h", 196 行目
引数 : struct _sen_ja_einfo {unsigned short seg, unsigned short pos, unsigned short size, unsigned charの配列[2] tail}
cc: store.c に対して、acomp が失敗しました。
gmake[2]: *** [store.lo] Error 1
gmake[2]: Leaving directory `/export/home/ukawa/src/senna/lib'
gmake[1]: *** [all-recursive] Error 1
gmake[1]: Leaving directory `/export/home/ukawa/src/senna'
gmake: *** [all] Error 2

gccの場合は


gcc -D_REENTRANT -I. -I. -I.. -I/usr/local/include -fno-strict-aliasing -g -O2 -Wall -Wextra -Wno-unused-parameter -Wno-sign-compare -Wformat=2 -Wstrict-aliasing=2 -Wdisabled-optimization -Wfloat-equal -Wpointer-arith -Wdeclaration-after-statement -Wbad-function-cast -Wcast-align -Wredundant-decls -Winline --param max-inline-insns-single=12000 --param large-function-growth=28000 --param inline-unit-growth=400 -I/usr/local/include -MT store.lo -MD -MP -MF .deps/store.Tpo -c store.c -fPIC -DPIC -o .libs/store.o
store.c: In function `sen_ja_replace':
store.c:427: warning: passing arg 1 of `atomic_swap_64' from incompatible pointer type
store.c:427: error: incompatible type for argument 2 of `atomic_swap_64'
make[2]: *** [store.lo] Error 1
make[2]: Leaving directory `/export/home/ukawa/src/senna/lib'
make[1]: *** [all-recursive] Error 1
make[1]: Leaving directory `/export/home/ukawa/src/senna'
make: *** [all] Error 2

てな感じでstore.cのコンパイルに失敗してmakeが終了してしまう。

どちらもstore.cの427行目の引数の型が違うような事を言っているので
とりあえずlib/store.cを見てみる。
$vi lib/store.c


421 *pseg = i;
422 }
423 SEN_IO_SEG_MAP(ja->io, *pseg, einfo);
424 if (!einfo) { return sen_memory_exhausted; }
425 eback = einfo[pos];
426 einfo[pos] = *ei;
427 SEN_SET_64BIT(&einfo[pos], *ei);
428 sen_ja_free(ctx, ja, &eback);
429 return sen_success;

となっており、引数がおかしいらしいこの427行目の「SEN_SET_64BIT」が何をしてるのか良くわからんのだが、どうせ作るのは32ビットバイナリやからなんちゃら64ビットなんちゃらが何であっても別にいらんやろ。と勝手に無理やり決めて、これを強引にコメントアウトする。
/* SEN_SET_64BIT(&einfo[pos], *ei); */

これで一応makeすればコンパイルはちゃんと通る。
生成されたオブジェクトに対して、
$ file lib/store.o
としてやれば
lib/store.o: ELF 32-ビット MSB 再配置可能 SPARC32PLUS バージョン 1[V8+ が必要]
と32ビットバイナリになっているのが確認できるし、make install 後に動作確認してみても一通り問題なく動作する。ちょっと怖いような気もするけどまぁ大丈夫であろう。

これでsennaが動作するようになったので、sennaのエンジンが使えるmysqlであるTritonnが利用できる。
この時点での最新版の安定バージョンのsennaは1.1.4であるが、この開発版のソースコードから作ったsennaはバージョン1.1.3とみなされ、最新版のTritonnではsennaのバージョンが古いと怒られるので、tritonn-1.0.10-mysql-5.0.51aを入れるとよい。

2009年04月20日

●神託が太陽を買う/沈まない太陽/MySqlが沈む太陽に見える

oraclebuysun.jpgちょっと前にIBMと買収交渉に入ったらしいと言う噂のあったSUNであるけど、とうとうオラクルが買ったらしい。
SUNのトップページにもでかでかと載っている。
なんというか、昔から憧れていた人がとうとう結婚しちゃったような感覚である。
オラクルってお硬く真面目なイメージがあったけど、そんなに儲かってたんやなぁ。と言うのに驚いた。

この間SUNがMySqlを買収したところやけど、そのSUNをオラクルが買収したって事でMySqlが目指していたエンタープライズ向けのDBMSの道は完全に閉ざされたことだろう。
ORACLEとMySqlはバーバリーとバーバリーブルーレーベルのような関係になったわけだが、そういえばORACLEがBerkeley DBを買ってから、MySQLやMovable TypeがBerkeley DBへのサポートを廃止したけど、MySqlの運命やこれ如何に。

ORACLEがSUNを買ったことで、SolarisはもちろんJAVAをオラクルに親和性の高い方向に誘導できるって事は、JAVA+DBMSなプラットフォームにORACLEを強烈に売込みができるようになるだろう。
環境としてのSolarisのOS、システムとしてのORACLEのDBMS、そしてインターフェイスやロジックとしてのJAVAをすべて傘下におくのは、製造から販売までを自社でするといった今時ではない方向性かもしれない。
それでも高い金を払ってもいいから、高信頼性を買いたいという場合にはとても魅力的に見えるだろう。
ORACLE、SUN、JAVAのブランド力ってのはやっぱり強力である。SolarisにOracleを乗せるってのは一昔前ならアルマーニを着てランボルギーニを運転するような金持ち感があったけど、これからのORACLE+SUNはエンタープライズ向けに注力してゆくのだろう。

個人的にはIBMがSUNを買うってのは、IBMがSUNから顧客を奪って潰すようなイメージがあったけど、OracleがSUNを買うのは相補的により高い目標を目指すところの方向が判りやすい気がする。
SUNの買収そのものが不可避なのであったら、IBMに買われるよりはよっぽど良かったように思う。
沈む太陽に見えたSUNがORACLEに買われてまた上ることを期待したい。

今までMySqlは仕事でサルのように使ってきて、SUNに買収された時はそこはかとなく嬉しかったのだが、MySqlが沈む夕日の様に見える今となっては、ちょっとOracleでも使ってみるかなと言う気になった。
これからはフリーSolarisにはOracleのフリー版のExpress Editionがプリインストールされることになるのか?それはちょっと楽しみである。

2009年03月31日

●solarisのパッケージコマンド

solarisのパッケージなコマンド一覧
pkgchkですべき所をpkginfoでやって何も見えないってのは、よくある罠。

カレントディレクトリのSUNWcsuからインストール
pkgadd -d . SUNWcsu

パッケージ一覧
pkginfo

SUNWcsuパッケージの詳しい情報
pkginfo -l SUNWcsu

SUNWcsuパッケージによってインストールされたファイル一覧
pkgchk -vn SUNWcsu

/usr/bin/lsをインストールしたパッケージを表示
pkgchk -lp /usr/bin/ls

2009年03月27日

●いつも使わないけど、無いと物足りないもの

OSの起動時にapache-tomcatを起動したい場合/etc/init.d/apache-tomcatなどのshスクリプトを書いて「bin/startup.sh」か「bin/catalina.sh start」のどちらかを呼ぶ事になるけど、「JAVA_OPTS」などの環境変数を設定した上で起動したい場合、「/etc/init.d/apache-tomcat」にJAVA_OPTS="-Xmx512M -Xms64M -Dfile.encoding=UTF-8"などと書いても適用されず、サーブレットがまともに動かない。
initスクリプトから呼んでいる「bin/startup.sh」にJAVA_OPTS="-Xmx512M -Xms64M -Dfile.encoding=UTF-8"と書いてもダメ。
わけがわからず数時間悩んだ挙句、「bin/startup.sh」は「bin/catalina.sh start」を呼んでいるだけであることに気づいた…
当然「bin/catalina.sh」にAVA_OPTS="-Xmx512M -Xms64M -Dfile.encoding=UTF-8"などと追加してやると当たり前のように動いた…

つまり、bashのシェル上で環境変数を設定した状態でshのシェルスクリプトを起動すると環境変数はそのスクリプトに渡るけど、shのシェル上から環境変数を設定してshスクリプトを起動しても環境変数は渡らない。
linuxの/bin/shは/bin/bashのシンボリックリンクなのでこの問題は起こらないはずであるが、Solarisにはホンマモノのshが入っているが故にこの問題が起こる。

いつもsolarisにログインするとすぐにbashやzshを起動してshを使うことなんかほとんどないけど、何かをコンパイルする時に変なLD_LIBRARY_PATHを設定していたおかげで思ったライブラリと違うライブラリにリンクしてしまうことはよくある。
シェルでどれだけ環境変数を設定していても、shスクリプトさえ介してやればunsetする必要がないのは、動作をちゃんとわかってさえいればとても便利な仕様である。
そういった環境変数汚染がないということも、shを使う意義として大きいだろう。

普段ほとんど使わないからと言ってLinuxのように/bin/bashへのリンクとなっているshは個人的にいただけない。
そういう意味でもホンマモノのshが入っているsolarisが好きなのである。
昔はダイナミックライブラリとリンクしている/bin/shとスタティックリンクですべて内蔵していた/sbin/shがあったけど、最近のsolarisは/bin/shが/sbin/shのシンボリックリンクとなり、/sbin/shがダイナミックリンクなバイナリになっていてやっぱり時代を感じる。
opensolarisに至っては/bin/shが/usr/gnu/bin/sh経由で/usr/bin/bashへのシンボリックリンクとなっておりがっくしである。

いつも使わないけどに、無いと物足りないもの。それはホンマモノのshである。

2009年03月26日

●SUN, SUN, lama asabthani

mysqlバインディングされたsennaが入ったシステムを作る必要があってsennaをコンパイルしていたのだが、solaris10 X86でちゃんとコンパイルして動作確認の取れているバージョンであるsennnaの1.0.5がsparcマシンで動作するようにコンパイルできないことが判明した。

二年前の情報でちと古いけど、開発者である未来検索ブラジルの中の人の話によれば、sourceforge.netが用意しているSparc用のコンパイルファームのサービス停止が決定したようで、二年前現在では開発のめどがたたなくなっていた状態であったらしい。

未来検索ブラジルの従業員の立場としては、
SPARC Solarisを用いた案件がないので、
実装の優先順位は低い状態のままです。

ということなので、試みに最近のソースをコンパイルしても通らないという事はもう対応されていないのかも。それとも私のコンパイルが悪いのか?
しかし、ソースツリー上の問題のある該当ヘッダファイルをどうにかすればどうにかなってsolaris10のsparcでコンパイルできたという情報もあるものの、とにかく既に二年前の段階でSparcアーキテクチャってのはマイナーになっているのだということを強く感じた。

最新のsun4vなT1-Sparcのマシンとx64マシンを最近触っているのだが、X64Solarisを触っていると「うぉーすげー早いー」と感心することが多いのだが、Sun4vなSolarisはディスクをミラーかつZFS rootな構成にしてるせいかもしれないが、特にそんなことは感じない。

とにかく「できん」では何ともならんので何とかせねばならんのだが、最新のSolaris 10はAMD64を中心に設計されているうえに、Sun自身もSpacよりもAMD64ベースの販売に力を入れているようで、開発元からすら疎んじられているSparcアーキテクチャに未来はあるのだろうかと不安になったのであった。
SUNはspacを見捨てたもうか?ラマ・サバクタニ。

2009年03月19日

●黒いボディに赤い突起を持ったヤツがSunを買う。らしい。

IBMがSun Microsystemsを買収する交渉を進めているという話があるらしく、Sun好きとしては「えぇーっ!」と言う感じである。
昔からIBMのサーバー(というかAIX)に良いイメージを持てない偏見があったのだが、それでもIBMが手がけていたThinkpadには昔から悪からぬ印象を持っており、最近その保守マニュアルの素晴らしさに惚れてからというもの、Thinkpadの設計思想に感服してIBMに好感を持ち始めたところである。

職場でもIBMのハードにSolarisを乗せてグリグリ動かしているし、家でもThinkpadにsolarisを入れて使っている。
もう完全に個人的な趣味であるが、ラップトップはIBMのThikpadが一番だし、X86のSolarisにIBMは結構似合うやねーと思い始めた。おまけに私が初めて買ってもらったパソコンがIBMのaptivaである。

しかし、あれだけ素晴らしかったThikpadを採算が取れないと言うことでブランドごと売り払ってしまうような会社だし、Sunを買収した暁にはSparcなど二束三文で売り払いそうな気がする。
IBMのイメージは黒いボディに毒々しく赤い突起である、とてもSunを窮地から救う白馬の騎士には見えないと思った、世の中の世知辛さを感じた日であった。

「fujitsu」ロゴのSparcは「不実」に見えてちょっとモッサいけど、もういっそ富士通がSun買えばいいと思うよ。
がんばれ富士通。とりあえずSparcだけでも…

2009年03月11日

●Solaris10 u6で大体止めるべきサービス/デーモン一覧

Solaris 10 10/08 u6でサーバー使いの場合に止めるべきサービス一覧はこんな感じ。
デフォルト状態だとXサーバーやフォントサーバーどころかATOKまで起動しているので、この状態から殆ど何も起動していない状態にする。

/etc/rc3.d/以下のもの、/etc/rc2.d/のもの、さらにSMFとinetdから起動されるもので一般的にいらないであろうものを書いてみる。
コピペして利用し易いように、コマンドにしておいた。

ランレベル3

# cd /etc/rc3.d
# mv S16boot.server _S16boot.serve
# mv S50apache _S50apache
# mv S52imq _S52imq
# mv S80mipagent S80mipagent
# mv S84appserv _S84appserv
# mv S84patchserver_S84patchserver

ランレベル2のもの

# cd /etc/rc2.d
# mv S47pppd _S47pppd
# mv S70uucp _S70uucp
# mv S90loc.ja.cssd _S90loc.ja.cssd
# mv S98deallocate _S98deallocate
# mv S73cachefs.daemon _S73cachefs.daemon

SMFで起動されるもの

名前解決キャッシュ
# svcadm disable svc:/system/name-service-cache:default
電源管理
# svcadm disable svc:/system/power:default

finger/login/rsh
# svcadm disable svc:/network/finger:default
# svcadm disable svc:/network/login:rlogin
# svcadm disable svc:/network/shell:default

nfs関連
# svcadm disable svc:/network/nfs/client:default
# svcadm disable svc:/network/nfs/rquota:default
# svcadm disable svc:/network/nfs/nlockmgr:default
# svcadm disable svc:/network/nfs/status:default

rpc
# svcadm disable svc:/network/rpc/gss:default
# svcadm disable svc:/network/rpc/smserver:default
# svcadm disable svc:/network/rpc/rstat:default
# svcadm disable svc:/network/rpc/rusers:default

Xwindow
# svcadm disable svc:/application/graphical-login/cde-login
# svcadm disable svc:/application/management/wbem:default
# svcadm disable svc:/system/webconsole:console

autofs/ボリューム管理
# svcadm disable svc:/system/filesystem/autofs:default
# svcadm disable svc:/system/filesystem/volfs:default

snmpd
# svcadm disable snmpdx
# svcadm disable sma
# svcadm disable dmi


inetdから起動されるもの

Xwindow
# inetadm -d xfs
# inetadm -d stfsloader
# inetadm -d cde-calendar-manager
# inetadm -d cde-ttdbserver
# inetadm -d cde-spc

security
# inetadm -d ktkt_warn

network
# inetadm -d stdiscover
# inetadm -d stlisten
# inetadm -d rpc_ticotsord


実際はこんな感じ。一旦この状態にしてから、必要なものを上げてゆく。


svcadm disable svc:/application/cde-printinfo:default
svcadm disable svc:/application/database/postgresql:version_81
svcadm disable svc:/application/database/postgresql:version_82
svcadm disable svc:/application/database/postgresql:version_82_64bit
svcadm disable svc:/application/database/postgresql_83:default_32bit
svcadm disable svc:/application/database/postgresql_83:default_64bit
svcadm disable svc:/application/font/fc-cache:default
svcadm disable svc:/application/font/stfsloader:default
svcadm disable svc:/application/gdm2-login:default
svcadm disable svc:/application/graphical-login/cde-login:default
svcadm disable svc:/application/management/sma:default
svcadm disable svc:/application/management/snmpdx:default
svcadm disable svc:/application/management/wbem:default
svcadm disable svc:/application/management/webmin:default
svcadm disable svc:/application/print/ppd-cache-update:default
svcadm disable svc:/application/print/server:default
svcadm disable svc:/application/wnn8/server:default
svcadm disable svc:/application/x11/xfs:default
svcadm disable svc:/application/x11/xvnc-inetd:default
svcadm disable svc:/network/apocd/udp:default
svcadm disable svc:/network/cde-spc:default
svcadm disable svc:/network/chargen:dgram
svcadm disable svc:/network/chargen:stream
svcadm disable svc:/network/comsat:default
svcadm disable svc:/network/daytime:dgram
svcadm disable svc:/network/daytime:stream
svcadm disable svc:/network/dhcp-server:default
svcadm disable svc:/network/discard:dgram
svcadm disable svc:/network/discard:stream
svcadm disable svc:/network/dns/client:default
svcadm disable svc:/network/dns/server:default
svcadm disable svc:/network/echo:dgram
svcadm disable svc:/network/echo:stream
svcadm disable svc:/network/finger:default
svcadm disable svc:/network/ftp/tcp:default
svcadm disable svc:/network/ftp:default
svcadm disable svc:/network/inetd-upgrade:default
svcadm disable svc:/network/ipfilter:default
svcadm disable svc:/network/ipmievd:default
svcadm disable svc:/network/ipv4-forwarding:default
svcadm disable svc:/network/ipv6-forwarding:default
svcadm disable svc:/network/ldap/client:default
svcadm disable svc:/network/login:eklogin
svcadm disable svc:/network/login:klogin
svcadm disable svc:/network/login:rlogin
svcadm disable svc:/network/nfs/cbd:default
svcadm disable svc:/network/nfs/client:default
svcadm disable svc:/network/nfs/mapid:default
svcadm disable svc:/network/nfs/nlockmgr:default
svcadm disable svc:/network/nfs/rquota:default
svcadm disable svc:/network/nfs/server:default
svcadm disable svc:/network/nfs/status:default
svcadm disable svc:/network/nis/client:default
svcadm disable svc:/network/nis/passwd:default
svcadm disable svc:/network/nis/server:default
svcadm disable svc:/network/nis/update:default
svcadm disable svc:/network/nis/xfr:default
svcadm disable svc:/network/ntp:default
svcadm disable svc:/network/rarp:default
svcadm disable svc:/network/rexec:default
svcadm disable svc:/network/routing/bgp:quagga
svcadm disable svc:/network/routing/legacy-routing:ipv4
svcadm disable svc:/network/routing/legacy-routing:ipv6
svcadm disable svc:/network/routing/ndp:default
svcadm disable svc:/network/routing/ospf6:quagga
svcadm disable svc:/network/routing/ospf:quagga
svcadm disable svc:/network/routing/rdisc:default
svcadm disable svc:/network/routing/rip:quagga
svcadm disable svc:/network/routing/ripng:default
svcadm disable svc:/network/routing/ripng:quagga
svcadm disable svc:/network/routing/route:default
svcadm disable svc:/network/routing/zebra:quagga
svcadm disable svc:/network/rpc-100235_1/rpc_ticotsord:default
svcadm disable svc:/network/rpc/bootparams:default
svcadm disable svc:/network/rpc/cde-calendar-manager:default
svcadm disable svc:/network/rpc/cde-ttdbserver:tcp
svcadm disable svc:/network/rpc/gss:default
svcadm disable svc:/network/rpc/keyserv:default
svcadm disable svc:/network/rpc/nisplus:default
svcadm disable svc:/network/rpc/ocfserv:default
svcadm disable svc:/network/rpc/rex:default
svcadm disable svc:/network/rpc/rstat:default
svcadm disable svc:/network/rpc/rusers:default
svcadm disable svc:/network/rpc/smserver:default
svcadm disable svc:/network/rpc/spray:default
svcadm disable svc:/network/rpc/wall:default
svcadm disable svc:/network/samba:default
svcadm disable svc:/network/security/kadmin:default
svcadm disable svc:/network/security/krb5_prop:default
svcadm disable svc:/network/security/krb5kdc:default
svcadm disable svc:/network/shell:default
svcadm disable svc:/network/shell:kshell
svcadm disable svc:/network/slp:default
svcadm disable svc:/network/stdiscover:default
svcadm disable svc:/network/stlisten:default
svcadm disable svc:/network/swat:default
svcadm disable svc:/network/talk:default
svcadm disable svc:/network/time:dgram
svcadm disable svc:/network/time:stream
svcadm disable svc:/network/tname:default
svcadm disable svc:/network/uucp:default
svcadm disable svc:/network/winbind:default
svcadm disable svc:/network/wins:default
svcadm disable svc:/system/auditd:default
svcadm disable svc:/system/consadm:default
svcadm disable svc:/system/device/mpxio-upgrade:default
svcadm disable svc:/system/filesystem/autofs:default
svcadm disable svc:/system/filesystem/volfs:default
svcadm disable svc:/system/patch-finish:delete
svcadm disable svc:/system/rcap:default
svcadm disable svc:/system/sar:default
svcadm disable svc:/system/tsol-zones:default
svcadm disable svc:/system/webconsole:console

2009年03月09日

●solarisでCHAP 認証つきのiSCSIターゲットをZFSで作る

前に買ったノートPCのディスク容量が少ないので、家にいる間は家庭内サーバーのSolarisからiSCSIディスクをマウントして使っている。

SolarisでiSCSIターゲットを使う方法はネット上に結構沢山の情報があるのだが、実際の使用というよりもテストを想定して書かれたドキュメントが多く、私が探した限りマウントの際に認証をかける方法は見つからなかった。

ということで、solarisで認証つきのISCSIターゲットを構成し、WindowsクライアントをISCSIイニシエーターとして利用する方法を書いてみる。

概要:
とりあえずWindows XP にMicrosoft iSCSI initiatorが入っているのを前提に、
SolarisのストレージプールからZFSボリュームを割り当て、そのボリュームをiSCSIターゲットとして公開し、iSCSIイニシエーターのノード名とCHAP認証でアクセス制限をかける。
ところを書いてみる。

iscsitgtデーモンの動作確認

# svcs -a|grep iscsitgt
disable 14:22:20 svc:/system/iscsitgt:default

動いてなけれれば動かしてやる
# svcadm enable iscsitgt
# svcs -a|grep iscsitgt
online 14:22:20 svc:/system/iscsitgt:default

なければDVDから追加

# cd /cdrom/sol_10_1008_x86/Solaris_10/Product/
# /usr/sbin/pkgadd -d . SUNWiscsitgtu SUNWiscsitgtr
SUNWiscsitgtr SUNWiscsitgtrの二つのパッケージが必要
# pkginfo |grep iscsitgt
system SUNWiscsitgtr Sun iSCSI Target (Root)
system SUNWiscsitgtu Sun iSCSI Target (Usr)

ZFSで利用するストレージプールの作成

Solaris10 u6 10/08以上だとインストール時にrootファイルシステムをZFSにすることができるが、その場合はすでにストレージプールがあるので、あえて作る必要はない。
ZFSrootがある場合、ストレージプールがあることを確認
rpoolなるストレージプールがあるのを確認。
# zpool list
NAME SIZE USED AVAIL CAP HEALTH ALTROOT
rpool 27.8G 4.63G 23.1G 16% ONLINE -

ZFSのプール元とマウント先のリストはこんな感じ
# zfs list
NAME USED AVAIL REFER MOUNTPOINT
rpool 4.85G 22.5G 46K /rpool
rpool/ROOT 3.86G 22.5G 18K legacy
rpool/ROOT/s10x_u6wos_07b 3.86G 22.5G 3.86G /
rpool/dump 496M 22.5G 496M -
rpool/export 43K 22.5G 21K /export
rpool/export/home 22K 22.5G 22K /export/home
rpool/swap 512M 22.7G 291M -

プールがひとつもない人はとりあえず作ってみる、4ギガのファイルをストレージプールとする。
# mkfile 4g /export/pool.iscsi.4g
# zpool create rpool /export/pool.iscsi.4g


iSCSI Target が Initiator に提供する領域の管理に使われるbacking store ディレクトリを指定する。
/export/iscsiに作る場合、mkdir /export/iscsiなどとしてディレクトリを作ればいいのだが、
rpool/iscsi/以下にTargetを作る予定なので、rpool/iscsiとプールを作り、それを/export/iscsiとしてZFSでファイルシステムとしてマウントして割り当ててみる。

プールを作る
# zfs create rpool/iscsi

rpool/iscsiがあるのを確認
# zfs list|grep iscsi
rpool/iscsi 18K 22.5G 18K /rpool/iscsi

デフォルトではrpool/iscsiは/rpool/iscsiにマウントされているのでこれを/export/iscsiにマウントしなおす
# zfs set mountpoint=/export/iscsi rpool/iscsi

rpool/iscsi が /export/iscsiにマウントされているのを確認
# zfs list|grep iscsi
rpool/iscsi 18K 22.5G 18K /export/iscsi

ディレクトリができたので、これをiSCSI backing storeディレクトリとして指定する。
# iscsitadm modify admin -d /export/iscsi/

Base Directoryが /export/iscsi になっているのを確認
# iscsitadm show admin
iscsitadm:
Base Directory: /export/iscsi
CHAP Name: Not set
RADIUS Access: Not set
RADIUS Server: Not set
iSNS Access: Not set
iSNS Server: Not set
Fast Write ACK: Not set

ストレージプールから、2ギガのemulated volumeであるrpool/iscsi/vol1 を作る。このボリュームがISCSIで提供されるディスクになる

# zfs create -V 2gb rpool/iscsi/vol1
ちゃんとできたか確認
# zfs list|grep rpool/iscsi
rpool/iscsi 2.00G 20.5G 18K /export/iscsi
rpool/iscsi/vol1 2G 22.5G 16K -

typeがvolumeになっていないとiSCSI Targetにならないので注意
# zfs get all rpool/iscsi/vol1|grep type
rpool/iscsi/vol1 type volume -

プール上にZFSで作ったボリューム rpool/iscsi/vol1をISCSIターゲットとして共有する。

# zfs set shareiscsi=on rpool/iscsi/vol1
確認する。Statusがonlineになっていればよい。
# iscsitadm list target -v
Target: rpool/iscsi/vol1
iSCSI Name: iqn.1986-03.com.sun:02:f4bbec4f-22aa-ed01-a19c-d077c5826e05
Alias: rpool/iscsi/vol1
Connections: 0
ACL list:
TPGT list:
LUN information:
LUN: 0
GUID: 0x0
VID: SUN
PID: SOLARIS
Type: disk
Size: 2.0G
Backing store: /dev/zvol/rdsk/rpool/iscsi/vol1
Status: online

この状態ですでにiscsi target になってっているので誰にでも公開する場合はこのままでよいが、一応特定イニシエーターのみに対してユーザー名とパスワードのセットで認証するchap認証をつけてみる。

まず自ホストのchap usernameを設定、ホスト名にしておく
# iscsitadm modify admin -H zfstest
自ホストのchapシークレットを設定 12から16文字の間らしい
# iscsitadm modify admin -C
Enter secret: xxxxxx
Re-enter secret: xxxxxx

イニシエータオブジェクトをノード名を指定して作成、iqn.1991-05.com.microsoft:client1をclient1として扱う
# iscsitadm create initiator -n iqn.1991-05.com.microsoft:client1 client1

rpool/iscsi/vol1のアクセスリストに イニシエーターオブジェクトclient1を追加
#iscsitadm modify target -l client1 rpool/iscsi/vol1

この時点でiqn.1991-05.com.microsoft:client1にしかrpool/iscsi/vol1が見えなくなっているが、さらにchap認証を追加する場合は以下を実行する

イニシエータオブジェクトに対してchapユーザー名を指定 ユーザー名はiqn.1991-05.com.microsoft:client1
# iscsitadm modify initiator -H iqn.1991-05.com.microsoft:client1 client1

イニシエータオブジェクトに対してchapパスフレーズを指定
# iscsitadm modify initiator -C client1

これでTarget rpool/iscsi/vol1がイニシエーターノード名iqn.1991-05.com.microsoft:client1 からchapユーザー名iqn.1991-05.com.microsoft:client1 とchapパスフレーズを使って利用できる。


という感じでSolarisでiSCSIターゲットを利用することが出来るようになったけど、もうこれを利用しない場合などでボリュームやターゲットを削除したい場合は以下のコマンドを実行して消す。

ボリューム削除
# zfs destroy rpool/iscsi/vol1

Target削除
#iscsitadm delete target -u [削除したいlun番号] [ターゲット名]


という感じ。


2009年01月21日

●Solaris10の無線LANで WPA2-PSK/TKIPのアクセスポイントに接続する

この間Thinkpad X40を買って、そこにSolaris10 u6をインストールして、家にあるWPA2-PSKな無線LANに接続しようとしてネット上で情報収集したのだが、solarisで無線LANを使う場合に、共通キーでWEP認証し、通信に暗号化なしで利用する場合の設定はネット上を探せば結構載っているのやけど、WPAやWPA2認証を利用して、AESかTKIPを利用した場合の設定の仕方が全く載ってない。
私の探した限り日本語での情報は皆無であるような気がする。
solaris用の無線LANカードの配布元である、OpenSolarisのLaptopコミュニティで、wpa認証とTKIP/AES暗号化を実現する「wpa_supplicant」なるパッケージのページで手順は説明されてはいるのやけど、私なりにまとめてみた。

Thinkpad X40上のsolaris10 x86 u6 10/08で、mini-PCIのAtheros AR5BMB-44の無線LANカードを使い、認証にWPAパスフレーズでWPA2、暗号化にTKIP、DHCPサーバーからアドレスをもらう場合の設定を書いてみる。
いわゆるWPA2-PSK / AESというやつである。

ただし、ath0として認識するAtheros系のカードしかwpaで使えないらしい。私の場合はThinkpad X40に対応したIEEE802.1/gなmini-PCIのカードを買ったのでこれに該当した。

必須パッケージ:
ath driver: 入手先:OpenSolaris Laptopコミュニティー Solaris10ではバージョン0.5でしか動かない。
wpa_supplicant :入手先:OpenSolaris Laptopコミュニティー
wificonfig :入手先:OpenSolaris Laptopコミュニティー
Inetmenu :入手先:OpenSolaris Laptopコミュニティー
SUNWcryパッケージ(Solaris 10 Encryption Kit): 入手先:SUNダウンロードセンター

動作概要は、WPA/WPA2認証とTKIP/AES暗号化を実装するための核であるwpa_supplicantがデーモンとしてバックグラウンドで動き、wificonfigでしかるべきパラーメータを渡して、ath0で認識したNICをwpa_supplicantデーモン経由でアクセスポイントに接続する。(データリンク層なイメージ?)
接続が完了したらinetmenuでDHCPサーバーからアドレスをもらい、ネットワークの設定を完了する。
といったとろ。ただし、このwpa_supplicantデーモンはath0ドライバでしか動作しない。
Solaris 10 Encryption KitのSUNWcryは接続後にDHCPサーバーからアドレスをもらって通信する際に必要な暗号化キットであるということだ。本来ならSolarsiに入れておけばいいのやろうけど、暗号化技術の輸出規制のからみにより、ユーザーがー自分で導入する必要があるようである。

手順:

#wificonfig createprofile AP-WPA2-PSK-TKIP essid=SSID名 psk=パスフレーズ pairwise=TKIP group=TKIP proto=RSN
##まず、wificonfigで接続プロファイルを作っておく、プロファイル名は「AP-WPA2-PSK-TKIP」としておく。SSID名、PSKパスフレーズ、暗号化方式にTKIP、認証方式にRSN(WPA2)を指定している。
##一度プロファイルを作っておけば、次回からこのコマンドを入力することなくプロファイル名を利用できる。

##wpa_supplicantデーモンの起動 インターフェイス名を指定
#/usr/sbin/wpa_supplicant -i ath0
##デバッグモードでフォアグラウンドで動作させるには/usr/sbin/wpa_supplicant -i ath0 -dd -Fとする

##アクセスポイントに接続
#/usr/sbin/wificonfig -i ath0 connect AP-WPA2-PSK-TKIP
##「/usr/sbin/wificonfig: connecting to profile 'AP-WPA2-PSK-TKIP'」と表示されれば接続は完了

##ネットワークに接続
#/usr/bin/inetmenu -W KARM -i ath0 -p DHCP
##ifconfig ath0 plumb && ifconfig ath0 dhcp でもよいが、こちらはDNSの設定をしてくれないのでinetmenuを利用した。inetmenuはplumbもしてくれる。

上でwificonfigに必要そうなパラメーターを指定しているけど、基本的にはpskとssidの指定だけで、wpa_supplicantデーモンがアクセスポイントの認証方式と暗号化方式を自動的に認識して接続してくれる。
アクセスポイントがミックスモードで動作している場合、wpa_supplicantはAES>TKIPという優先順位で接続にいくようだ。
しかしながら、AES暗号化のアクセスポイントに接続しようとすると、wificonfigのメッセージでは正常に接続されたようでもいつまでたっても接続が完了しない。
wpa_supplicantをデバッグモードで動かしていると

WPA: Failed to set PTK to the driver.
wpa_supplicant_process_3_of_4: key_info=1ca gtk=0
なるログを延々と吐き続けているのが見える。
このあたりはwpa_supplicantがバージョンアップされて解消されるのを待つしかないのだろうか。

2009年01月19日

●SolarisでのCtrlとCapsLockキーがらみの設定

家ではAの横にCtrlがあるSunのType6とHHKのキーボードを使っており、猛烈にコマンドを打つ場合にAの隣のCtrlを押す癖がついているので、Aの横がCaps Lockになっているキーボードはついつい勢いで押し間違えてしまうことが多い。

と言うことで、Solarisをリモートから使う分には全く問題ないけど、ノートPCにクライアントとしてセットアップして使う場合に左CtrlとCapsLockキーを入れ替えたりCapsLockをCtrlキーにしたくなる場合がある。
一般的にこういった場合はCapsLockと左Ctrlを入れ替えて使う人が多いのだが、私はCapsLockを使うことが全く無いので、左CtrlとCapsLockを入れ替えずに、CapsLockをCtrlキーとして使っている。左Ctrlを押しても、CapsLockを押してもCtrlと言うわけである。
で、毎回ノートPCにセットアップするたびに検索してるので書いておく。

コンソール画面と、X上でそれぞれ違うシステムでキーボードマップを実現しているので、それぞれの設定が必要になってくる。

コンソール:キーテーブルを直接編集する
USキーボードなら/usr/share/lib/keytables/type_6/usに、
日本語キーボードなら/usr/share/lib/keytables/type_6/japan
に以下のコードを追加する。

#Caps Lockキーをctrlにする
key 57 all shiftkeys+leftctrl up shiftkeys+leftctrl
#左ctrlキーをCapsLockにする場合
#key 224 all shiftkeys+capslock

日本語キーボードならtype_6/japanと直感的にわかるけど、USキーボードだからと言って /usr/share/lib/keytables/type_101/usに設定してしまうとややこしいことになる。

X(ユーザーごと):xmodmapコマンドでの実装
ログイン時に自動実行された~/dtprofile スクリプトからxmodmapコマンドがrcファイルを読み込ませて呼ばれる
~/.xmodmaprc

!Caps Lockキーをctrlにする
remove Lock = Caps_Lock
keysym Control_L = Caps_Lock
add Lock = Caps_Lock
!左ctrlキーをCapsLockにする場合
!remove Control = Control_L
!keysym Caps_Lock = Control_L
!add Control = Control_L

~/.dtprofile

# swap ctrl and caps lock key
if [ -f ~/.xmodmaprc ] ; then
/usr/openwin/bin/xmodmap ~/.xmodmaprc
fi

2008年12月03日

●RC版はRC版です。(ISC DHCPの4.1.0rc1の不具合)

土偶家のネットワークは繋いできたPCに対してDHCPサーバーからIPアドレスを割当てるようになっているのだが、新しく作ったサーバーでコンパイルしたdhcpdがまともに動いていなかったことに気づいた。
デーモン自体は特に問題なさそうに起動しているものの、クライアントを変えても、confを変えても駄目。
エラーログを吐くでもなく、パニックして落ちるでもなく、クライアントはアドレスをもらえない。
dhcpd -f -d でフォアグラウンドで起動しつつ、ログをファイルでなく標準エラー出力に出すように設定してデバッグするも特に怪しいところは見つからない。
一応クライアントが繋ぎに来ると

Dec 3 00:22:39 サーバーホスト名 dhcpd: [ID 702911 daemon.info] DHCPDISCOVER from 00:80:45:XX:XX:cd via dmfe0
Dec 3 00:22:40 サーバーホスト名 dhcpd: [ID 702911 daemon.info] DHCPOFFER on 192.168.X.xxx to 00:80:45:XX:XX:cd (クライアントホスト名) via dmfe0

と応答しているっぽいのだが、クライントPCのIPアドレスは更新されない。なんでやねん。
わかりにくさという点で一番性質の悪い不具合である。

数日考えに考えたけど全くわからない。
ということで、試しに、枯れに枯れてバグとセキュリティフィックスしかされないことが宣言されている古いバージョンをコンパイルして、生成されたdhcpdだけをコピーして動作させてみると、まともに動くではないか。
ちゃんとIPアドレスも割当てられ、DNSにも登録された。
ちなみに動かなかったのはisc-dhcpのバージョン4.1.0rc1で、動いたのはバージョン3.0.7である。
動かなかった4.1.0rc1はrc版ということで不具合があるかもという位置づけやけど、ここまで動かないのは珍しいのではないだろうか?

と言うことで、正常に動作するときのログはこんな感じ。

Dec 3 00:48:52 サーバーホスト名 dhcpd: [ID 702911 daemon.info] DHCPDISCOVER from 00:80:45:XX:XX:cd via dmfe0
Dec 3 00:48:53 サーバーホスト名 dhcpd: [ID 702911 daemon.info] DHCPOFFER on 192.168.X.xxx to 00:80:45:XX:XX:cd (クライアントホスト名) via dmfe0
Dec 3 00:48:53 サーバーホスト名 dhcpd: [ID 702911 daemon.info] DHCPREQUEST for 192.168.X.xxx (192.168.Y.yyy) from 00:80:45:XX:XX:cd (クライアントホスト名) via dmfe0
Dec 3 00:48:53 サーバーホスト名 dhcpd: [ID 702911 daemon.info] DHCPACK on 192.168.X.xxx to 00:80:45:XX:XX:cd (クライアントホスト名) via dmfe0

動作しないときのログと、動作するときのログの違いを見る限り、クライアントからの要求であるDHCPREQUESTがサーバーに届いていないようだ。
調べてみるとこのDHCPREQUESTはブロードキャストで送られるらしく、クライアントがパケットを送っていないというのは考えにくいので、サーバーがブロードキャストのパケットを受け取っていないということになりそうだ。

家のDHCPサーバーになっている新ソラリス君は物理NICが二つ搭載されており、一方がもうひとつのフェイルオーバーとして動作する設定にしているので、二つの物理NICでIPアドレスが三つ、更にsolarisコンテナ内の一つのゾーンにIPアドレスが二つ割り当ててあるので、合計5つのIPアドレスが割当てられた仮想NICが動いているという微妙に複雑な構成になっている。
dhcpdのデバッグ中にこの仮想NICの一つを待ち受けインターフェイスにしようとしてもならず、物理NICでしか待ち受け出来なかったので、恐らく、DHCPサーバーの待ち受けていない仮想NICが一番にブロードキャストを受け取ってしまったりするような類の問題が起こっているのだろう。

と言うことで、フェイルオーバー動作、solarisコンテナを使っている場合のDHCPサーバー作りには注意である。

しかしこの顛末で、やっぱりベータ版とかrc版てのはあくまでテスト版やねんから、ちゃんと使うには向いてないことを改めて痛感したのであった。

2008年11月27日

●apache1.3にmysql認証を追加

apacheでのユーザー認証と言えばBasic認証かDigest認証やけど、仮想ユーザー統一の一環として、
ベーシック認証の問合せ先をパスワードファイルだけではなく、mysqlも参照出来るようにしてみた。

作業としてはapache1系mod_auth_mysqlを追加するという事になる。

CFLAGS="-native -mt -fast" ./configure --enable-rule=SHARED_CORE --enable-module=so --prefix=/usr/local/apache --enable-module=auth_digest --enable-module=digest

ってな感じコンパイルされているapacheに、モジュールとしてmod_auth_mysqlを組み込む
mod_auth_mysqlのソースディレクトリで、
/uasr/local/apache/bin/apxs -c -L/usr/local/mysql/lib/mysql -R/usr/local/mysql/lib/mysql -I/usr/local/mysql/include/mysql -lmysqlclient -lm -lz mod_auth_mysql.c

と直接mod_auth_mysql.cをコンパイルするとmod_auth_mysql.soが生成されるので、
sudo /uasr/local/apache/bin/apxs -i mod_auth_mysql.so
でファイルがコピーされる。

confには


LoadModule mysql_auth_module libexec/mod_auth_mysql.so
AddModule mod_auth_mysql.c
#モジュールを読み込む


<Directory /export/web/hogehoge >
AuthMySQLEnable On
 AuthName "enter username and password"
 AuthType Basic
 AuthMySQLHost ホスト名
 AuthMySQLDB DB名
 AuthMySQLUser 接続ユーザー
 AuthMySQLPassword パスワード
 AuthMySQLUserTable テーブル
 AuthMySQLNameField username
 AuthMySQLPasswordField password
 AuthMySQLPwEncryption crypt
 AuthMySQLUserCondition mailuse='1'
 require valid-user
#SELECT username,password FROM DB名.テーブル WHERE mailuse='1';
#と展開され、
#入力されたユーザー名とパスワードと照合される。

</directory>


と書けば/export/web/hogehogeはmysqlによるbaseic認証となる。
当然、AllowOverrideでAuthConfigが許可されているディレクトリでは、.htaccessとかにも書いてもよい。

2008年11月25日

●postfix 2.5.5 dovecotでsmtp-auth + mysqlによる仮想ユーザー運用

先日cyrus-SASLによるSMTP-AUTHとSMTP/TLS対応のpostfixを作ったが、これをsmtp-authにdovecoのSASLを利用し、仮想ユーザーの参照元をmsqlにするためにコンパイルしなおした。

ネット上に色々情報があるけど、一番参考になったのは、やっぱり本家のドキュメント
Cyrus-SASL対応と比べてDovecotのSASLの良い点は、Cyrusの場合はpostfixのバイナリにCyrusのライブラリをリンクさせる必要があるけど、Dovecotは認証に専用のデーモンプロセスを使うのでコンパイル時にフラグを一つ追加するだけで済む事である。
たしかにヘッダとライブラリ検索パスを指定しつつフラグも追加するよりはエレガントで、かつライブラリをリンクしないと言う事はリンク先のライブラリのバグを取りこむ可能性が一つ減ったという事も言えるのであろう。

以下で、Dovecot-SASLとMysql、SMTP/TLS対応のバイナリのコンパイル、設定の手順、いくつかの注意点を書いてみる。
例の如く、Solaris10 U6 spac版にgccを使わずSun Studio 12のコンパイラでの実装である。

C++のコンパイルオプションで、最適化オプションに-fast -native -mt 、ヘッダ検索パス、SASL対応と、TLS対応、Mysql対応を指定、
外部ライブラリの検索パスとランパス、TLSとmysqlのリンカオプションを指定、


export CCARGS="-fast -native -mt -DUSE_SASL_AUTH -I/usr/sfw/include -DUSE_TLS -DHAS_MYSQL -I/usr/local/mysql/include/mysql"
export AUXLIBS="-L/usr/sfw/lib -R/usr/sfw/lib -L/usr/lib -R/usr/lib -L/opt/sfw/lib -R/opt/sfw/lib-lssl -lcrypto -L/usr/local/mysql/lib/mysql -R/usr/local/mysql/lib/mysql -lz -lm -lmysqlclient"
dmake makefiles
dmake

ドキュメントでは、「-DDEF_SERVER_SASL_TYPE=\"dovecot\"」を指定するとデフォルトでDovecotが使われると書いてあったけど、土偶の環境ではmake時にエラーで止まったので、コンパイラオプションで指定せず、後からconfで指定した。

以下でconfの重要な部分を書く。
ローカルへのメール配信は、実ユーザーが存在しなければmysqlに問い合わせる。
外部へのリレー要請ではSMTP認証でdovectに問い合わせを行い、認証されればリレー許可する。
SMTP認証とローカル配信対象リストは全く別物であるところに注意である。まぁ当たり前か。

main.cf


smtpd_sasl_type = dovecot
#SASLにDovecotを

smtpd_sasl_path = private/auth
# dovecotと通信するソケットの指定、dovect.confのsocket listenの位置を書く。
# ドキュメントに則ってスプールからの相対パスで書いた。

smtpd_sasl_security_options = noanonymous
#anonymouse接続を拒否

smtpd_recipient_restrictions = permit_sasl_authenticated, permit_mynetworks,check_relay_domains
#外部へリレー許可するリスト、permit_sasl_authenticatedがSMTP-AUTHで許可されたものとなる

local_recipient_maps = $virtual_mailbox_maps unix:passwd.byname
#ローカル受信者の検索テーブルの指定
#仮想メールボックス、実ユーザーの順で書いた。

fallback_transport = virtual
#存在しないローカルアドレスへのリレー要請をvirtualに
#local_recipient_mapsで指定してるからいらんかも

#以下で仮想ユーザ(メールボックス)の指定
#それぞれファイルを指定して、ファイル内でDBとクエリを指定する。
virtual_mailbox_base = /
virtual_mailbox_maps = mysql:/etc/postfix/virtual-account.cf
virtual_uid_maps = mysql:/etc/postfix/virtual-uid.cf
virtual_gid_maps = mysql:/etc/postfix/virtual-gid.cf

以下からmysqlへの問い合わせの設定、詳しい書式はこの本家のドキュメントを参照されたし。
virtual-account.cf


hosts = ホスト名
user = 接続ユーザー
password = パスワード
dbname = DB名
table = テーブル

#以下の三つの項目は、
#user@domain.comへと配信要求が来た場合、
#SELECT CONCAT(mailrootdir,"/Maildir/") FROM DB名.テーブル WHERE username="user" and mailuse='1' ;
#と展開される

select_field = CONCAT(mailrootdir,"/Maildir/")
#メール配信先を指定する、SQL文concatで文字列を結合し、/home/user/Maildir/などと展開される。
#最後に/をつけるとMaildir形式、スラッシュ無しだとmailbox形式になる、微妙にはまった。

where_field = username
additional_conditions = and mailuse='1'


virtual-uid.cf


hosts = ホスト名
user = 接続ユーザー
password = パスワード
dbname = DB名
table = テーブル

#以下の三つの項目は、
#user@domain.comへと配信要求が来た場合該当メールボックスにUIDを設定するために使われるようである、
#SELECT uid FROM DB名.テーブル WHERE username="user" and mailuse='1' ;
#と展開される
select_field = uid
where_field = username
additional_conditions = and mailuse='1'

virtual-gid.cfは略。
とこんな感じで、dovectと同じテーブルを読み、メール環境が統合できる。

2008年11月24日

●mysql対応、openssl対応のDovecotのコンパイル@Sun Studio 12@Solaris10 U6 spac

MTAであるpostfixがsmtp認証を実現するための外部機能として、以前まではCyrus SASLを選択するしかなかったのだが、バージョン2.3からDovecot SASLなるものに対応していることを最近知った。

ということで、その時初めて知ったDovecotについて調べてみると、どうやら単なる認証機能を提供するSASLではなく、pop3とimapを提供するMDAであるらしい。
ユーザーデーターベースとして、UNIXシステムの実ユーザーに対する認証からpam、LDAP、Mysqlなどに対応し、それらの複数を同時に実装できるのが何よりも良い感じである。
メジャーで事実上標準的なMDAであるQpopperとかCourier-IMAPより歴史的には浅いけど、Postfixと連携させて使うことを前提に、しかも実ユーザーでなく、仮想ユーザーでの運用も追加して考えれば良い選択であろう。

これでメールサーバーのMTAの部分とMDAの部分が実ユーザーだけでなくMysql上のDBにある仮想ユーザーも加えて運用させることができた。

以下でSolaris10 U6 spac版にgccを使わずSun Studio 12のコンパイラで実装した手順を書いてみる。

コンパイラオプションで最適化コードとヘッダ、ライブラリ検索パスとランパスを指定、
コンフィグオプションは以下の通り、
mysqlサポート、opensslサポートを追加、それぞれ/usr/local/mysql/ /usr/sfw/にインストールされているものとする。


export CFLAGS="-native -mt"
export CPPFLAGS="-I/usr/sfw/include/openssl -I/usr/local/mysql/include/mysql"
export LDFLAGS="-L/usr/local/mysql/lib/mysql -L/usr/sfw/lib -R/usr/local/mysql/lib/mysql -R/usr/sfw/lib"

./configure --prefix=/usr/local/dovecot --with-mysql --with-ssl=openssl --disable-ipv6 && dmake


普段、土偶はSUNのC++の最適化オプションは「-native -mt -fast」を利用しているが、コンパイラオプションに「-fast」をつけると、コンパイルは通るものの、出来たバイナリはpop接続すると

Nov xx xx:32:55 host dovecot: [ID 762087 mail.info] Dovecot v1.1.6 starting up
Nov x xx:32:55 host dovecot: [ID 107833 mail.crit] Panic: file istream.c: line 84: assertion failed: (stream->eof)
Nov xx xx:32:55 host dovecot: [ID 398108 mail.error] Raw backtrace: 0x26894 -> 0x29a94 -> 0x3111c -> 0x2f2f0 -> 0x27a24 -> 0x27b24
-> 0x22c64 -> 0x22ebc -> 0x1f02c -> 0x15a88

って感じのエラーを吐いて落ちてしまう。
SUNのドキュメントには「IEEE 標準の浮動小数点演算を使用しているプログラムには、-fast を指定しないでください。計算結果が違ったり、プログラムが途中で終了する、あるいは予期しない SIGFPE シグナルが発生する可能性があります。」って書いてあるのでそれだろうか?
RSA暗号の強度は因数分解の難しさがである上に、複合化するにはガウスの時計計算機とフェルマーの小定理を使うので計算結果が狂うということだろうか?とにかく-fastオプションでなく、-native -mtオプションだけだとちゃんと動作した。

で、confファイルはこんな感じのものが認証に関わる部分、
dovecot.conf


mail_location = maildir:~/Maildir
#ユーザーデータベースとパスワードデータベースに外部DBを、指定した外部ファイルで指定、
#postfixのスプールディレクトリにユーザーとグループを指定してSASLソケットを提供
auth default {
  mechanisms = plain login
  userdb sql {
   args = /usr/local/dovecot/etc/dovecot-mysql.conf
  }
  passdb sql {
   args = /usr/local/dovecot/etc/dovecot-mysql.conf
  }
  passdb pam {
  }
  passdb passwd {
  }
  userdb passwd {
  }
  socket listen {
   client {
    path = /var/spool/postfix/private/auth
    mode = 0660
    user = postfix
    group = postfix
   }
  }
}

dovecot-mysql.conf
でDBのやらそのクエリを指定する。


driver = mysql
connect = host=ホスト名 dbname=DB名 user=ユーザーt password=パスワード
#パスワードのハッシュ方式を指定 MD5-CRYPTとかPLAINとかが使える。
default_pass_scheme =CRYPT

#ユーザーDBの参照クエリ
# %uでユーザー名を指定され、
# カラム名homeにMaildirのあるディレクトリ、(一般的にはホームディレクトリやね)
# uidにuid gidにgidが得られるようなクエリを指定する。
user_query = SELECT mailrootdir AS home ,uid ,gid FROM table WHERE username="%u" and mailuse='1'

#パスワードDBの参照クエリ
# %uでユーザー名を指定され、
#カラム名usetとしてユーザー名が、
#カラム名passwordとして指定した方式でハッシュ化済のパスワードが得られるようなクエリを指定する。
password_query = SELECT username AS user ,password FROM table WHERE username='%u' and mailuse='1'

2008年11月22日

●窓口は多いけど問い合わせ先は一つのソラリスに

やっとの事でftp、www、smtp、pop3、imapのアカウントを一つのmysqlのDBから読むようなシステムを作る事が出来た。
発行するクエリでwhere句でフィルタしてやれば、ftpアカウントだけ、メールだけ、wwwのベーシック認証だけ、あるいはそのいずれの組み合わせでも使えるような仮想アカウントが利用出来る。

これらの問い合わせ対象となるDBが全て同じテーブルであるって言うのがミソ。
当然、パスワードやらなんやらの変更はメールだろうがftpだろうが全てに共通する。

さらに、もう一つ外せないのは、全てを仮想ユーザーだけで運用するのではなく、実ユーザーも特別な運用無しに同じ環境で使える事である。
仮想ユーザーだけでなく、リモートからシェルをつかったり、XDMCPへXから接続してデスクトップを使ったりするための実ユーザーも同じように動作しないと。

仮想ユーザーだけ、実ユーザーだけっていう運用は意外に簡単やけど、これらの違いを意識せずに統合するってところは、一般的にはあまり要求されないけど、土偶家では必須であった。

概略を述べると、dovecotで動かしたpop3とimapはmysqlのDBからアカウント情報を取得し、SMTPを受信時にはPostfixのエイリアスマップを同じDBから取得し、外部へリレーするメール送信時はSMTP認証としてdovecot経由でDBに聞きに行く。
ftpはproftpd、WEBのベーシック認証はapacheのmod_auth_mysqlでDBに問い合わせと言う感じである。

ネット上の情報では、メールだけ、FTPだけっていうのが多々あるけど、これら全てを統合した説明は見た事がない。これは素晴らしいんじゃないだろうか?

結構苦労したので順jにエントリにしてゆこうと思う。

2008年11月18日

●mysql対応proftpdを作る

proftpdをただ入れるだけではつまらないんで、mysqlで認証させる機能もつけてコンパイルしてみた。
ゆくゆくはさらにpostfixもdovecot経由でユーザーを取って、このproftpdと同じユーザーにメール環境を提供するとを考えている。

とりあえず、このproftpdでは、実ユーザーで認証後、失敗すればmysqlに聞きに行く、という動作が目標である。
これをアパッチと連携させてこの実ユーザーでないユーザーにWEBスペース提供するのはapacheのAliasMachで簡単に実現できそう。

mysqlがprefix /usr/local/mysql 以下にインストールされているものとして話を進める。

mysqlにユーザDBを作る。
クエリはこんな感じ。

CREATE DATABASE dbname;
GRANT SELECT ON dbname.* TO dbuser IDENTIFIED BY 'dbpassword' ;

USE dbname;
CREATE TABLE groups (
groupname varchar(150) NOT NULL,
gid smallint(5) unsigned DEFAULT ‘1000′ NOT NULL,
members varchar(255),
UNIQUE KEY gid (gid),
PRIMARY KEY (groupname)
);

CREATE TABLE users (
userid varchar(150) NOT NULL,
passwd varchar(30) NOT NULL,
uid smallint(5) unsigned DEFAULT ‘1000′ NOT NULL,
gid smallint(5) unsigned DEFAULT ‘1000′ NOT NULL,
homedir varchar(255),
shell varchar(255) DEFAULT ‘/bin/false’,
PRIMARY KEY (userid)
);

INSERT INTO USERS SET userid = “userid”,passwd = “password”,homedir =”homedir”;
↑てな感じでユーザーを追加


Mysqlの準備は終わり。


proftpdのコンパイル
mysql認証対応バイナリをコンパイル

せっかくsolarisということで、gccでなく、SunStudioを使用
export CC=/opt/SUNWspro/bin/cc
export CXX=/opt/SUNWspro/bin/CC
export F77=/opt/SUNWspro/bin/sunf77

Sun Studio 12のコンパイラオプションは以下の通り。
export CFLAGS=" -fast -native -mt"
早く、ネイティブに、マルチスレッドに!(でも32ビット)
64ビットバイナリにすると後々別のバイナリからこのバイナリにリンクするときにややこしくなるので却下、64ビット化する場合は "-m64"を追加する。

コンフィグオプションは以下の感じで。


--prefix=/usr/local/proftpd --with-modules=mod_sql:mod_sql_mysql --with-libraries=/usr/local/mysql/lib/mysql/ --with-includes=/usr/local/mysql/include/mysql/

ちゃんとコンパイルできているかどうかは、
/usr/local/proftpd/sbin/proftpd -l
Compiled-in modules:
mod_core.c
mod_xfer.c
mod_auth_unix.c
mod_auth_file.c
mod_auth.c
mod_ls.c
mod_log.c
mod_site.c
mod_delay.c
mod_auth_pam.c
mod_sql.c
mod_sql_mysql.c

上の太字の部分を確認


デフォルトのFTPを止める
#svcadm disable svc:/network/ftp:default

#簡単にSMFのinetdに登録するには、
/etc/inetd.confに
ftp stream tcp nowait root /usr/local/proftp/sbin/in.proftpd proftpd
と書いた後、
inetconv と実行すればよい。

proftdpd.confの編集、特筆すべき部分だけを書くと以下のような感じ。


ServerType                      inetd

#mysql認証
<IfModule mod_sql_mysql.c>
    SQLAuthenticate             users
    SQLConnectInfo              dbname@localhost:3306 dbuser dbpassword
    SQLAuthTypes                Crypt
    SQLUserInfo                 users userid password uid gid homedir shell
    SQLGroupInfo                groups groupname gid members
  
#実ユーザーで認証後にいなければmysqlに問い合わせ
AuthOrder                   mod_auth_unix.c mod_sql.c  

</IfModule>

AllowOverwrite         on

#wwwグループはホームより上に上がれない
DefaultRoot ~ www

#レジューム許可
AllowStoreRestart on
AllowRetrieveRestart on

#モード変更許可
<Limit SITE_CHMOD>
AllowAll
</Limit>

2008年11月17日

●Sun Fire V100

sunfirev100.jpg
もう今時Sparcなんて古いやねーなどとこの間言ったところやけど、思わずSun Fire V100なるSparcマシンを買ってしまった。
かなり古いマシンでエントリレベル・サーバ に位置づけられる製品である。
ビデオアウトもキーボード接続端子も無いので、完全サーバー用途ですな。ワークステーションですらない。
後ろに見えるのは土偶家の自慢の品、シリアル接続のキャラクターベースのコンソール端末、いわゆる「ダム端末」である。これはいいものだ。
サーバーにディスプレイモニターなど飾りです。偉い人にはそれがわからんのです、という諸氏には堪えられない逸品である。色もジオングと一緒やしね。

私が思うに筐体デザイン最高峰であると信じて疑わないnetra T105と速度的に殆ど変わらないけど、メモリが1ギガ乗っている上に、ディスクがIDEで構成されているのが使いやすい。
家に転がっているPC用のディスクを流用できるのだ。

最近のSolarisはもうDVDでインストールしないとCDを8枚も入れ替えさせられる羽目になる。
Windwos95のフロッピーインストールじゃあるまいしちょっとやってられないので、インストールの間だけ蓋開けて5インチのDVDドライブを無理矢理接続して、DVDでインストールが行えるのはちょっといい感じである。

で、早速Solaris10のU6 08年の10月版をインストールしてみたが、ルートファイルシステムにUFSかZFSを選べと聞かれた。
思わずビビってUFSを選んだのだが、あまりにもチキンな自分自身を思うにつけ「老いたな・・・」と実感した。

2008年11月11日

●postfix 2.5.5 でのCryus-SASLでのSMTP-AUTH @OpenSolaris

最近新しくOpenSolaris 2008.05で家のサーバーを作っており、cyrus-saslでpam認証するSMTP-AUTHつきのpostfixをコンパイルしたのだが、なぜかちゃんとSMTPが動作しない。
手順はほぼ前にあげたエントリの通り。前は上手くいったのに…
コンパイルしたバージョンは2.5.5なのだが、ポート25に接続しても、ログに「warning: unsupported SASL server implementation: cyrus」と出るだけでうんともすんとも言わない。
うーんなんてこったい。
ちなみにコンパイル時のオプションはCCARGS="-DUSE_SASL_AUTH -I/usr/local/include/sasl2 -I/usr/include/pcre" AUXLIBS="-L/usr/local/lib -lsasl2 -R/usr/local/lib"とこんな感じで特に問題はなさそう。
CCARGSの最後のインクルードパスの指定は、ccがdict_pcre.cのコンパイル中にprce.hが無いとかぬかしたので追加してある。根性で捜して来いよと。プンプン。

んーまいったなーとソースコードについてきたドキュメントを読んでいると、「Building Postfix with Cyrus SASL support」の項目に



(for Cyrus SASL version 2.1.x):

% make tidy # if you have left-over files from a previous build
% make makefiles CCARGS="-DUSE_SASL_AUTH -DUSE_CYRUS_SASL \
-I/usr/local/include/sasl" AUXLIBS="-L/usr/local/lib -lsasl2"



とか書いてある。
-DUSE_CYRUS_SASL ってオプションが増えてるやんけー

なんやねんそれーということで、同じ文書をよく読むと"Support for the Dovecot version 1 SASL protocol is available in Postfix 2.3 and later. "ってことらしく、2.3からはSASL AUTHに「Cryus-SASL」
と「Dovecot SASL」を使えるようになったようだ。
SMTPでSASL-AUTHをするようビルドするには「USE_SASL_AUTH」としたうえで、「DEF_SERVER_SASL_TYPE=\"dovecot\"」と「USE_CYRUS_SASL」のどちらか、あるいは両方を指定するようだ。
そういえば、前にコンパイルしたのは2.2やったしね。

ということで、


gmake tidy
CCARGS="-DUSE_SASL_AUTH -DUSE_CYRUS_SASL -I/usr/local/include/sasl -I/usr/include/pcre"
AUXLIBS="-L/usr/local/lib -lsasl2 -R/usr/local/lib"

gmake makefiles
gmake


てな感じでコンパイルして上手くいった。

しかし、初めて見た「Dovecot SASL」なるものを調べていると、Cryus-SASLが認証方法を一つしか選べないのに対して、Dovecot SASLは複数のものを同時に使えるようだ。
例えば、最初にpamでローカルユーザーを調べ、いなければLDAPに聞きに行き、そこにもいなければmysqlに聞きに行けるということも可能ということらしい。
土偶家ではメールのユーザーは全員実ユーザーに関連付けられていて、メールしか使わないユーザーはシェルを使えなくしてあるのやけど、この「Dovecot SASL」を使うとローカルユーザーすら作らなくてもよいではないか。
ということで、「Dovecot SAS」対応しておけば、confだけで切り替えることが出来るらしいので、とりあえずもう一度コンパイルしなおしておくのも良い感じである。

更に、Postfix TLS Supportなるドキュメントを見れば、以前は実装する為にはソースにパッチ充てたりとややこしかった、認証時のSSL暗号化のTLSサポートも結構簡単になったようである。
「Dovecot SAS」とあわせて、これは一丁チャレンジしてみるかな。これでgmailにリレーしてもらえるやん。
久しぶりにsolaris熱メラメラである。

2008年09月24日

●apache-tomca+apacheで web+Java Servletを作る

先日仕事でJava Servletが動くサーバーを作ったのだが、実行環境であるapache-tomcat自体はバイナリパッケージを落としてきて展開するだけ、と激しく簡単である。
しかしこれではapacheと同じポートで同時に使えない。
どうせなら同時にapacheも使いたいので、apacheとTomcatを連携させるために、ネット上の情報を探したのだが、apache-tomcatを使うだのjakarta-tomcatを使うだのと二通りの情報が錯綜していて良くわからんかった。
そもそもapache-tomcatとjakarta-tomcatの違いがはっきりしなかったのやけど、色々調べた結果、結局この二つは同じ物を指していて、apache-tomcatの古い呼び方がjakarta-tomcatであると便宜的に理解しておいても大丈夫そうだ。

ややこしい話やけど、apache内のjakartaプロジェクト内のtomcat製作プロジェクトで作られたものがjakarta-tomcatで、後にtomcatプロジェクトが格上げされてapache直下のjakartaプロジェクトと同じ位置に来たのでapache-tomcatとなったと言う事らしい。どちらも作っているものは同じである。
apache-tomcatもjakarta-tomcatもどちらもJava Servletである。

で、apacheとTomcatを連携させて同じポートで動かす、つまり、apacheの特定のディレクティブだけtomcatで動作させるためには、apache + Tomcat Connectors + Tomcat(apache-tomcat)という構成すれば良い。
イメージとしては、apacheとtomcatが個別に動いていて、apacheへの特定のディレクティブへのアクセスを、apacheのモジュールであるTomcat Connectorsがリバースプロキシの様な働きをしてTomcatの特定のポートから転送するといった動作のようだ。(想像)

環境は OpenSolaris 200805
コンパイラはsunstudioexpress(SunStudio11ベース?)
apache_1.3.41 apache-tomcat-6.0.18 tomcat-connectors-1.2.26
apacheとtomcat-connectorsのみソースからインストール

とりあえずapacheを

./configure --enable-rule=SHARED_CORE --enable-module=so --prefix=/usr/local/apache
って感じの --enable-module=so つきでコンパイル、ポート80で動かす。

Tomcatをどこぞに展開して、bin/startup.sh で起動、
server.xmlのAJPプロトコルのバージョンと動作ポートを確認、
<!-- Define an AJP 1.3 Connector on port 8009 -->
 <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
 
なのでajp13 ポート8009となる。


どちらもちゃんと動いていればtomcat-connectorsのインストール

tomcat-connectors-1.2.26-srcのコンパイル

$ cd tomcat-connectors-1.2.26-src/native/
$./configure --with-apxs=/usr/local/apache/bin/apxs
$make
#make install
とすれば
apacheのlibexecディレクトリにモジュールmod_jk.*がインストールされる

ただし、solarisの場合、
/usr/ccs/bin/make
/opt/SUNWspro/bin/dmake
/opt/SunStudioExpress/bin/dmake
では如くコンパイルエラーが出るようだ。
gnuのmakeを使えばちゃんと通るので入ってなければ入れる。


apacheのconfディレクトリに移動
httpd.conf に以下を追加


LoadModule jk_module libexec/mod_jk.so

<IfModule mod_jk.c>
  JkWorkersFile conf/tomcat.conf
  JkLogFile logs/mod_jk.log

#Tomcatの/examples以下を転送
  JkMount /examples/* tomcat

</IfModule>

tomcat.conf を新規作成して以下を追加


worker.list=tomcat
worker.tomcat.port=8009
worker.tomcat.host=localhost
worker.tomcat.type=ajp13

apche再起動
tomcat再起動

2008年09月22日

●OpenSolarisで鯖立て準備

土偶家のサーバーはnetra T1 105っていうsparcマシンで動いているのだが、このブログのサーバーとメールサーバーを外のレンタルサーバーを借りて移動したので、そろそろnetraを引退させようと言う事を以前に書いた。

結局余っていたPentiumⅢ800のPCにコンパクトで省電力な電源を接続して、ただのsolarisでは面白みが無いので、OpenSolaris 2008.05 を突っ込んだのだが、まさに名ばかりカーネルばかりのsolarisとでも言おうか。

ファイルシステムのZFSやパッケージシステムのIPS(Image Packaging System)ってのはsolaris11の方向性なのやろうけど、/bin/shが/sbin/shのシンボリックリンク、/sbin/shが外部ライブラリにリンクしまくりのksh93へのシンボリックリンクであるのに愕然とした。
でも良く考えれば、ファイルシステムがマウントできず、シングルユーザーで起動して/sbin/shを最後の砦としてグリグリするような状況ってのは、ZFSでは起こり得ないということなのだろう。

最近の肥大化したSolarisと全く違うコンパクトな構成であり、gccやgmakeが入っていない割には、結構、各種ヘッダを取り揃えております。って感じで、IPSでSunStudioをインストールすれば結構色んな物のコンパイルが気持ち良く通る。
デフォルトで起動しているデーモンも少なく、余計な物は全く入っておらず、以外にサーバーOSとして良いんじゃないだろうか。

明らかにubuntuを意識していると言われて、unix初心者向きの方向性に見せかけながら、結構作り込みはエグイと感じた。
一番びっくりしたのが、IPSで全てを自動でアップデートしたら、カーネルのアップデートも入って、まともに起動しなくなった事である。
アップデート後にブートセクタに対して、アップデートされたカーネルで起動するように設定されたGrubを手動で書きこんでやる必要があるようだ。ってそんなん自動でやってくれよ。と。

初心者やったらその時点でアウトやぞーと思ったけど、初心者やったらカーネルのアップデートなんかやらんわな。と納得した。

2008年06月18日

●64ビットバイナリなるlsコマンドなど、いとをかし。

apacheなどを4ギガ超のメモリを搭載しているマシンでグリグリ動かす場合とかは64ビットバイナリにしておくと大量のメモリを使えるので良さげやけど、そんなに多くないメモリの自宅サーバーで使う分には64ビットバイナリなど殆ど意味なんか無いだろう。
逆にライブラリの互換性の問題が出てきたりとかもあるので無難に32ビットでコンパイルしておくほうが良いような気がする。
仕事でSPARC上でコンパイルする場合、CFLAGSに"-xarch=v8"を追加してわざわざ32ビットアーキテクチャで決め打ち、何かの拍子に64ビットにならんようにするくらいである。

とは言っても、64ビットバイナリで動いているデーモンというだけでなんか気分が良いし、可能なら64ビットバイナリを生成したくなるのはヲタの性であるし、害の無い所で無駄に64ビットのlsやrmコマンドなどをつくってみるのも乙なものである。
更にコマンドをls64,rm64などとリネームしておけば無駄に恰好良さげで、「いとをかし」である。
早くも便利でもない逆にリスクのある自己満足こそヲタの真骨頂というところか。

と言う事で、ここからが本題、バイナリとプロセスが64ビットかどうかを調べる方法を書いてみる。

SparcやAMD64などのマシンで何かをコンパイルした後、ちゃんと64ビットバイナリが出来ているのか確認する場合、例えばopensslのバイナリが64ビットで動作するのかどうか知りたければ、fileコマンドを使って、

# file /usr/local/bin/openssl
/usr/local/bin/openssl: ELF 64-ビット MSB 実行可能 SPARCV9 バージョン 1[動的にリンクされています][取り除かれていません]
ってな出力を確認する。

コマンド単体で無く、既に動作しているプロセスに対する場合は、plddコマンドを使ってプロセスが使用しているライブラリを確認したり、pflagsコマンドでdata modelを確認したり、pmapでメモリのアドレス空間の大きさを見たりすると良いらしい。

例えばapacheの場合は、
/usr/bin/ps -ef|grep httpd
等としてプロセスIDを調べた後、

pdddの場合は、

# pldd 16497
16497: /usr/local/apache/bin/httpd
/usr/local/apache/libexec/libhttpd.so
/lib/sparcv9/libsocket.so.1
/lib/sparcv9/libnsl.so.1
/lib/sparcv9/libpthread.so.1
/lib/sparcv9/libthread.so.1
/lib/sparcv9/libc.so.1
sparcv9とかamd64のライブラリを使っていれば64ビット。

pflagsの場合は、

# pflags 16497
16497: /usr/local/apache/bin/httpd
data model = _LP64 flags = ORPHAN|MSACCT|MSFORK
/1: flags = ASLEEP pollsys(0xffffffff7ffff5d0,0x0,0xffffffff7ffff690,0x0)
data model が _LP64 なら64ビット。

pmapの場合は

pmap 16497
16497: /usr/local/apache/bin/httpd
0000000100000000 8K r-x-- /usr/local/apache/libexec/libhttpd.ep
0000000100100000 8K rwx-- /usr/local/apache/libexec/libhttpd.ep
0000000100102000 224K rwx-- [ heap ]
~略
で、メモリアドレス空間が16進数で16桁なので64ビット(32ビットの場合は8桁)

って感じやね。

参考ページ(と言うか殆ど丸写し…):動作しているプロセスが、32 bit または 64 bit バイナリのどちらか?@やっぱり Sun がスキ!


2008年06月16日

●fileutilsはCoreutilsに

最近、家に帰ると時間を見つけてコツコツと少しずつsolarisでサーバーを作っている。
なんかsolarisと戯れるのも久しぶりである。相変わらずコンパイルしてると妙に落ち着くのは何でやろう。

土偶はsolaris使いになる前に慣れ親しんだlinuxコマンドの影響から、いつもsolarisインストールした後に、GNU互換のlsとかcp、ln、chmod、chown等のコマンド群が入った「fileutils」ってパッケージをコンパイルして入れているのやけど、なんか今回はダウンロードしようと何処を見てもバージョンが古く、4.1.11から進んでいないように見える。

で、よく調べていると、 FileutilsはFileutils単体でのバージョンアップは終わり、 Shellutils、Textutilsと共に、Coreutilsと言うパッケージに統合されたらしい。
GNUのアナウンスでは、どうやら2003年の4月4日のcoreutils-5.0の最初のメジャーリリースからそういう事になっていたようだ。全然知らんかった…

一つのパッケージをmakeすれば三つのバッケージ分のバイナリが出来るので便利と言えば便利、お得と言えばお得なのだが、ShellutilsもTextutilsもあまり使わん上に、使ったとしてもcatとかtailはsolarisの方のコマンドで慣れてるので、私にとっては結構微妙というか大きなお世話でもある。

makeした後にmake install せずに、srcディレクトリ以下に生成された必要なコマンドのバイナリだけ手動でコピーして使う方が良いかも。

2008年06月12日

●Solaris10でNICを冗長する

sparcアーキテクチャのワークステーションやらサーバーにはイーサネットのポートが二つ搭載されている事が多い。
二つあっても通常はルーターにするなどの用途意外には二つ使う事は殆どないけど、一個を遊ばせておくのももったいないので冗長化させるとなんとなく気分が良い。ということでするたびに何時も忘れる事もあり、このNICの冗長化の設定を書いてみる。

例はhme0(192.168.1.201)と hme1(192.168.1.202)の二つのNICを冗長化して、192.168.1.100(ホスト名t105)という仮想NIC上のアドレスで利用する場合の設定。
普段はhme0で動作しているけど、hme0がハードウェア障害などでダウンした場合、フェイルオーバーされたhme1で動作する。というのが目的。
この設定は2本の線を同時に使って帯域を2倍確保すると言うものではないはずである。

土偶自身が動作確認しているのはNetra t105 上での solaris10 11/06 と 05/08やけど、x86でも可能やと思われる。

/etc/hosts に仮想NICと実NICのIPアドレスを設定する


#
# Internet host table
#
127.0.0.1 localhost
192.168.1.100 t105 loghost
192.168.1.201 t105-hme0
192.168.1.202 t105-hme1


/etc/hostname.hme0 メインのインターフェイスの設定(二行にわたってるけど実際は一行で)


t105-hme0 netmask + broadcast + group production deprecated -failover up
addif t105 netmask + broadcast + failover up

/etc/hostname.hme1 サブのインターフェイスの設定(二行にわたってるけど実際は一行で)


t105-hme1 netmask + broadcast + group production deprecated -failover standby up

と言った感じで完了。別ノードからpingを打ち続けながらケーブルを抜いて動作確認してみよう。

2008年05月28日

●Live CD solaris 「OpenSolaris 2008.05」

以前、OpenSolarisベースのLive CDで起動する「Indiana」なるプロジェクトの派生物であるSolarisがSunのサポートの下で「OpenSolaris 2008.05」として配布開始になったっつんでダウンロードしようと「Get OpenSolaris」なページに行ったのやけど、英語ページなんで適当に読みながらそれらしいリンクを突付いているうちに住所を聞かれたりしたので「ふーんダウンロードするのにそんな事も聞くんや」と思いながら入力していたら、最後の送信ボタン押した段階で「航空便で送るから、後3,4週間ほどかかる」って言われて、えっ?ダウンロードじゃなかったの?とびっくりした。英語やったからほんまにそう言っていたのか半信半疑やったのやけど…
結局別のリンクからISOファイルをダウンロードしてCDに焼いて使っているものの、今日本当に航空便で届いてしまった。なかなか可愛らしいメディアである。opensolaris0805media.jpg

ダウンロードすれば使えるけど、「Get Free Media」って書いてあるし、メディアが欲しい人は申し込んでみると良いかも。Sunがわざわざ航空便で送ってくれます。

このOpenSolaris自体はLive CDなのでクライアント使い向きやけど、Atokが入っていないのはデスクトップSolarisとしては致命的、それならknoppixでええやん。ということになる。

しかしながらHDDにインストールするとなるとGUIとXアプリがしょぼくてAtokが入っていないということが、逆に通常のSolaris10の「開発者サポート」よりコンパクトにまとまっているわけで、実はサーバー構築向きのディストリビューションでないかと思う。ファイルシステムもZfsやしね。一台にインストールしてSolaris10でコンパイルしたバイナリ動かしてみたけどちゃんと動いた。まぁ当然か。

SunブランドでリリースされるSolarisが今までの「Free solaris10」と「Solaris Express」に加えて「OpenSolaris」で三つとなった事はとても良い感じである。

2008年05月15日

●Sun xVM VirtualBox

Sun MicrosystemsがMySQLを買収した事は大きなニュースになったけど、ドイツのInnotekを買収したことはそんなにニュースになっていないようだ。
同社の「VirtualBox」がSunブランドででるのはちょっと良い感じだと思うのだが…名称も「Sun xVM VirtualBox」やしかなり気合が入っているようだ。
Windowsはもちろんの事、Linux, Macintosh,Solarisiにまで対応している。
完全仮想化Xenを使わずに、Solaris内でWindowsを飼える仮想環境はこれだけだと思う。Solariをメインで使っていて、時々Windowsを使う人にとっては待ちに待ったソフトじゃないだろうか?

しかもこれの凄いところは、VirtualBox上の仮想マシンがVT-x/AMD-Vをエミューレートしている事である。
つまり、仮想マシン内で、完全仮想化Xenが動くという事である。VT-x/AMD-Vを使ってXenを動かしてみたいけど、高いハード買ってまで試す気が無い人(俺だ)にはもとても朗報である。Solaris使いはXenベースの「Solaris xVM」が試せるわけだ。

また、これをSolaris上でWindowsを動かすために使うのではなく、VmwareチックにWindows上でSolarisやLinuxを動かす仮想化ソフトウェアとして使う人にもとても使いやすい作りになっている。メニューから何から何まで日本語化されているし、仮想マシンで使う仮想ディスクを作るのがとても簡単だったり、ネットワークやUSBを簡単に割り当てたり出来るので、solaris体験してみたい人にはぜひお勧めの一品である。vmware playerよりもはるかに使いやすいように思う。

最近のsolarisは色々な種類があってよく知らない人にはどれを使って良いのかよく分からんやろうけど、サーバーとして勉強として使うなら「solaris 10」、クライアントとして使うならATOKが入って激しくお得な、先端の技術がふんだんに投入されている「Solaris Express Community Edition」がお勧めである。

しかし、仮想化したマシンが完全仮想化に対応しているというのは考えてみるとややこしい話やなぁ…

2008年01月08日

●solaris上でXorgの設定

土偶のPCは画面の解像度を1024x768で使用しているのやけど、VMWare Player内で動作させたXのログイン画面(xdmのdtloginとも言うのか?)がデフォルト1280x1024になって画面からはみ出してすこぶる使いにくい。
これは画面いっぱいの1024x768で使いたい。

通常のソラリス使いならXの設定はkdmconfgを実行し、Xsun serverを選んで行うのが基本やけど、VMWare Playerの場合にXsun serverをXサーバーとして使うと最高解像度が800x600までにしかならない。
ゆえにVMWare Player上のsolarisではXorg serverを使用する必要があるのやけどちょっと迷った上にはまりかけたので書いておく。

Xサーバーが起動していない状態で( コマンド行ログイン状態からsshかコンソールで)
/usr/X11/bin/Xorg -configure
を実行し、(現在の設定を元に出力された?)xorg.conf.newを/etc/X11/xorg.confにコピーした後これを編集する。

「Section "Screen"」からEndSectionを

Section "Screen"
        Identifier "Screen0"
        Device     "Card0"
        Monitor    "Monitor0"
        SubSection "Display"
        DefaultDepth 24
    Subsection "Display"
        Depth       8
        Modes       "1280x1024" "1024x768" "800x600" "640x480"
    EndSubsection
    Subsection "Display"
        Depth       16
        Modes       "1280x1024" "1024x768" "800x600" "640x480"
    EndSubsection
    Subsection "Display"
        Depth       24
        Modes       "1024x768" "800x600" "640x480"
    EndSubsection
EndSection

とする。Identifier Device Monitorの値はそれぞれに。
これでログインが面が色数24bitで解像度1024x768になる。

●xVM!いわゆるSolarisのXen!

solaris関係の事を色々調べていて、Solaris Express Community Release Build 75 からXenのsolaris上の実装であるxVMなる仮想化技術が搭載されているらしい事を今更ながらに知った。

つまりは、特に何も考えずにSolaris Express Community Release Build 75以降をインストールすれば、起動時のGRUBメニュー内で「Domain-0」としてのSolarisを選んで起動出来ると言うわけだ。
Domain-0が起動してしまえば「Domain-U」内でwindowsだろうがNetBSDだろうが飼い放題、悲願である「Solaris内でWindowsを飼う」がやっと叶うでは無いか。これはやるしかない。

という事で久しぶりの「Solaris/Sparc」カテゴリである。

という事で少しxVMなる技術について勉強してみたものの、どうやらその仮想化のレベルが二つあって、エミュレーターに近いような仮想ハードウェア環境を提供する「準仮想化(ParaVirtualization) モデル」と実在のハードウェアをエミュレートしてDomain-Uには実際のハードウェアに見せる「完全仮想化(FullVirtualization) 」の2タイプがあるらしい。
でもって、土偶の目指す 「Solaris内でWindowsを飼う」は完全仮想化Domain-Uで無いと動かないらしい。
順仮想化Domain-UのOSは順仮想化に対応したカーネルを持っている、つまりはXenに対応したOSが必要という事でwindowsXPはダメ。つまりはSolarisかlinux位のものである。

じゃぁ完全仮想化で動かせばいいやんと言う事やけど、今度はCPUが「Intel VT」か「AMD-V」なる仮想化技術に対応してないといけないらしく、土偶のメインマシンのCPU、Xeon 2.8GHz(Nocona)が対応してるのか調べた結果、「Intel VT」対応のCPUはXeon 5000番台(Dempsey, Woodcrest)からという事で三世代古く非対応 orz
激しく残念である。

余りに残念なのでWindowsXP上のVMWare Player内にSolaris Express Community Release Build78、nevada78をインストールしてみた。(飼い方はこのあたりで)
Windows内の仮想マシン上でSolarisが動いたところで嬉しくもなんとも無い。ああ、虚しい…

VMWare Player内Solarisの起動メニューにDomain-0のSolarisである「Solaris xVM」があったので、「VMWare Player内の仮想マシンでXenを動かすとどうなるんや?」ってことで起動してみるとカーネルを読み込んだ時点で落ちたのがちょっと笑った。

VMWare Playerfor Solaris なんてものがあれば良いんやろうけどねぇ。

参考(どっちもblogs.sun.com内やけど…):

Xen ベースの仮想化技術 Solaris xVM @ やっぱり Sun がスキ!

Windows Guest on Solaris xVM (Nevada 75a) @ ささの豆知識ブログ

2007年10月06日

●lighttpd、apacheでないwebサーバー

WEBサーバーと言えばapacheやけど、巷で軽い、早い、柔軟と噂のlighttpdを使ってみた。
さらにFastCGIでPHPとPerlを動かす。

FastCGIをコンパイルした後に…


PerlのFastCGI対応のモジュールとしてFCGIとCGI::Fastを入れる。
CPANなコマンドで言うと、

perl -MCPAN -e 'install FCGI'
perl -MCPAN -e 'install CGI::Fast'
とこんな感じ

PHPのFastCGI対応版は以前のエントリな感じで。

lighttpd本体のインストールは特にややこしい事はなく、

./configure --prefix=/usr/local/lighttpd

#confのコピー
cp doc/lighttpd.conf /usr/local/lighttpd/etc

#rcスクリプトのコピー
cp doc/rclighttpd /usr/local/lighttpd/sbin

●apache1系のコンパイルオプション

apacheのコアプログラムも DSO ライブラリとしてコンパイルする時はこんな感じ。
./configure --enable-rule=SHARED_CORE --enable-module=so --prefix=/usr/local/apache

2007年10月05日

●Sun Studio 11でPHP5をコンパイル

PHP5系のコンパイル apacheのsoモジュールを作った後に、fastcgi対応版も作成。
solari10 sparc 8/07 コンパイラはSun Studio 11

コンパイラの指定
export CC=/opt/SUNWspro/bin/cc
export CXX=/opt/SUNWspro/bin/CC
export F77=/opt/SUNWspro/bin/f77

コンパイルオプションの指定
export CFLAGS="-Xa -fast -native -xstrconst -mt -xarch=v8"

ライブラリ検索パスの追加
export LD_LIBRARY_PATH=/usr/local/lib:/lib:/usr/lib:
/usr/ucblib:/usr/sfw/lib:/opt/sfw/lib:/usr/dt/lib:
/usr/openwin/lib:/usr/xpeg4/lib:/usr/ccs/lib
(実際は一行で)


#apache1.3系のsoモジュールをインストール
通常のPHPバイナリの他に
/usr/local/apache/libexec/libphp5.so
が生成される。

#with-apxsを指定してconfig
./configure --with-apxs=/usr/local/apache/bin/apxs --with-mysql=/usr/local/mysql --enable-zend-multibyte --enable-mbstring --enable-mbregex
GDを使う場合は追加
--with-gd=/usr/local --with-jpeg-dir=/usr/ --with-png-dir=/usr --with-xpm-dir=/usr --with-freetype-dir=/usr/sfw --with-tiff-dir=/usr --with-xml=/usr --with-zlib=/usr --with-xpm-dir=/usr

#make とmake install
dmake
dmake istall

#fast-cgi版のPHPインストール
apach1.3のsoモジュールを作った後、
lighttpdなどで使用するfast-cgiで動作するバイナリを作る。
通常のPHPバイナリの他に、
/usr/local/bin/php-cgi
が生成される。

#ソースディレクトリ内の生成されたconfigとバイナリを消す

dmake distclean

#enable-fastcgiを指定してconfig

./configure --enable-fastcgi --enable-force-cgi-redirect --enable-discard-path --with-mysql=/usr/local/mysql --enable-zend-multibyte --enable-mbstring --enable-mbregex --enable-discard-path
GDを使う場合は追加
--with-gd=/usr/local --with-jpeg-dir=/usr/ --with-png-dir=/usr --with-xpm-dir=/usr --with-freetype-dir=/usr/sfw --with-tiff-dir=/usr --with-xml=/usr --with-zlib=/usr --with-xpm-dir=/usr

#make とmake install
dmake
dmake istall
(./sapi/cgi/php がcgi-phpの本体なので、
cp ./sapi/cgi/php /usr/local/bin/php-cgi
としても可)

#iniファイルのコピー
cp php.ini-dist cp php.ini-dist /usr/local/lib/php/php.ini

#後は/usr/local/lib/php/php.iniをそれらしく編集
default_charset="UTF-8"
mbstring.language="japanese"
とかはいるんでね?

●Sun Studio 11でmysql5をコンパイル

今更ながら mysql5系 のコンパイル方法を…
solari10 sparc 8/07 コンパイラはSun Studio 11

コンパイラの指定
export CC=/opt/SUNWspro/bin/cc
export CXX=/opt/SUNWspro/bin/CC
export F77=/opt/SUNWspro/bin/f77

コンパイルオプションの指定
export CFLAGS="-Xa -fast -native -xstrconst -mt -xarch=v8"

ライブラリ検索パスの追加
export LD_LIBRARY_PATH=/usr/local/lib:/lib:/usr/lib:
/usr/ucblib:/usr/sfw/lib:/opt/sfw/lib:/usr/dt/lib:
/usr/openwin/lib:/usr/xpeg4/lib:/usr/ccs/lib
(実際は一行で)

#とりあえずconfigure
./configure --with-charset=utf8 --with-extra-charsets=all --with-mysqld-user=mysql --prefix=/usr/local/mysql

#make とmake install
dmake
dmake istall

#mysql用のグループとユーザー
groupadd -g 3306 mysql
useradd -d /usr/local/mysql/var -u 3306 -g mysql mysql

#myqldのDBディレクトリとDBインストール
mkdir /usr/local/mysql/var
chown mysql:mysql /usr/local/mysql/var
./scripts/mysql_install_db --user=mysql

#デーモンの起動
/usr/local/mysql/bin/mysqld_safe &

#rootのパスワード変更
/usr/local/mysql/bin/mysqladmin -u root password '新しいパスワード'

2007年10月02日

●ソラリス君、人災など気にしないでござるの巻

この日も前日に引き続き体がだるい。
家に帰って早々に葛根湯を飲んで布団にもぐりこんで本を読んでいると、突然土偶サーバーのあたりから「ピピピピピ…」という電子音が。
サーバーに電気を供給しているUPSがバッテリー異常の警報を発していた。土曜日ににも同じ警告が鳴ったものの、いつの間にか警告が止んで忘れていたので、この際バッテリーのチェックをしようとテストボタンを押すつもりが、何をトチ狂ったのかおもむろに電源ボタンを押してしまう。
当然UPSの電源が落ちて、土偶サーバー、スイッチ、コンソール端末と土偶ネットワークの基幹システムが一瞬にして電遮断。あー!一番やったらあかん事をやってしまった…

やっちまった感にがっくししながらも、もう電源落ちてしまったんやし…とUPSのテストを電源入れるところから数回繰り返し、特に問題は見られないのを確認する。
あの警告は何やねん…やっぱり機械は信用できん。というよりもいきなり電源ボタンを押す自分こそ信用できんやん…

一通りのUPSのテストを終えて「ファイルシステム壊れてませんようにナムナム」とつぶやきながら土偶サーバーにコンソール端末を繋ぎ、こわごわ電源を投入。

とりあえずは順調に起動する、でも、ホスト名が表示されたあとのファイルシステムのチェックがやたらと長いような気がする。もうどきがむねむねである。むむむ…
とりあえずコンソールにログインして、ログやらプロセスやら見る限り特に問題なく起動してちゃんと動いているっぽい。fsckも問題なし。さすがsolaris。ジャーナリングファイルシステムは伊達じゃない。
solaris7以降の人は mount option に「logging」を指定しておこう!!

人的災害が一番危ないと言うのが良くわかった日だった。

そういうわけで安心するととたんに眠気が襲ってきたので、お子様のような早い時間に寝た。

2007年09月14日

●僕らはみんな歪んでいる

嫌な夢で目覚める。最近は時々夢を見るようになった。
昨日は午前中はのんびりで午後からいきなりバタバタだった。
色々なものが目まぐるしく変わってゆく。古い色々なものは過ぎ去ってしまってもう無い。
新しくなるのは良いことだけれど、古い物には死すら訪れずただ消え去ってしまうのみ。
今目の前にあるものも今すぐ掴んでおかなければ直ぐに流れ去ってしまうだろう。それでも悲しい事に私の手は二本しかない。

家に帰って昨日に引き続きsolaris君と戯れる。味気ない16色のキャラクターベースのコンソール画面への没入感が心地良い。
このsolaris的世界の、ただ自分のためだけに世界を使って良い、欲望が可能的現実に直結する全能感は格別だ。
プロンプトが震え、カーソルの点滅が鼓動し、私の訪れを歓迎しているかのようにすら見えてくる。
あまりにも象徴的な数文字からなるシンボリックな言葉を黒一色の画面に打ち込んで何かを生成して表現してゆくのはとても楽しい。このsolaris的世界にあっては16色で大抵の事が表現できる。いや、16色で表現できないような事は表現する必要の無い事なのだ。

自分の形にへこんだ布団や自分の尻の形にへこんだサドルの様に、このsolaris的世界で遊ぶ事の歪みや厚みは自分の歪みや厚みにあまりにもフィットする。この心地良さは真っ直ぐな人と違う形に歪んだ人には理解されないだろう。

人には色々な歪み方がある。歪みある自分から歪みある他人を見れば、その他人の歪みは自分と他人を合わせた程度の歪みに見える。
そして、まったく歪んでいない人も、歪んだ人から見れば自分の歪み程度に歪んでいる人のように見えてしまうというわけだ。

それでも、見てて気持ちの良い歪みと、見るに耐えない歪み方があると言うのもまた本当だし、他人から見た自分の歪みを気にしすぎるのもあまり意味が無いと思った。

2007年09月13日

●movabletypeでmod_perlは本当に早いか?

このブログをapache上のmod_perlで動かそうと、1.3系apacheとPHPのDSOモジュール、そしてmod_perlモジュールをコンパイルする。
ネット上に溢れる情報どおりに設定してmod_perlは動いた。しかし早いのはperlのCGIを使う管理画面だけで、やたらとメモリを食ってhtmlやphpの応答が遅くなったような気がする。しかも再構築中にブラウザへの返答が無くなる現象が見られるようになった。

perlの初期実行時のオーバヘッドは緩和されたものの、HTTP-KeepAliveが使えなくなったお陰でブラウザによる静的コンテンツの連続読み出しが遅くなり、結果として多数のファイルから成り立っている我がブログの閲覧は遅くなった。
しかも殆どのmod_perlのセッションが、スパムのためにCGIを叩く接続に対する拒否なり廃棄なりの応答や処理に使われているわけで、殆どmod_perlの意味ねーやん。
投稿者が使用する管理画面だけが早く、閲覧者が見る通常の静的コンテンツは遅くなる状態と言うのはいかがなものか。
そういうわけで、我がブログにはmod_perlは必要ないと言う結論に至った。

しかしながら、そのまま元の環境に戻すのもなんなので、mod_perlを使わずに1.3系apacheだけの通常のCGIとして運用するようにした。それでも、2.2系のapacheに比べてメモリ消費量が抑えられている。結果としては、最新版の1.3系apacheへの移行だけ言う事になろうか。

まぁ、久しぶりのソラリス遊びはとても楽しかった。
みんなsolarisではgccつかわずに/opt/SUNWspro/bin/cc使おうぜ。

2007年03月01日

●Sennaがちゃんと動いた@solaris10

この日は昼休み以外ほとんど誰とも喋らなかった。
以前にnetbsdに作ったシステムをSolarisに移植するべく、ひたすらソラリス君と戯れる。
前日にまともに動作しなかったsennaがちゃんと動くようになった。
インデックス作成の故であると推測される、レコードの追加に少々時間がかかるが、一度出来てしまえば日本語インデックスによる全文検索の効果は絶大である。
んもー like %ほげほげ% とか使ってる場合じゃないっすよ。

MYSQL5系でがコンパイルエラーとなっていたのはsolarisに入っているSSL関係のライブラリ臭いが、考えるのもややこしいので、バージョンをMySQL 4.1系にすることで回避。(逃げとも言う…)

動作確認するもちょっと動作が微妙、その「微妙」の原因はMYSQL、mecab、PHP、が文字コードにUTF-8を使うように設定したにもかかわらず、なぜかsennaだけデフォルトのEUCのままになっていただけの話。これに気づくのに数時間かかった。orz
平仮名と片仮名はちゃんとヒットするのに漢字がヒットせんのはそういうわけだったのね。
仮名はヒットするが漢字がヒットしにくい場合は文字コード関係の不整合の可能性が大である。

sennaを中心とした全文検索システムの構築に関しては「Senna 組み込み型全文検索エンジン」のページを見れば全てわかる。
インストール」の手順に従って操作してゆけば全く無問題。
と、私のように書いてある手順をちゃんと読まずに設定をすっぽかす人間がいうのも何だが…

当方の環境はsolaris10 11/06 32bit-X86の「開発者サポート」であるが、上記のページで必須とされているけどデフォルトでは入っていないautoconf(SFWaconf)、automake(SFWamake)、libtool(SFWltool)をCOMPANION CDから入れてやればちゃんと動いた。

ちなみに作業時のLDFLAGSの値は -L/usr/sfw/lib -L/usr/ccs/lib -L/opt/sfw/lib -L/usr/local/lib -L/usr/ucblib -R/usr/sfw/lib -R/usr/ccs/lib -R/usr/local/lib -R/opt/sfw/lib -R/usr/ucblib
LD_LIBRARY_PATHの値は/usr/local/lib:/usr/lib:/usr/ucblib:/usr/sfw/bin:/opt/sfw/lib: \ /usr/dt/lib:/usr/openwin/lib:/usr/xpeg4/lib:/lib:/usr/ccs/lib:

細かい話やけど、solarisのtelnetがUTF-8を通すようになっていて、 LANG=ja_JP.UTF-8などとしている時にviでもcatでもちゃんと日本語が使えてかなり良い感じ。
昔からそうやったか??

2007年01月16日

●やっぱりwebalizerに負ける

前日に引き続きwebalizerと格闘。
db.h をインクルードしたのではどうしてもdns_resolv.cのコンパイルで失敗するので、
configure時に DEFS=-DHAVE_DB_185_H としてBerkeleyDB2.7.7のdb_185.hをインクルードするように指定してやる。
コマンドで言うと、
DEFS=-DHAVE_DB_185_H ./configure --enable-dns --with-db=/usr/local/BerkeleyDB.2.7.7/BerkeleyDB/include --with-dblib=/usr/local/BerkeleyDB.2.7.7/BerkeleyDB/lib
という感じ。
これでmakeするとちゃんとコンパイルできるのやけど、最後の最後、webalizerのバイナリを作る際にリンカが失敗する。
dns_resolv.oが未定義のシンボルdbopenを参照しているというが意味は良くわからん。
惜しい。惜しすぎるけど結局出来なかったのでふて寝。11時半くらいに寝たった。

2007年01月15日

●webalizerに負ける

家で久々にソラリスと戯れる。
以前コンパイルしたwebalizerが名前解決しないのに気付いたので、もう一度ソースから名前解決させるべく --enable-dns オプションつきでコンパイルを試みる。
何度やってもdns_resolv.cのコンパイル時にエラー、--with-dblibと--with-db=を指定しても駄目。
solarisやから悪いのか?solaris10やからか?コンパイラがSun Studio 11やしか?
でもSunのgccでもあかんかったしなぁ…

諦めてcswのバイナリパッケージを使った。orz

依存関係から必要なパッケージがないがかまわんのか?とソラリスが聞くが気にせずpkgadd

ldd /opt/csw/bin/webalizerの結果は以下のような感じ

libgd.so.2 => /usr/local/lib/libgd.so.2
libpng.so.3 => /usr/lib/libpng.so.3
libz.so => /usr/lib/libz.so
libm.so.1 => /usr/lib/libm.so.1
libnsl.so.1 => /usr/lib/libnsl.so.1
libsocket.so.1 => /usr/lib/libsocket.so.1
libdb-3.3.so => /usr/local/lib/libdb-3.3.so
libc.so.1 => /usr/lib/libc.so.1
libXpm.so.4 => /usr/lib/libXpm.so.4
libX11.so.4 => /usr/lib/libX11.so.4
libjpeg.so.62 => /usr/lib/libjpeg.so.62
libfontconfig.so.1 => /usr/lib/libfontconfig.so.1
libfreetype.so.6 => /usr/sfw/lib/libfreetype.so.6
libpng12.so.0 => /usr/lib/libpng12.so.0
libm.so.2 => /usr/lib/libm.so.2
libmp.so.2 => /usr/lib/libmp.so.2
libmd5.so.1 => /usr/lib/libmd5.so.1
libscf.so.1 => /usr/lib/libscf.so.1
libXext.so.0 => /usr/lib/libXext.so.0
libdl.so.1 => /usr/lib/libdl.so.1
libexpat.so.0 => /usr/sfw/lib/libexpat.so.0
libdoor.so.1 => /usr/lib/libdoor.so.1
libuutil.so.1 => /usr/lib/libuutil.so.1

ということやけど、いつかリベンジしたい。

2006年10月23日

●子プロセスが産まれへんらしい

シリアスで性質の悪い障害にもかかわらず、ぐぐっても出てこず、かつしょーもない原因でもあり、ハマるにはアホらしいので、記事にする価値はあるだろうと言うことで久々のコンピューター関係のエントリー。
perl 5.8.4 apache 2.2.0 solaris10 最下位モデル位のsun4uでの話。

業務で使っているwebサーバーがちょっと前からエラーを出すようになった。
機器とOSとシステムの選定から構築まで全部俺がやったというと聞こえはいいけど、用はあまっていた古いハードで、俺の趣味を存分に生かして作ったもの。
むちゃくちゃ古いハードに最新のOSと最新のサービスが突っ込んである。
落ちて当然のような気もするけど、愛着もあるので落としたくない。

症状としては掲示板にアクセスすると子プロセスが作れない旨のエラーを出してエラーコード500で止まると言うもの。
毎回落ちるのではなく、時々正常に動作するのが性質が悪い。

最初はDOS攻撃するワームがどこかで動いているのかと思ったけど、apacheのプロセスは死んでいないし、PHPは問題なくちゃんと動いているし、apacheのプロセス上限にきているわけでもない。
エラーを吐くのはperlのCGIのみ。
apacheに残るログは
「(12)Not enough space: couldn't create child process: 12: xxxxx.cgi ~」
「(12)Not enough space: couldn't spawn child process:/xxx/xxx/cgi-bin/xxx/xxx.cgi,~」
って感じ。何が「Not enough space」なのかと言うと、どうやらメモリらしく、子プロセス作られへんくらいに、実メモリ、仮想メモリを使い切ってるということらしい。

考えてみればこんな状態でも細々と息絶え絶えにでも動いているsolarisとsparcすげーと感心するも、とりあえずファイルベースのswapを割り当ててやるとまともに動き出した。

solarisの場合なら、

# mkfile 256m /export/swap
# swap -a /export/swap
で/export/swapとして256mのswap領域を追加。

# swap -l
# swap -a
でちゃんと追加されているのを確認。

再起動したら元に戻るので、適時/etc/vfstabに追記して起動時に/sbin/swapaddされるようにしてやる。
/etc/vfstabには

/export/swap - - swap - no -
と追加。

/sbin/swapaddが自動実行されるように

# ln -s /sbin/swapadd /etc/rc2.d/S99swap.add
ってのは強引か?

現象としては過負荷なので、本来なら隙を見て物理メモリを追加してやるか、ディスク増設してswap領域作ってやるの正道やと思うけど、手を加えるほどの価値のあるハードでもないので、別マシンにIIS+windowsでサーバーを作り直し、ドメイン統合認証を使いたいという色気が出てきた。

2006年05月11日

●netra VS Smart-UPS

今日もNetraネタ
以前の土偶家のサーバーultra5にはAPCのsmart-UPSが繋がっていたのだが、サーバーをnetraに変えてシリアルポートがRJ45になり、APC純正の、DS9メス⇔DS9オスのなケーブルが使えなくなった。
やっぱりサーバーたるものUPSを使わんとどうするか。と言う事でSmart-UPSとnetraを接続するケーブルを作る事にした。

APC純正ケーブルの結線はこのページに乗っており、

NetraのRJ45のピン配列はSUNにあるNetraのマニュアルに載っていた。

シリアルケーブルを真ん中でぶった切ってRJ45のコネクタを圧着しようかと思ったけど、ちょっともったいないので、
幸い、家にRJ45 を DS9に変換するアダプタが余っており、これをを分解してケーブルを半田付けし直してピン配列を変えてみた。
こんな感じのもの

結果、このアダプターをジェンダーチェンジャーを使ってUPSに挿し、そこからストレートのRJ45ケーブルでnetraに接続し、正常にUPSが制御できる結線は以下のようになった。

UPS側(DS9)-----netra側(RJ45)
2--------------6(黄) RXD
1--------------3(黒) TXD
9--------------4,5 (赤、緑)GND

DS9のピン番号とRJ45のピン番号が対応している訳ではなく、ピン番号よりも流れる信号(やGND)名でピンを特定する必要があるので、
同じようにケーブルや変換アダプタを作成される方は注意されたし。

風邪気味でなんかしんどいけど、変換アダプタが出来たので満足。
今日はさっさと寝る。

2006年05月05日

●Netra T1 105 でide HDDを使う

netra t1 105 imageとうとう「Sun Netra T1 105」をヤフオクで買った。
このマシンは以前にも述べたけど不肖土偶が今までのサーバーの筐体デザインの頂点だと思っているもので、ビデオ出力も、キーボード入力端子もなく、入出力がシリアルだけの正真正銘のサーバー専用マシン。なにしろメインターゲットにしていた顧客はプロバイダ。もうすでにワークステーションですらない。参考資料
平家物語ではないけど、俺が大学生の頃(5年くらい前)にはデザインと性能共にプロバイダ向けのサーバーマシンだったものが3100円で買えるのに諸行無常と盛者必衰の理を感じる。
こいつはディスクがSCSIなのだが、18X2とファイルサーバーを任せるには容量が少ないので、こいつで何とかideディスクを使おうというのが今回のお話。

このnetra T1 105 はSCSIディスクで構成する前提になっているのだが、cdromはide接続である。probe-ideすると確かにCD-ROMが見える。
当初の予定ではこのスリムCD-ROMの接続ケーブルを変換してideハードディスクを接続しようと考えていたのだが、ケーブルを作るのがまず大変な半田ごてテクを要求されそうなので素直に断念し、幸いこの「Netra T1 105」にはPCIバスが一枚分装備されているので、以前偶然にも手に入れたultra5で使用していた玄人志向のATA-100カードを使用する事にしてみる。その当時のエントリはこちら

Solarisで使用できるIDEカード(ATA100など)を所有しており、かつ、そのPCIカード経由でBOOTできるデバイスである。というのが前提条件となる。

  1. まず、接続されているHDDを全て取り外し、HDDのマウンタを今回使用するATA100のHDDに装着する。
  2. 筐体の上蓋を開け、言葉では伝わりにくそうだが、SCSIのSCAドライブの接続端子となっている板状の部分を上に抜き、筐体から取り外す。 土偶はケーブルごと筐体から外した。このため背面のSCSIコネクタが使用できなくなる。
  3. SCA端子に電源を供給している、4ピンのコネクタを取り外し、IDEのHDDの電源供給に使用する。(当然、赤(5V)、黄(12V)、黒(G)、黒(G)は同色のIDEコネクタの電源に対応する。) 土偶はケーブルを切断して壊れた電源から切り出したIDE-HDDの電源コネクタを半田漬けしたが、変換ケーブルを作成するのもありだろう。
  4. PCIのATA-100カードを装着する。
  5. HDDを前面スロットから挿入し、ATA-100カードからのIDEケーブルと電源コネクタを接続する。
これでboot cdrom もしくは適切にネットワークインストールサーバーがセットアップされていれば、boot net でsolaris10 01/06 がインストールできる。 ただしsolaris9以前のインストーラーはATA100のIDEディスクを見つけられず、インストールが進まない。

ただこのままではpromからboot diskで起動せず、probe-ideでディスクが見えないので
show-devs でPCIのデバイス名を確認した後、


nvalias disk /pci@1f,0/pci@1/pci@1/ide@f/disk@0.0
nvalias ide /pci@1f,0/pci@1/pci@1/ide@f

としてやる。
(ATA-100カードが /pci@1f,0/pci@1/pci@1/ide@f の場合)

ということで、土偶サーバーは近々このnetraに移転します。
しかしファンの音がやかましい…

2006年04月25日

●Solaris11 b37

以前DVDマルチドライブが壊れてDVDが焼けなくなったので、最近Solaris 11 Community Release のb37をメインマシンに入れた時にDVDバージョンではなく、CDバージョンを入れた。
しかしSUNのサイトのどこを探してもあるはずのlanguageCDが無い。
サーバー用途なら最初からCロケールしか入れないのだが、さすがにデスクトップ使いで日本語がないのは辛い。
日本語フォントは入ってて日本語入力も出来るものの、ダイアログというダイアログ。メニューというメニューがことごとく英語。
まぁ、これでも使えん事はないわ。と言う事でしばらく使ってたけど、やっぱり使いづらい。
言語パックのCDが無い以上、日本語パックを使うにははDVDバージョンをインストールするしかないようだ。

そういうわけで職場にDVD-Rを持って行って焼き、帰宅後にインストール。
インストール時にアップグレードインストールしようかどうか激しく迷ったのだが、/exportは別スライスにしてあるし、/opt/cswは/export/pkg-bin/cswへの、/usr/localは/opt/pkg-bin/localへのシンボリックリンクなので、これを再利用する事にして新規インストールした。
インストールする前のバージョンはb33+b37カーネルだったのだが、b37にしたところでちょっとだけdtloginの画面が変わっているだけで、殆どなにも変わっていない。
いつも心に太陽な「さとうタン」情報によればzfsが/で使えると言う話やけど、流石にそれをメインマシンでするのは…
でもやってみたい…

2006年03月23日

●devaliasで設定できるのはdisk,net,cdromだけではないらしい。

SUNのultra5やultra10などのPCIスロットを持ったワークステーションに、CMD649系のコントローラーチップを積んだATA-100カード(玄人志向ATA100PCI、Syba SD-SIL649など)が使え、ディスクアクセスが遙かに高速になるというのは有名やけど、
そのままの状態ではPROMからディスクが見えない。(いや、正確に言えば見えない事はないのだが…)
これをprobe-ideでリストする方法を書いてみる。

先ずデフォルト状態でprobe-ideコマンド。
当然のことながら、


ok probe-ide
Device 0 ( Primary Master )
Not Present

Device 1 ( Primary Slave )
Not Present

Device 2 ( Secondary Master )
Not Present

Device 3 ( Secondary Slave )
Not Present


てな感じになる。

一応これでもbootはするのだが、どうせならprobe-ideで見てみたい。
そこで


ok devalias ide /pci@1f,0/pci@1/ide@2
ってideデバイスエイリアスに挿したATAカードの実デバイス値をセットしてやると、
ok probe-ide
Device 0 ( Primary Master )
ATA Model: HOGEHOGE-DISK

Device 1 ( Primary Slave )
Not Present

Device 2 ( Secondary Master )
Not Present

Device 3 ( Secondary Slave )
Not Present

ok


ってな感じで見えるようになる。(実デバイスはshow-devsで探す)
ただこのままだと再起同時にideの値がリセットされてしまうので、そんなの嫌だという人は、

ok nvalias ide /pci@1f,0/pci@1/ide@2
ok setenv usr-nvramrc? true

としておけばいいのかな?

ちなみに、


ok devalias ide2 /pci@1f,0/pci@1/ide@2
ok probe-ide2
probe-ide2 ?

ok


ってのは効かないようだ。

2006年03月20日

●あなたの知らない世界

今日、良い意味でも悪い意味でもプチハッカーと呼ぶに差し支えのない某Y氏が来ていた。
就職が決まったのは良かったにしても、なんでも彼は、俺をしてサーバー筐体デザインの頂点だと言わしめる、Sun Netra T1 105を買うつもりだとという。
「俺を差し置いてヌケヌケと〜なにがネトラじゃー、ウルトラ1で十分。つか家のウルトラ1邪魔やし持って帰って」という必死の俺の説得も空しく、彼はより一層ネトラ購入の決意を強めたようで、目出度きかな目出度きかな。

以前電車に乗っていた時などによく聞こえた話。(驚くべき事に昔は電車にも地下鉄にも乗ったのだ。)
うら若き乙女や、青春真っ盛りの青年達が、携帯電話の型番で会話が成り立っているのを聞いて、全く理解できず、外国語を喋るヨソの国の人か、 暗号コードと乱数表片手に会話する工作員の様に見えた事があった。
彼らの言うNだとかSだとかDが何を意味し、50xだとか90xが法則性のある数字である事を知ったのはつい最近の事やけど、今日俺が某Y氏とSUNのワークステーションやらサーバーの話やらコンパイラやリンカの話で盛り上がっていた話も知らない人には同じように聞こえたに違いない。
「ssは32ビット、ultraから64ビット」「SS20のマザボには熊さんの絵が、SSIPXのマザボにはネコの絵がシルクプリントしてある。」「エンタープライズ450いっとけって。CPUホットスワップで1kwオーバーリタンダント電源やぞー」「/usr/ucb以下のゴロツキは使わずに/usr/ccs/以下を使う」等々
明らかに意味がわからんのはまだ良いとしても、携帯の話題なんかに引き替え、絶対女の子に好感も興味も持たれへん会話である事だけは間違いない。
ある意味で自宅にSparcを飼うと言う事を視野に入れるのは
「人間やめますか、それともSparc止めますか?」
に近い選択肢であることは私が経験から保証する。

引き返すなら今のうち…
とは言っても、入ってしまえば入ったで楽しい世界。
砂漠のごときスパークの荒野の天空には、沈まない(はずの)太陽が燦然と輝く。
さぁ皆様もおいでやす。さぁ、さぁ。

2006年03月11日

●プチ寝込む/ON 20060307

朝目が覚めると猛烈に気分が悪い。某氏の鬼太郎姿の雄姿を見に行くつもりだったのだが断念して寝込む事にする。
なんだか嫌な夢ばかり見て汗をかきまくったのが良かったのか、夕方前に起きてみた時に少々回復したのを感じた。

で、少し持ち直して先ずした事と言えば俺らしくOpenSolaris Currentのビルド。
寝込んでいる間に届いていたリーナス・トーバルスの『それがぼくには楽しかったから』を読みながら、20060307版のOpenSolarisのOSベース/ネットワーク部分をビルドする。
Changelogを読むとe1000gドライバのバグがいくつか潰されているようで、楽しみ。
しかしながらリリースノートには、デバッグモードでカーネルを動かさないとATAドライバが動かないと書いてあった。
なんかデバッグモードやとカーネルの動作が遅いような気がするんやけどなぁ。
さすがにATA読めないと激しく困るし諦めるとするか…

bfuインストール時にいくつかエラーが出て激しく焦ったが、ちゃんと動いているようで良かった良かった。

2006年03月03日

●OpenSolarisでx86とx64の選択boot

OpenSolarisのX86でかつx64限定の話やけど、デフォルトで64ビットカーネルになってるものを32ビットカーネルで起動する方法。
sparcの情報は結構あるけど、X86のは探したところ無かったので載せてみる。

32ビットでの起動方法と言うよりは、grubのブートローダーにカーネルオプションを渡す方法と言った方が正確かも。

起動時にgrubのstage2のメニューが出たら、

Solaris Nevada snv_33 X86
を選択した状態でeをしてエディットモードに入る。
kernel /platform/i86pc/multiboot
の行を選択した状態で もう一度eを押してエディット。
kernel /platform/i86pc/multiboot kernel/unix -B
に変えてエンターで確定。
bを押してbootする。
起動すれば32ビットカーネルが読み込まれているのが確認できる。

ちなみにハードウェアの再検索の場合は
kernel /platform/i86pc/multiboot -r

grubのメニューに表示したければ、

/boot/grub/menu.lst

title Solaris Nevada snv_33 X86 32-bit kernel
kernel /platform/i86pc/multiboot kernel/unix -B
module /platform/i86pc/boot_archive

を追加して
cd /boot/grub
installgrub -m stage1 stage2 /dev/rdsk/起動ディスク

「起動ディスク」は/etc/vfstabの / にマウントされてるデバイスでおおむねOK。

でも考えればsparcとほとんどカーネルパラーメーターが同じというのは良い作りやとほんまに思うぞ。

2006年03月02日

●64エクサのメモリなんか使わないと思う

この日もひたすら黒い土偶solarisいじり。

64ビット環境がうれしくて仕方ないのだが、isainfo -vk で見てみると、
64-bit amd64 kernel modules
となってる。
intelの64bitでもamd64なアーキテクチャということになるんやろうか?ちょっと不思議。ほんまに大丈夫か??

2006年02月19日

●サーバー移転してみた

今日もひたすら引きこもってコンパイルコンパイル…
勢いあまってサーバー移転した。
ハードを丸ごと変えて、Opensolaris snv_30 上にSun Cでコンパイルしたバイナリを動かしてる。
以前のメールシステムはpop before smtpだったのだが、今回はSMTP-AUTHに、POPも普通のpop3からAPOP対応にしてみた。
そんじょそこらのサーバーより、少なくとも職場のメールサーバーよりもセキュアだ。

しかしOpenSolarisってのは位置づけとしてSolaris11 のExpress版なので、とてもstableとは言えない。
perlモジュールのGDをコンパイルしてて思ったのだが、なんか/lib/ld.so.1にバグがあるような予感が…
ちょっと不安になってきた…
いくらセキュアにしたところでクラッシュすれば終わりやし…

2006年02月16日

●バルス?

何とかopensolaris(SunOS ultra5 5.11 snv_30 sun4u sparc SUNW,Ultra-5_10)上のSun Cでsamba3のコンパイル通した。

勝因は禁断のコマンドcrleを使ったおかげ。
下手に使うとshはおろかlsやrmすら使えなくなるから良い子は真似しない様にね。

コンパイラの使いそうな環境変数はLD_LIBRARY_PATHとCCだけをexport
CFLAGSやCXXFLAGSやLDFLAGSなどはunset
とした上で、
最後に禁断のコマンドcrleを。
crle -c /var/ld/ld.config -l /lib/:/usr/lib:/usr/local/lib

これで通った。

成せば成るもんですな。粘着した甲斐があった。
しかしそこまでgcc使わんのにこだわらんでも。と自分でも思う。

2006年02月11日

●買い出し

昼から四条に買い出し。本、パソ部品、電子部品とヲタグッズを買い漁る。
藤井大丸で服見ようかと思ったけど、一人で人混みを歩くのは色んな意味で耐え難いゆえ買い物を済ませるとすぐに帰宅。
天気が良かったので自転車漕ぐのは気分良かった。

amazon ASIN:4150308349 amazon ASIN:4150308330 買い出し品目の一つである『グイン・サーガ 106 ボルボロスの追跡』『グイン・サーガ外伝 20 ふりむかない男』を夕方から一気読み。我ながら無茶な読み方やと思うけど、106刊にもなって新たなでっかい複線張って大丈夫か?作者が死ぬまでに完結するのだろうかと不安になってきた。

600円で買ってきたDVDドライブはultra5でちゃんとデーター読めたし、ブートもした。
これでインストール時にCDを何枚も入れ替えんで済む。何でもやってみるもんやね。昔からSUNの純正CD-ROMを作ってきたメーカーである東芝製というのが良かったのかもしれんけど。

2006年02月04日

●関西弁変換

今日も例のごとくSolarisばかり触っているわけだが、コンパイルやpkg-add中に『百年の孤独』を読もうと試みるも、余りの字のちっこさと1ページ二段組みの構成に圧倒され、「ながら読み」は不可能と挫折。
我が家からWindows環境を廃し、完全フリー環境を目指すべく、メインマシンのクライアントをOpenSolaris環境に入れ替え、ファイルシステムをZFSにして、ビルドしたCurrentカーネルで動作させるも、デスクトップ機として普通に使ってる分には違いなんか判らんわい、ということにふと気づく。
ただ、OpenSolarisiになって商用系のソフトが全く無くなってるものやと思ってたけどなぜかATOKはそのまま乗ってる。しかもバージョン17とアップグレードしてる。ライセンスとかどうなってるのやろ?SUNが払ってるのか?
で、バージョンが上がったATOK for Solarisやけど、昔にちょっと話題になった「関西弁変換モード」が搭載されてるのに気づいた。しかも「北海道東北」「中部北陸」「九州」の変換モードもついている。
これはオモロそうや。ということで、思いつく限りの関西弁とその他地方の方言を入力してみる。
確かに「そんなあほなこと」と入力した時点で、「そんなアホなことおますかいな」と変換候補が出てくるが…そうそう、「そんなアホなことおますかいな」って入力したかってん。って、んなことあるかー。実際にこの機能が役に立つシチュエーションなんか絶対にないと思う。
そもそもOpenSolarisを使うような奴がここまでベタベタな関西弁を入力する必要性があるとは全く思えん。
桂ざこば、桂三枝、宮川大介花子、笑福亭鶴瓶。この辺は一発変換されるけど、これって関西弁じゃないと思うぞ…

2006年02月03日

●少女よ、起きなさい(solaris10で無線LAN)

Solaris10で無線LANが動いたぁ!!
知らない人は、なにをそんなに大げさに喜ぶことか、と思うだろうが、windowsとsolarisの間での使用できるデバイス環境の違いは、アメリカの郊外にあるような巨大スーパーマーケットと、チャウシェスク独裁政権時のルーマニア個人商店の商品の量ほどの差がある。
Windowsで当たり前のこともSolarisではありえん事として扱われるので、Solaris10で無線Lanカードがアクティブになるというのはキリストの秘蹟を目にしたかのような驚きとソラリスへの信仰心をかきたてる。
「タリタ・クム」と呼びかけられた無線LANカードはアクティブになってIPアドレスをもらうのである。ありがたやありがたや。

OpenSolarisになったからこそドライバを開発する人も現れたわけで、これはもうありがたい話以外の何者でもない。開発者にもサンマイクロにも感謝感謝。
開発者としてこういったコミュニティーに貢献することはできないけど、ちょっと探した感じ俺のやったような手順を述べてある文書は見つからなかったので、「How to use Wireless NIC for Solaris10」という感じの文書を公に出すことはちょっとくらいはそういったコミュニティーとSolarisの伝道に役に立つ事やと思うので書いてみる。

「How to use Wireless NIC for Solaris10」
まずOpenSolarisのWireless Networking for OpenSolarisプロジェクトから自分の持ってる無線LANカードのドライバを落としてくる。(土偶の場合はLucnt Technologies社Orinoco 11Mのカードで、ドライバはpcwl )
ドライバのインストール

# gtar zxvf pcwl-0.1-pkg.tar.gz
# pkgadd -d . SUNWpcwl

再起動後にカードを挿して再起動後にカードがアクティブにならない(PCカードスロットのドライバがない)場合は、ドライバを落とした所と同じ場所からPCMCIAのドライバをダウンロード(cardbusという名前)
cardbusドライバのインストール

#gtar zxvf cardbus-v0.2.tar.gz
# cd cardbus-v02
# ./Install

で再起動。

また同じ場所から無線LANの設定ツール(wificonfig)をダウンロードしていよいよ設定。

# gtar zxvf wificonfig-0.1-pkg.tar.gz
# pkgadd -d . SUNWwlanu

インストールが終了したら、インターフェイスpcwlをアクティブにする。
#ifconfig pcwl0 plumb
ifconfig -a でpcwlインターフェイスがいるのを確認したらこのインターフェイスに対して無線LANとしての設定を施す。
# wificonfig -i pcwl0 scan
で接続する先のアクセスポイントがあるのを確認した後、
# wificonfig -i pcwl0 createprofile essid=dogu encryption=wep wepkey1=wepkeydogu
などとessidがdoguの設定を作成後、
#wificonfig -i pcwl0 connect dogu
などとしてアクセスポイントに接続。
#ifconfig pcwl0 dhcp
などとしてIPアドレスなどをもらえれば完了。

注意点:
他にNICがある場合はifconfig iprb0 downなどとしてインターフェイスをダウンさせておかないと無線LANをデフォルトインターフェイスとして使ってくれない。

2006年01月29日

●また日は昇る

ブートローダーがGrubになった01/06版のsoalris10をノーパソに入れるつもりやったけど、結果から言うと失敗した。で、しょうがないので、旧版Solaris10の03/05をインストール。CSWからKDEとXfceもインストール。

Solaris9の頃にインストールしたきりSolarisをデスクトップクライアントとしてインストールしてなかったけど、10になって昔は日本語通すのに激しく苦労したXfceもちゃんと日本語化されてるし、SolarisでXFceとKDEが普通に使えるし、SUNがgrubを採用するし時代も変わるもんだと感心。
それでも、1/06版solaris10のgrubについてのFAQドキュメントの受け答えを見る限り、いくらGRUBを採用しようとSUNは相変わらず何かを答えているようで実は何も答えていない有様。
たとえばこんな感じ。


Q:
Can I boot from the network without a PXE/DHCP server?
A:
Yes, but only with some kind of local media (floppy or CD-ROM). You can create a GRUB floppy and configure the network via the GRUB command rarp or ifconfig, and download multiboot and boot_archive via tftp.

だからまともにネットワークブートするGRUBのディスクをどうやってる作るのだ?と聞いているのだ。馬鹿にしてんのか?SUNよ?
「淡路に行きたいんですけど?」と聞かれたJRの駅員が「電車に乗ればいい」と答えてるようなもんやで。それは。

soalris10 x86 01/06版の話については技術的な話になるので別エントリにした。
興味のある方はどうぞ。

2006年01月28日

●Solaris10 x86 01/06 インストール成功!!

やっとのことでノートパソコンに対する、solaris10 x86 01/06のネットワークブート&ネットワークインストールが成功したので、詳細を記す。

Solaris10 X86 01/06 ネットワークインストール概要

ネットブート対応のgrubでクライアントを起動
NICに,rarp,ifconigでアドレスを割り当て、
tftpサーバーからミニルートファイルシステム(x86.miniroot)をramディスク上に展開し、
tftpサーバーからカーネル(multiboot)を読み込んで起動。
その後、サーバーのNFSのインストールルートからインストールする。

インストールするノートPCのIPアドレスを192.168.1.x ホスト名をp226
インストールサーバーのIPアドレスは192.168.1.xx
DVDイメージのNFSルートは/mnt/s1
とした。

サーバーの準備
ダウンロードしたDVDイメージをISOファイルに結合。


$unzip -p sol-10-u1-ga-x86-dvd-iso-a.zip > sol-10-u1-ga-x86-dvd.iso
$unzip -p sol-10-u1-ga-x86-dvd-iso-b.zip >> sol-10-u1-ga-x86-dvd.iso
$unzip -p sol-10-u1-ga-x86-dvd-iso-c.zip >> sol-10-u1-ga-x86-dvd.iso
$unzip -p sol-10-u1-ga-x86-dvd-iso-d.zip >> sol-10-u1-ga-x86-dvd.iso
$unzip -p sol-10-u1-ga-x86-dvd-iso-e.zip >> sol-10-u1-ga-x86-dvd.iso

できたDVDのISOイメージをlofiマウント

# lofiadm -a $PWD/sol-10-u1-ga-x86-dvd.iso
/dev/lofi/1
#mount -F hsfs /dev/lofi/1 /mnt/s1

インストールサーバーのセットアップ

#cd /mnt/s1/Solaris_10/Tools/
#./add_install_client -i 192.168.1.x -e MACアドレス(00:00:の形式で) -s 192.168.1.xx:/mnt/s1 p226 i86pc
とすると自動でtftp,rpc.bootparamd,nfs共有などをしてくれる。

クライアントの準備
ブートディスクの作成
PCのLINUXかBSDでネットワークブートのGRUBディスクを作成するのだが、SolarisDVDに入っているGRUBではまともにブートしないので、ソースからコンパイルする必要がある。
土偶はSUSELINUX9.3で作成
ftp://alpha.gnu.org/gnu/grub/からgrubのソースを落としてくる。
grub-0.97.tar.gzが良いかと。grub-1.xx系はちゃんとコンパイルできんかった。
家のノートはIntelPro100のNIC搭載なので、--enable-eepro100 を追加。
その他のNICについてはソースツリーの netboot/README.netbootを熟読すべし。


tar zxvf grub-0.97.tar.gz
cd grub-0.97
./configure --enable-diskless --enable-eepro100
make

make installしてもよいけど、stage1とstage2のファイルが欲しいだけなので
ここは stage1/stage1 stage2/stage2のファイルをどっかにコピーした後、
Linuxでの場合。
# dd if=stage1 of=/dev/fd0
# dd if=stage2 of=/dev/fd0 seek=1

windowsの場合
copy /b stage1 + stage2 grubdisk.img
の後にできたgrubdisk.imgをRawWriteでフロッピにー書き込む。


作るのが面倒な方、X86での開発環境のない方は作成したイメージをアップロードしましたので、
GRUBのインストールディスクイメージ
どうぞ。

ブートディスクが作成できたらそのディスクでノートパソコンを起動。


grubのプロンプトから

ifconfig --address=192.168.1.x --mask=255.255.255.0 --server=192.168.1.xx
root(nd)
kernel /I86PC.Solaris_10-1/multiboot kernel/unix -B install_media=192.168.1.xx:/mnt/s1,install_boot=192.168.1.xx:/mnt/s1/boot
module /I86PC.Solaris_10-1/x86.miniroot
boot
インストール時にアドレスがない旨のメッセージが出てシェルに落ちたら、
ifconfig iprb0 192.168.1.x netmask 255.255.255.0 up
などとアドレスを振ってからexitする。

インストーラーが起動したら成功。


これで完璧!悲願達成!!
なんといっても一番ややこしかったのはGRUBのmakeでした…
でもこのおかげでGRUBのブートプロセスとネットワークブートについてちょっと詳しくなったぞ。

2006年01月27日

●Solaris10 x86 01/06 インストール顛末

ブートローダーがGrubになった01/06版のsolaris10をCDもDVDもついていないFDDだけがあるノートパソコンにネットーワークインストールしようという企画。
以前のSolaris10 03/05までは「Device Configuration Assistant」でそれは難なく可能やったけど、01/06でGRUBが採用されるにあたり、ブートフロッピーを作成するのが簡単でなくなった。
SUNのSolaris for x86 Boot Floppy (Device Configuration Assistant)にもイメージは上がっていない。
ブートサーバーをセットアップしてしまえば、後はクライアント側の問題になるから、結論を端的に言ってしまうとネットワークブートとintel pro100に対応したGRUBのフロッピーを如何に作るかというだけの問題になる。
これはSolarisの問題というよりはGNU grubの問題やん…

Solaris10 x86 1/06のDVDをシングルユーザーモードで起動し、SUNのドキュメントの通り、grubのブートディスクを作り、
フロッピーの作成


DVDドライブのついたデスクトップでDVDからシングルユーザーモードで起動後、
# mount -F pcfs /dev/diskette /mnt
# cd /boot/grub
# /sbin/installgrub stage1 stage2 /dev/rdiskette
stage1 written to boot sector on floppy
first 2 sectors of stage2 written on floppy
umount /mnt

作成したFDDでノートを起動後
(tftpサーバーは192.168.1.xx nfsサーバーは192.168.1.xxx クライアントのIPアドレスを192.168.1.xとする)
grubのプロンプトから


ifconfig --address=192.168.1.x --mask=255.255.255.0 --server=192.168.1.xx
root (nd)
kernel /multiboot.I86PC.Solaris_11-1 kernel/unix -B install_media=192.168.1.xxx:/export/setje/boot_74L2 module /x86.miniroot
boot

とやればいいのだろうけど、プロンプトからNIC設定をしようとする時点でifconfigコマンドも、dhcpコマンドも通らない。NICが見つからないようなことを言ってる。試しにローカルにコピーしたmultibootカーネル読んでブートするもminirootのファイルシステムもgenunixカーネルもないからすぐにパニック…
どちらにしろgrubでネットブートするにはドライバみたいなもんを読み込む必要があるのではないか?ということで調べてみた結果、ディスクレスブートと特定のNICに対応させるようにgrubをコンパイルする必要があるらしい。
幸い家には音楽再生用のSUSE Linuxがあるので、grubのソースから --enable-eepro100 --enable-disklessオプションでコンパイルを試みるもmakeが通らない。
もともと開発環境が入ってなかったので急遽gccとbisonを入れただけなのが悪いのか??
なんかSolarisとまったく関係ないところで躓いているのが腹立たしい。いつかGRUBコンパイルしてやる。
でも、誰かネットブート可能で、intel pro100対応のgrubのフロッピーイメージ下され…
とにかくGrubをコンパイルできる環境を探すことが必要なようだ。
また追記してゆく予定。

2006年01月25日

●Solaris10 01/06

12月後半から Solaris10 01/06版のダウンロードが始まってたらしい。
日本SUNのページには「Solaris 10 3/05 オペレーティングシステム」って書いてるからずっと見逃してた。なにしてんねん日本SUNよ。
01/06版は初期ロットの「Solaris 10 3/05」の安定版だという位置づけらしいけどKSCやSONYじゃあるまいし、初期ロットで十分安定してるような気がする。
でもまぁ、とりあえず落とし中。すげー遅いけど…
01/06版からX86のブートローダーにはGRUBが採用されたらしく。これはちょっと楽しみ。ノーパソにでも入れてみるか。
ちなみにZFSはまだ…
で、そのZFSってのはSUNの新しく開発したファイルシステムで、SUNいわく、
ブロック単位での64ビット・チェックサムによって、
99.99999999999999999%(9が19個)の信頼性を保ち、

ということらしいけど、きゅうじゅうきゅうてん、きゅうきゅうきゅうきゅうきゅう…って小学生の喧嘩でしか使わんような数値やん、SUNがなんとなく大人気ないと感じるのは俺だけだろうか…

2006年01月16日

●CSWgcc対SUN純正cc

特に書くことがないのでSun Studio 11でコンパイルしたバイナリと、gccでコンパイルしたバイナリの実行速度の比較結果を書いてみる。
apacheとmysqlとPHPで作ったWEBサーバーなんかは明らかにSun Studio 11バイナリのほうが動作が速い気がするけど、実際に数値で表す為にベンチマークを取ってみた。
作ったバイナリはmysql。ソースツリーの、sql-bench/内にあるスクリプトを使用。
Sun Studio 11のマシンはUltraSPARC-Ⅱi 330MHz mem 256mb、gccのマシンはUltraSPARC-Ⅱi 270MHz mem 512mb
と、比較になるのならんのかわからん構成やけど…今度は同じ環境でやってみる予定。
結果からいうとメモリが半分の256mbしかない「Sun Studio 11」バイナリのほうが35%ほど高速ということになった。
CPUの差はそれほどないけど、メモリの二倍差は大きいやろう…それを覆してこの結果。これは…思ったより早い気がする。
家のサーバー作り直したくなってきた…

詳細結果

Ultra5
UltraSPARC-Ⅱi 330MHz
mem 256mb
Sun Studio 11でコンパイル


Testing server 'MySQL 4.1.16' at 2006-01-15 22:22:22

Testing of some unusual tables
All tests are done 1000 times with 1000 fields

Testing table with 1000 fields
Testing select * from table with 1 record
Time to select_many_fields(1000): 50 wallclock secs (22.35 usr 16.72 sys + 0.00 cusr 0.00 csys = 39.07 CPU)

Testing select all_fields from table with 1 record
Time to select_many_fields(1000): 63 wallclock secs (22.55 usr 16.56 sys + 0.00 cusr 0.00 csys = 39.11 CPU)

Testing insert VALUES()
Time to insert_many_fields(1000): 8 wallclock secs ( 0.88 usr 0.13 sys + 0.00 cusr 0.00 csys = 1.01 CPU)

Testing insert (all_fields) VALUES()
Time to insert_many_fields(1000): 22 wallclock secs ( 0.14 usr 0.14 sys + 0.00 cusr 0.00 csys = 0.28 CPU)

Total time: 143 wallclock secs (45.94 usr 33.56 sys + 0.00 cusr 0.00 csys = 79.50 CPU)

Ultra5
UltraSPARC-Ⅱi 270MHz
mem 512mb
SMCgcc のgccでコンパイル


esting server 'MySQL 4.1.11' at 2006-01-15 22:25:43

Testing of some unusual tables
All tests are done 1000 times with 1000 fields

Testing table with 1000 fields
Testing select * from table with 1 record
Time to select_many_fields(1000): 79 wallclock secs (29.90 usr 29.08 sys + 0.00 cusr 0.00 csys = 58.98 CPU)

Testing select all_fields from table with 1 record
Time to select_many_fields(1000): 95 wallclock secs (30.01 usr 28.80 sys + 0.00 cusr 0.00 csys = 58.81 CPU)

Testing insert VALUES()
Time to insert_many_fields(1000): 15 wallclock secs ( 1.90 usr 0.29 sys + 0.00 cusr 0.00 csys = 2.19 CPU)

Testing insert (all_fields) VALUES()
Time to insert_many_fields(1000): 32 wallclock secs ( 0.43 usr 0.33 sys + 0.00 cusr 0.00 csys = 0.76 CPU)

Total time: 221 wallclock secs (62.26 usr 58.51 sys + 0.00 cusr 0.00 csys = 120.77 CPU)

2006年01月14日

●身も心も太陽に

最近SUNの純正コンパイラ「Sun Studio 11」がライセンスフリーになって誰でも使えるようになったというニュースがあった。Linuxの台頭に押されてSUNはsolarisをライセンスフリーにするだけでなくオープンソースにし、次は開発環境も事実上無制限にしたということらしい。
昔のSun WorkShopの時代に80万くらいした統合開発環境がなんとSun Studio 11になってタダ!いい時代になったもんだ…犬よそしてリーナスよありがとう。
昨日solaris10のCompanionCDに入っているgccとgmakeでコンパイルしたら一度のエラーもなく気持ち良かったという話をしたけど、今度はSUNのgccでなく、正真正銘のSUN純正コンパイラを使ってみようという気になった。

早速あまってたurtra5にsolaris10突っ込んで、Sun Studio 11インストール、Sun Studio 11のデフォルトのインストールディレクトリは/opt/SUNWspro/
CCは/opt/SUNWspro/bin/にccが、makeはdmakeてのがある。コンパイルにこいつを使えばよいのだろう。
c++filt f77 f90 f99CってコマンドがあるということはC++もFortran77もFortran99も入ってるってことやな。なんか知らんけどすげー

ということで早速apache2でもコンパイルしてみる。
コンパイルオプションは --enable-mods-shared=most --enable-ssl=shared --prefix=/usr/local/apache2 --enable-so --with-ssl=/usr/sfw
/opt/SUNWspro/bin/ccと/opt/SUNWspro/bin/dmakeを使った。
うむ、とりあえず上手くいった。ちゃんと動いてる。あまりに簡単に成功したので本当にSUN純正コンパイラでコンパイルできているのか?という一抹の不安は残るが…
sparc上のsolarisでSUN純正コンパイラで作ったバイナリは最強の速度やと言う噂やけど、apacheということもあるけど特によくわからん。まぁこの辺は自己満足の世界。次はmysqlでもコンパイルしてベンチでも取ってみるか。

sparcにsolarisにSUN純正コンパイラ…これで身も心もSun Microsystemsに売ったということになる…まぁ、SUNには一銭も払ってはいないけど…


参考までに
ldd /usr/local/apache2/bin/httpd
の結果は


libm.so.2 => /lib/libm.so.2
libaprutil-1.so.0 => /usr/local/apache2/lib/libaprutil-1.so.0
libexpat.so.0 => /usr/local/apache2/lib/libexpat.so.0
libapr-1.so.0 => /usr/local/apache2/lib/libapr-1.so.0
libuuid.so.1 => /lib/libuuid.so.1
libsendfile.so.1 => /lib/libsendfile.so.1
librt.so.1 => /lib/librt.so.1
libsocket.so.1 => /lib/libsocket.so.1
libnsl.so.1 => /lib/libnsl.so.1
libpthread.so.1 => /lib/libpthread.so.1
libc.so.1 => /lib/libc.so.1
libaio.so.1 => /lib/libaio.so.1
libmd5.so.1 => /lib/libmd5.so.1
libmp.so.2 => /lib/libmp.so.2
libscf.so.1 => /lib/libscf.so.1
libdoor.so.1 => /lib/libdoor.so.1
libuutil.so.1 => /lib/libuutil.so.1
/platform/SUNW,Ultra-5_10/lib/libc_psr.so.1
/platform/SUNW,Ultra-5_10/lib/libmd5_psr.so.1

という感じ。/lib以下のライブラリにしかリンクしていないのは非常に気持ちいい。でもopensslのライブラリにリンクしてないというのはヘッダだけ読んで、バイナリに内蔵したということやろね?たぶん?


まとめ
Sun Studio 11でのapacheのコンパイルの仕方。


#Sun Studio 11をインストール
CD1/installer

#ソースの解凍
gtar zxvf httpd-2.2.0.tar.gz && cd httpd-2.2.0

#コンパイル用環境変数設定(zshがシェルの場合。bashでも)
export PATH=opt/SUNWspro/bin:/opt/SUNWspro/prod/bin:\
 /opt/sfw/bin:/usr/sfw/bin:/usr/bin:/usr/sbin:/usr/ccs/bin:/usr/ucb
export CC=/opt/SUNWspro/bin/cc
export LD_LIBRARY_PATH=:/opt/SUNWspro/lib:/opt/SUNWspro/prod/lib:\
 /usr/lib:/usr/ccs/lib:/opt/sfw/lib:/usr/sfw/lib:/usr/lib:
export LDFLAGS='-L/opt/SUNWspro/lib -L/usr/lib -L/usr/ccs/lib -L/opt/sfw/lib -L/usr/sfw/lib -L/opt/SUNWspro/prod/lib'
export CFLAGS='-I/opt/SUNWspro/include -I/usr/include -L/opt/sfw/include -L/usr/sfw/include -I/opt/SUNWspro/prod/include'


#Makefile作る (好き好きでオプション変えれ)
./configure --enable-mods-shared=most --enable-ssl=shared --prefix=/usr/local/apache2 --enable-so --with-ssl=/usr/sfw

#makeとインストール
dmake
su
dmake install

2006年01月13日

●コンパイルはお通じが大事

仕事でsparcマシンにsolaris10入れてwebサーバー作ってるのだが、デフォルトで入っているapacheはDSOをサポートしておらず、phpは2バイト文字などないものとして扱われ、mysqlに至ってはlocalhost以外のネットワークに対応してない。
こんな腐れdaemon使いもんになるかーということで、ざくざくパッケージ消して枯山水の趣すらある侘びさびの効いたコンパイルオプションと、幽玄であるとしか言いようのない美しいツリー構造にソースからmakeしなおすことになるのは犬使いや悪魔使いには決して味わえない太陽使いだけの醍醐味な訳だ。(根本的な欠点だという噂もある…)

コンパイラは例のごとくSUN純正のccは使えないので、soalris9までやったらsunsiteとかから落として来たgccでコンパイルする事になるんやけど、solaris10コンパニオンのgccは使える!という風の噂も聞いたこともあり、たまにはSUN純正?のCompanionCDに入ってるgcc使ってやろう。ということで初めてCompanionCDから厳選に厳選を重ねたパッケージをインストールしてサードーパーティーのパッケージなしの環境を構築してみることにした。
もちろんgccだけじゃなくってgmakeとかautoconfとかも入れたけど、/opt/sfw/ とか /usr/sfw/とか訳わからんとこにバイナリを蒔かれるのはこの際目を瞑ろう。
で、今までのgccやったらちゃんと動くバイナリできるまでLD_LIBRARY_PATHとかLD_RUN_PATHとかCFLAGSとかと延々と格闘して、しまいにはブチ切れて ln -s /usr/local/lib/* /usr/lib/ & ln -s /usr/local/include/* /usr/include/ とかやってしまう羽目になるはずやねんけど、CompanionCDのgcc使ったら一回目のmakeが全て通った。apache proftpdはまだしも、mysql php postfixまで一回で通るとは気持ちよすぎる。ヘッダとかライブラリとかのリンクがちゃんと設定されてるだけなんやろうけど、それにしても凄すぎる。なんとお通じの良いコンパイラや!サンマイクロマンセー!!

というわけで、これからsolaris10でサーバー作る人は(すでに作った人も)ぜひともCompanionCD(のgcc)をインストールしよう。

2005年12月28日

●dogu.no-ip.orgのマスコット

膝に乗せてるのはSS10??