IPSサーバを立てて見る。その1

ちょっといろいろ試してみたくなったので、準備として Solaris11expressのIPSを
ローカルに立てて見ます。
なお、今回はnon-global zoneで実行しています。

まず、Oracleさんよりイメージを落としてきます。

で、そのページに書かれているとおりにISOイメージを作ります。


$ ls
sol-11-exp-201011-repo-full-iso-a.zip sol-11-exp-201011-repo-full-iso-b.zip
$ unzip sol-11-exp-201011-repo-full-iso-a.zip
Archive: sol-11-exp-201011-repo-full-iso-a.zip
inflating: sol-11-exp-201011-repo-full.iso-a
$ unzip sol-11-exp-201011-repo-full-iso-b.zip
Archive: sol-11-exp-201011-repo-full-iso-b.zip
inflating: sol-11-exp-201011-repo-full.iso-b
$ cat sol-11-exp-201011-repo-full.iso-a sol-11-exp-201011-repo-full.iso-b > \
sol-11-exp-201011-repo-full.iso

マウントして README を読みます。


$ pfexec lofiadm -a /var/tmp/sol-11-exp-201011-repo-full.iso
/dev/lofi/1
$ lofiadm
Block Device File Options
/dev/lofi/1 /var/tmp/sol-11-exp-201011-repo-full.iso -

$ pfexec mount -F hsfs /dev/lofi/1 /mnt
$ ls /mnt/
COPYRIGHT NOTICES README repo
$ more /mnt/README
...
2.1. Single image case
...
rsync -aP /mnt/repo
...
2.3. Using the repository data
...
svccfg -s application/pkg/server setprop \
pkg/inst_root=/repo
svccfg -s application/pkg/server setprop pkg/readonly=true

By default, pkg.depotd(1M) will listen for connections on port 80. You
can change this by executing the following command:

svccfg -s application/pkg/server setprop pkg/port=
...
svcadm refresh application/pkg/server
svcadm enable application/pkg/server
...

とりあえず、そのままIPSを立てる(ポート80)


$ pfexec mkdir -p /export/home/solaris11/2010.11
(chown を実行しとく。)
$ rsync -aP /mnt/repo /export/home/solaris11/2010.11
...
sent 4731619331 bytes received 5580093 bytes 1516146.40 bytes/sec
total size is 4704967847 speedup is 0.99
$
$ pfexec svccfg -s application/pkg/server setprop \
pkg/inst_root=/export/home/solaris11/2010.11/repo
$ pfexec svccfg -s application/pkg/server setprop pkg/readonly=true
$ pfexec svcadm refresh application/pkg/server
$ pfexec svcadm enable application/pkg/server

後は普通にブラウザでアクセスして動作確認。

試しに、Search を選択してみると


Package Search

Search functionality is not available at this time.

そのままだと使えないのね。。。

DotCloud 環境作り

DotCloud にてPSGIがサポートされたということで、Solaris11上にその環境を作ってみました。
くわしくは

○pythonbrew で Python入れる

pythonbrew

普段からperlbrewを使っている人には言わずもがな。
OSに入っているものなんて使ってられないよ〜、ということで。
なお、今回はDotCloudのマニュアルにはver2.6の記述があるので2.6.6を使いました。


失敗した。


$ curl -kLO http://github.com/utahta/pythonbrew/raw/master/pythonbrew-install
$ chmod +x pythonbrew-install
$ ./pythonbrew-install
pythonbrew required Python (2.4, 2.5, 2.6 or 2.7).
$

Python自体はOSのが入っているんだけどな〜と、pythonbrew-installの中を見ながら、、、自分のSolaris11にgunのsedが入ってないのでコケテました。


$ pfexec pkg install text/gnu-sed
$ ./pythonbrew-install
...
Please add the following line to the end of your ~/.bashrc
$
$ vi .bashrc
source $HOME/.pythonbrew/etc/bashrc (追記)

再ログイン後にインストール、、、失敗した。


$ pythonbrew install 2.6.6
...
ERROR: Failed to install Python-2.6.6.
$ more ~/.pythonbrew/log/build.log
...
Failed to find the necessary bits to build these modules:
_bsddb bsddb185 gdbm
linuxaudiodev ossaudiodev
To find the necessary bits, look in setup.py in detect_modules() for the module's name.


Failed to build these modules:
_curses _curses_panel sunaudiodev
$

まぁよく検索でひっかかどうでもよいモジュールにしか見えない。audioとかいらない。
( $ pkg install gdbm ぐらいはしたけど)

無視して強制インストール


$ pythonbrew install --force 2.6.6
...
Installed Python-2.6.6 successfully. Run the following command to switch to Python-2.6.6.
pythonbrew switch 2.6.6
$ pythonbrew switch 2.6.6
$ python --version
Python 2.6.6

