Solaris/Sparc

/ 6 ページを表示中 | [次のページ]

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

/ 6 ページを表示中 | [次のページ]