○ DotCloud モジュールを入れる


$ easy_install dotcloud
$ dotcloud --version
DotCloud CLI version 0.3.1
$

これで環境作りは終わり。

NVIDIAなグラボの使い方

あまり知られていないと思いますが(単に私が知らないだけです)、Solarisを含めてUnix用の
グラフィックカードのドライバとして、NVIDIAさんはけっこうがんばってドライバを提供してくれていると思います。

NVIDIA:Unix Drivers

普段のデスクトップはWindowsSolaris/Linuxなんて、sshで触るとか、ちょっと設定さわる時しかGUI使わない!という人が大半なんだろうとは思います。

まぁ大体はOSに含まれているドライバでなんとかなるのですが、、、今回少しハマッタのでその作業メモも兼ねて。

nVidia Solaris x64/x86用ドライバ
上記のリンク先から辿れますが、ドライバのパッケージが3種類に分かれています。(2011/04)


Latest Version: 270.41.06
Latest Legacy GPU version (96.43.xx series): 96.43.19
Latest Legacy GPU version (173.14.xx series): 173.14.28
なので、自分が使おうと思っているH/Wから、使用するドライバを選びます。
今回は、"GeForce FX5700"という化石のようなグラボを頂いたので、それぞれのリンク先の"Supported products" を調べます。
=> Legacy GPU version 173.14.28 で使えることがわかります。


○Solaris11 Express にデフォルトで入っているドライバ


$ pkginfo |grep -i nvd
system NVDAgraphics NVIDIA Graphics System Software
system NVDAgraphicsr NVIDIA Graphics System Device Driver
$ pkginfo -l NVDAgraphicsr
PKGINST: NVDAgraphicsr
NAME: NVIDIA Graphics System Device Driver
CATEGORY: system,graphics
ARCH: i386
VERSION: 190.53,REV=2010.01.20.20.57
BASEDIR: /
VENDOR: NVIDIA Corporation
DESC: Kernel Drivers for NVIDIA Quadro graphics
INSTDATE: Mar 02 2010 12:51
HOTLINE: Please contact your local service provider
STATUS: completely installed
こんな感じ。まぁ、そこそこ新しいカードなら素のドライバでも動きそうです。
今回のものは、Legacyドライバなので動きませんでしたが。


○ドライバの入れ替えなどなど

  1. 新しいドライバの展開
  2. 新しいBEの作成
  3. 新しいBEのNVIDIAドライバの入れ替え
  4. 新しいBEでブート

という感じで実施しました。ここを参考に


$ wget http://us.download.nvidia.com/solaris/173.14.28/NVIDIA-Solaris-x86-173.14.28.run
$ sh NVIDIA-Solaris-x86-173.14.28.run -x
$ ls NVIDIA-Solaris-x86-173.14.28/
NVDAgraphics NVDAgraphicsr gfx_private install


$ pfexec beadm create -a solaris11-151a_nvidia
$ pfexec beadm mount solaris11-151a_nvidia /mnt


$ pfexec pkgrm -R /mnt NVDAgraphics
(失敗した)
$ pfexec pkgrm -R /mnt NVDAgraphicsr
(失敗した)
$ pfexec pkgadd -R /mnt -d .
...
Installation of was successful.
...
Installation of was successful.
$
$ cp -p gfx_private/SunOS-5.11/gfx_private /mnt/kernel/misc/
$ cp -p gfx_private/SunOS-5.11/amd64/gfx_private /mnt/kernel/amd64/
(chown とかは適時忘れないように)
$ pfexec beadm umount solaris11-151a_nvidia
$ pfexec init 6

※昔はpkgrmとか成功した記憶があったんですが、さっき試したら失敗した。(別H/W)
 まぁ上書きするので実害はないと思いますが、気持ち悪い。

リブート前に、/etc/X11/xorg.conf が存在するならrenameして置いて、デフォルト状態で立ち上がるようにしといたほうがいいと思います。

Content-Disposition

あまり気にしていなかったのですが時間があったので調べました。

○HTTPレスポンスのヘッダだけ表示する


$ wget -S --spider http://www.cpan.org/src/5.0/perl-5.12.3.tar.gz
スパイダーモードが有効です。リモートファイルが存在してるか確認します。
--2011-03-28 22:17:17-- http://www.cpan.org/src/5.0/perl-5.12.3.tar.gz
www.cpan.org をDNSに問いあわせています... 212.117.177.118, 199.15.176.140
www.cpan.org|212.117.177.118|:80 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています...
HTTP/1.1 200 OK
Server: Apache/2.2.3 (CentOS)
Last-Modified: Sat, 22 Jan 2011 02:40:28 GMT
ETag: "6c2006-e3df1b-49a664a231f00"
Cache-Control: max-age=1200
Content-Type: application/x-gzip
Content-Length: 14933787
Date: Mon, 28 Mar 2011 13:17:18 GMT
X-Varnish: 236805093 236804696
Age: 487
Via: 1.1 varnish
Connection: keep-alive
X-Served-By: eu3.develooper.com
X-Cache: HIT
X-Cache-Hits: 1
長さ: 14933787 (14M) [application/x-gzip]
リモートファイルが存在します。


○Url!=ファイル名 的なヤツのファイル名

http://.....download.php?current のようなやつは、HTTPヘッダ Content-Disposition
に記述されているそうな。


$ wget -S --spider http://alexgorbatchev.com/SyntaxHighlighter/download/download.php?sh_current
...
Content-Disposition: attachment; filename=syntaxhighlighter_3.0.83.zip
...
$ wget --content-disposition http://alexgorbatchev.com/SyntaxHighlighter/download/download.php?sh_current
$ ls
syntaxhighlighter_3.0.83.zip
$


○gitも同じ
--content-disposition を使わないと、master というファイル名で保存されると思います。


$ wget http://github.com/mikecrittenden/bluetrip/tarball/master --no-check-certificate \
--content-disposition
...
2011-04-24 14:58:19 (158 KB/s) - `mikecrittenden-bluetrip-990835d.tar.gz' へ保存完了 [28057/28057]


最近は wget より curl が好かれてる?

MacでDtraceを使ってみる

日常で Mac を使っていないので、どんな環境なのか?と確認してみました。


$ dtrace -V
dtrace: Sun D 1.6.2
と普通に入っています。ちなみに、Solaris11Express上には 1.6.3 が入っていました。


○DTraceToolkit は?

Solaris系であれば、/opt/DTT などDTTディレクトリに保存されています。
Macは、というと普通に/usr/bin のコマンドでいくつかは使われているようです。


$ grep -l dtrace /usr/bin/*
/usr/bin/bitesize.d
/usr/bin/clang
/usr/bin/cpuwalk.d
/usr/bin/creatbyproc.d
/usr/bin/dappprof
/usr/bin/dapptrace
/usr/bin/diskhits
/usr/bin/dispqlen.d
/usr/bin/dtruss
/usr/bin/errinfo
/usr/bin/execsnoop
/usr/bin/fddist
/usr/bin/filebyproc.d
/usr/bin/hotspot.d
/usr/bin/httpdstat.d
/usr/bin/iofile.d
/usr/bin/iofileb.d
/usr/bin/iopattern
/usr/bin/iopending
/usr/bin/iosnoop
/usr/bin/iotop
...

perlの場合


$ /usr/bin/perl -V:usedtrace
usedtrace='UNKNOWN'; # 対応していれば、'define' になります。

/usr/bin/perl はDTrace対応ではないようなので、Solaris同様自前で用意します。

○DTrace対応perlをインストールする


$ tar xf perl-5.12.3.tar.gz
$ cd perl-5.12.3
$ ./Configure -des -Duse64bitint -Dusedtrace
...

perlbrewで入れる場合


$ perlbrew install perl-5.12.3 -D=use64bitint -D=usedtrace

Solarisの場合は、"-D=useshrplib" をつけないとうまく拾えなかったのですが、Mac上だといらないようです。(もちろんあっても大丈夫)

○DTraceToolkit


$ wget http://www.brendangregg.com/DTraceToolkit-0.99.tar.gz
$ tar xf DTraceToolkit-0.99.tar.gz
$ cd DTraceToolkit-0.99
$ ls Perl
Readme pl_cpudist.d pl_flowinfo.d pl_subcalls.d pl_who.d
pl_calldist.d pl_cputime.d pl_flowtime.d pl_syscalls.d
pl_calltime.d pl_flow.d pl_malloc.d pl_syscolors.d


Tatsumaki で試してみる


$ cpanm --look Tatsumaki
$ cd eg/chat/
$ plackup
Twiggy: Accepting connections at http://0.0.0.0:5000/
...

アクセス


curl http://localhost:5000/chat/test


$ sudo ./pl_flow.d
C PID DELTA(us) FILE:LINE -- SUB
...
1 237 30 Tatsumaki/Handler.pm:29 -> prepare
1 237 28 Tatsumaki/Handler.pm:29 <- prepare
1 237 33 app.psgi:81 -> get
1 237 18 Tatsumaki/Handler.pm:234 -> render
1 237 38 Mouse/Meta/Method/Delegation.pm:35 -> render_file
1 237 45 Mouse/Meta/Method/Delegation.pm:35 -> render_file
1 237 47 Text/MicroTemplate/File.pm:94 -> render_file
1 237 37 Text/MicroTemplate/File.pm:48 -> build_file
...

この辺りは無難に動いてくれました。

perl 5.12.3 と DTrace

perl5123delta をざっと見ると、Solarisプラットフォーム のところに usedtrace の記述があります。

ということで、ついに Makefile.SH を書き換えなくても使えるようになったのです。

とりあえず、DTraceを使うコンパイルオプション


$ tar xf perl-5.12.3.tar.gz
$ cd perl-5.12.3
$ ./Configure -des -Dcc=gcc -Duse64bitint -Dusedtrace -Duseshrplib
...

perlbrewで入れる場合


$ perlbrew install perl-5.12.3 -D=cc=gcc -D=use64bitint -D=usedtrace -D=useshrplib

ちなみに、確認は Solaris11 Express 上です。

zoneがある場合の image-update について

非グローバルゾーンは、今のところBE系のコマンドが使えないと思われます。
また、当然グローバルゾーンと同じカーネルで動くものなので、カーネルのアップデートはこのあたりを踏まえてimage-updateする必要があります。

今回試したのは、OpenSolaris(snv_134b)からSolaris11 Express(snv_151a)へのimage-updateです。zoneは
グローバルゾーン以外に3つほどある状態です。

手順は以下で成功しました。

  1. グローバルゾーンで image-update
  2. グローバルゾーンから、pkg -R コマンドで非グローバルゾーンの image-update
  3. リブート
  4. 全てのゾーンが Solaris11(snv_151a)で立ち上がる

(素のsnv_134からだと、1. snv_134bへのimage-update、2. snv_151aへのimage-updateと上記を2回繰り返す必要があると思います。)

グローバルゾーンのimage-update


# pkg publisher
発行元 タイプ 状態 URI
solaris (優先) 起点 online http://pkg.oracle.com/solaris/release/
# pkg image-update -v --accept
snv_134bへのimage-updateのリポジトリ先は以下でよいです。

# pkg publisher
発行元 タイプ 状態 URI
opensolaris.org (優先) 起点 online http://pkg.opensolaris.org/release/


非グローバルゾーンのimage-update


# zfs list
...
rpool/ROOT/opensolaris 13.1M 432G 3.92G /
rpool/ROOT/opensolaris-snv_134b 16.4M 432G 4.70G /
rpool/ROOT/opensolaris-snv_134b-1 8.42G 432G 4.90G / # これが Solaris11のBE
...
rpool/zone/db/ROOT/zbe 916K 432G 482M legacy
rpool/zone/db/ROOT/zbe-1 293K 432G 504M legacy
rpool/zone/db/ROOT/zbe-2 736M 432G 504M legacy # グローバルゾーンのimage-updateで自動生成
...
rpool/zone/mail/ROOT/zbe 1002K 432G 482M legacy
rpool/zone/mail/ROOT/zbe-1 334K 432G 504M legacy
rpool/zone/mail/ROOT/zbe-2 736M 432G 504M legacy # グローバルゾーンのimage-updateで自動生成
...
rpool/zone/web/ROOT/zbe 1.54M 432G 486M legacy
rpool/zone/web/ROOT/zbe-1 301K 432G 509M legacy
rpool/zone/web/ROOT/zbe-2 740M 432G 509M legacy # グローバルゾーンのimage-updateで自動生成
...
グローバルゾーンのimage-updateで作成される新しいBEが opensolaris-snv_134b-1 ですがそれと同時に
非グローバルゾーンでも新しいzfsスナップショットが自動で作成されます。

rpool/zone/db/ROOT/zbe-2 736M 432G 504M legacy
rpool/zone/mail/ROOT/zbe-2 736M 432G 504M legacy
rpool/zone/web/ROOT/zbe-2 740M 432G 509M legacy
私の場合は、今まで動いていたzoneのROOTとして、*****/ROOT/zbe-1 がマウントされていました。(dfコマンドで確認できます)
なので、この新しいzfs領域に対してimage-updateします。

# mount -F zfs rpool/zone/db/ROOT/zbe-2 /mnt
# pkg -R /mnt set-publisher -P -g http://pkg.oracle.com/solaris/release/ solaris
# pkg -R /mnt unset-publisher opensolaris.org
# pkg -R /mnt image-update -v --accept
...
# umount /mnt
これを、各zoneの単位で実行します。 /mnt 以外にマウントして複数zoneを同時にimage-updateしても基本的のよいと思います。

後はリブートして完了。


公式の方法がどのドキュメントに書いてあるかイマイチ探せなかったので、実際はもっと手軽にできるかもしれませんが、とりあえず上記方法でもうまくいくと思います。