ZFSでNFSサーバ

玄柴(KURO-SHEEVA) が手に入りました。

ちょっと大きめなACアダプタぐらいのサイズで、armCPU 1.2G、メモリ 512MB/DDR2、フラッシュメモリ 512MB、というスペックで完全ファンレスLinux-BOXです。
ちなみに、 OSは ubuntu です。

保存領域が 512MBしかないため、今回はOpenSolarisNFSサーバとして使います。

初期状態では、aptの領域が tmpfsだったりしますので、今回は HOMEディレクトリと aptの領域をNFSでマウントします。

OpenSolaris NFSサーバ


$ pfexec zfs create rpool/kurosheeva
$ pfexec zfs create rpool/kurosheeva/home
$ pfexec zfs create rpool/kurosheeva/apt
$ pfexec zfs set sharenfs=on rpool/kurosheeva/apt
$ pfexec zfs set sharenfs=on rpool/kurosheeva/home

Linux NFSクライアント


root# apt-get install nfs-common
root# vi /etc/init.d/rc.local
...
ASYNCMOUNTNFS=no #追加。これがないとブート時のマウントに失敗する
root# vi /etc/fstab
...
#tmpfs /var/cache/apt tmpfs defaults,noatime # コメントアウト
[サーバのIP]:/rpool/kurosheeva/home /export/home nfs soft 0 0
[サーバのIP]:/rpool/kurosheeva/apt /var/cache/apt nfs soft 0 0

ちなみに、rootで作ったファイルは以下に見えてしまいます。(Linux側)


# ls -al /export/home/root/
drwxr-xr-x 3 4294967294 4294967294 12 Sep 4 21:02 kernel-2.6.32.2

4294967294 で検索するといくつか出てきますが、SolarisNFSサーバがOS間の違いをうまく吸収できていないのが原因なのかな?と。

一般ユーザでは問題ないので、とりあえずこのままで使ってみます。


zfs set sharenfs=root=hostname tank/filesystem
とか、uid/gid の問題とかややこしそうなところです。


Solaris
$ id nobody
uid=60001(nobody) gid=60001(nobody) groups=60001(nobody)
Linux
$ id nobody
uid=65534(nobody) gid=65534(nogroup) groups=65534(nogroup)

ThinkPad X61 を買いました

勉強会等に持ち歩いていたDynabookSSの調子が悪くなってきたので、Yオクで買いました。
3万円台で Core2Duo1.8Gマシンです。

実は、Core i を積んだ New Macbook Airが発表されるのを待っていたのですが、、、出るのを期待していいのか?、今週後半に社外セミナーがある、Dynabookがたまに立ち上がらない、という状況だったので繋ぎのつもりで買いました。

30日の夜に落札して、昨日の夜 届くという、迅速な対応をして頂いたので今はいろいろセットアップ中です。
予定では今日の夜にAmazonさんより増設メモリが届くはずです。

1.4 kgと多少重いのですが(それでも MacBook より軽い)、Hackathon にも参加できるぐらいパワフルなノーパソなのでガリガリ使っていきたいと思います。

そのうちSSDにもしようかと思います。
(外出用なので容量もいらないし)

Any::Moose Mooseと言ったらMouseのことです

先週末はYokohama.pmPerl Casualにお邪魔してきました。

CloudForecastは少し使ってみたいと思ったので、暇を見つけてインストしてみよう。

全裸ライブコーディングは、今まで見てきたライブコーディングの中では一番面白かったです。(print Debug はやっぱり、人それぞれです。)

一番気になったのがgfxさんのMooseの話。

個人的に "Mooseは重い、オレのサーバでは使い物にならない" という印象があって手を出していなかったんですが、ここ数ヶ月Plack/Tatsumakiばかり触っていて、"そういえば重さを感じないな〜"、と思い始めたところだったのでちょうどよい話題でした。

(今時、開発サーバのCPUが 500Mhz ってどうなのよ?という話もある)


$ time perl -e 'use Moose;'

real 0m2.632s
user 0m2.272s
sys 0m0.272s

複数回実行しても大体こんな感じ。useだけで2秒後半は、どうなのよ?


$ time perl -e 'use Mouse;'

real 0m0.466s
user 0m0.296s
sys 0m0.081s

Mouse速い。 というか、これなら使う気になる。

Tatsumakiの中のコードが、Any::MooseMooseとMouseのラッパーで、デフォルトMouseが動く)を使いまくっているので、ざっと読んでみるつもりです。


ちなみに Mooseのドキュメントは、JPA ドキュメント和訳プロジェクト(http://perldoc.perlassociation.org/)にあったり、モダンPerl入門の前半にもあるので、やる気さえあればモノにしやすいはずです。

 OpenSolarisのソースコードをゲットする その2

以前は、bitbucketのhgミラーから取得してましたが、更新が止まっているようなので無難にopensolaris.orgから頂くことにしました。


$ date;hg clone ssh://anon@hg.opensolaris.org/hg/onnv/onnv-gate onnv;date
Fri Jun 4 22:59:11 JST 2010
requesting all changes
adding changesets
adding manifests
adding file changes
added 12553 changesets with 144598 changes to 58533 files
updating working directory
42281 files updated, 0 files merged, 0 files removed, 0 files unresolved
Fri Jun 4 23:45:34 JST 2010

約45分ほど。


$ hg tags
tip 12552:cffa6779b402
onnv_141 12488:810a15c88f06
onnv_140 12378:fd645929e06e
onnv_139 12265:f199783d527a
onnv_138 12149:607008ac563e
onnv_137 12039:4ba188c68c06
...
onnv_112 9238:7546102cbe15
onnv_111 9062:fdba8b9800fa
onnv_110 8965:6adf6294c134
...

2009.06となった 111b というのはこの中にあるのだろうか?というのがちょっと気になりました。。。


$ hg log -r 9062
changeset: 9062:fdba8b9800fa
tag: onnv_111
user: Vikram Hegde
date: Mon Mar 16 21:18:21 2009 -0700
summary: 6808905 recursive mutex_enter in page_get_physical on xpv with BSST fork test

$ hg log -r 9063
changeset: 9063:a12fa8c43965
user: jmcp
date: Mon Mar 16 23:02:32 2009 -0700
summary: Added tag onnv_111 for changeset fdba8b9800fa

$ hg log -r 9238
changeset: 9238:7546102cbe15
tag: onnv_112
user: Seth Goldberg
date: Mon Mar 30 22:33:27 2009 -0700
summary: 6820505 npe_bus_map() should fall back from MMIO to IO mapping when needed

    • -

1時間ほど経ってからアップデートをしてみる。


$ hg pull
pulling from ssh://anon@hg.opensolaris.org/hg/onnv/onnv-gate
searching for changes
adding changesets
adding manifests
adding file changes
added 1 changesets with 10 changes to 10 files
(run 'hg update' to get a working copy)
$ hg update
10 files updated, 0 files merged, 0 files removed, 0 files unresolved
$
$ hg tip
changeset: 12553:e64e5d843075
tag: tip
user: Karen Rochford
date: Fri Jun 04 08:57:54 2010 -0500
summary: 6937869 seeing some memory leaks from xdrrdma_create()

changsetが 12552 -> 12553 にupdateされていました。
時間も差分アップデートなので数秒で完了。

高速ソースコード検索エンジン OpenGrok

何気に OpenGrokの導入は3回ぐらい挫折しています。
理由はただ一つ perlな人にとって、java/Servlet? 環境の構築は何かでツマヅクと何をどうしたらいいのか大変で・・・挫けてしまう。
さらに、google検索でひっかかるページは、基本的に java な人のページなので、すごい省略しててどうにもならんのです。

OpenGrokプロジェクト(http://hub.opensolaris.org/bin/view/Project+opengrok/

今回はやっと成功したので次回用のメモも兼ねて書きます。
(http://src.opensolaris.org/source/xref/opengrok/trunk/doc/EXAMPLE.txt を参考にしています)

したことは基本的に以下の4つ

  1. 必要なパッケージのインストール
  2. OpenGrokを使って、検索用のindexとconfigファイルを作る
  3. OpenGrok付属の source.war を rebuild する(上のconfigのパスを記述するだけ)
  4. Tomcat の webapps ディレクトリに source.war を入れてブラウザアクセスする

1. 必要パッケージをインストールする


$ pfexec pkg install SUNWj6rt # JDK 6.0 Runtime(1.6.0_13)
$ pfexec pkg install SUNWtcat # Tomcat 6.0.18
$ pfexec pkg install exuberant-ctags # Exuberant Ctags
ちなみに、Exuberant Ctags は SunStudio を入れているならそのパッケージ内にも入っているので、そっちを使ってもいいと思います。

2. /opengrok/data にindex情報、/opengrok/configuration.xml を作ります。
ディレクトリは以下で作ります。


/opengrok

-- bin
-- web
`-- source # source.war のrebuild用
-- data

`-- source
|-- onnv-gate # ソースコード; hg clone http://bitbucket.org/mirror/onnv-gate/ とかで
`-- perl-5.10.1 # ソースコード; wget http://www.cpan.org/src/perl-5.10.1.tar.gz から

検索時、source以下のディレクトリ名 = "Project名" になります。
今回は onnv と perl-5.10.1 をProjectとして登録します。


$ mkdir /opengrok
$ mkdir /opengrok/bin
$ mkdir /opengrok/data
$ mkdir /opengrok/source
$ mkdir /opengrok/web
$ mkdir /opengrok/web/source
(ソース以下はプロジェクトとして用意)
$ ls /opengrok/source/
onnv-gate/ perl-5.10.1/
$ cd /tmp
$ wget http://hub.opensolaris.org/bin/download/Project+opengrok/files/opengrok%2D0.8.1.tar.gz
$ gzip -cd opengrok-0.8.1.tar.gz | tar xf -
$ cd opengrok-0.8.1
$ cp -r opengrok.jar lib /opengrok/bin
$ java -jar /opengrok/bin/opengrok.jar -W /opengrok/configuration.xml \
-c /usr/bin/exctags -P -S -v -s /opengrok/source \
-d /opengrok/data

Scanning for repositories...
Done searching for repositories (1s)
Writing configuration to /opengrok/configuration.xml
Done...
...
Adding: /onnv-gate/usr/src/xmod/xmod_files (PlainAnalyzer)
Apr 6, 2010 9:39:07 PM org.opensolaris.opengrok.index.IndexDatabase optimize
INFO: Optimizing the index ...
Apr 6, 2010 9:39:28 PM org.opensolaris.opengrok.index.IndexDatabase optimize
INFO: done
Apr 6, 2010 9:39:34 PM org.opensolaris.opengrok.index.IndexDatabase createSpellingSuggestions
INFO: Generating spelling suggestion index ...
Apr 6, 2010 9:40:13 PM org.opensolaris.opengrok.index.IndexDatabase createSpellingSuggestions
INFO: done
$

3. source.war を rebuild します


$ cd /opengrok/web/source
$ unzip /tmp/opengrok-0.8.1/source.war
$ vi WEB-INF/web.xml
...

CONFIGURATION
/opengrok/configuration.xml
...
$ cd /opengrok/web/source
$ zip -r /opengrok/web/source.war .

4. tomcat で検索画面を表示する


$ pfexec svcadm enable tomcat6
$ cd /var/tomcat6
$ pfexec mv webapps webapps_org
$ pfexec mkdir webapps
$ pfexec chown webservd:webservd
$ pfexec mv /opengrok/web/source.war webapps/

後は、http://サーバのアドレス:8080/source/ にアクセスして完了。

snv_111bから134へアップデートしたら、ブート後に無応答になってるし

ここ(http://d.hatena.ne.jp/handler/20100326/1269611754)の続き

image-update 中にポロポロエラーを出力していますが、無視して新しいBEでリブート。
何気に CUIのログイン画面まで立ち上がり、gdmが動きかけて無応答になりました。

調査中です。。。

○シングルユーザモードで立ち上げる。
(http://d.hatena.ne.jp/handler/20091127/1259250077)とほぼ同じ手順で


kernel$ /platform/i86pc/kernel/$ISADIR/unix -B $ZFS-BOOTFS -s

で立ち上げます。
=>問題なし。

○マルチユーザモードに変更します。


svcadm milestone multi-user-server

=>問題なし。

○gdm立ち上げます


svcadm enable gdm
コマンドが返ってこない。。。他のsshセッション切れる。。。
=>死亡。

messagesの内容とか image-update時の内容を検索すると、defect.opensolaris.org の BugIDがHITするので、まったり読んでいこうかと思います。

先にリリースノート読んだほうがいいかな?

とりあえず snv_134のLive CD(http://www.genunix.org/)でXが立ち上がるか確かめようと思います。

      • -

2010-4-2 追記

結果として、Live-CD でも同じ現象になりました。
で、そうなると driver周りが怪しそうな感じなので、Live-CD から VESAモードで立ち上げたところ、gdm が無事立ち上がりました。

なので、HDD内も VESAで立ち上がるように変更して完了。


kernel$ /platform/i86pc/kernel/$ISADIR/unix -B $ZFS-BOOTFS -s # シングルユーザモードで立ち上げる
...
# su -
# svcadm milestone multi-user-server # ZFSのマウント
# /usr/X11/bin/Xorg -configure
# cp xorg.conf.new /etc/X11/xorg.conf
# vi /etc/X11/xorg.conf
-Driver "intel"
+Driver "vesa"
# svcadm milestone -d

Intel 855GMチップセットがダメなのかな〜?

perl 5.10.1 でdtrace環境構築

#dtraceday 記念。

perl と dtrace についてですが、perl5.8.8はSunの人からpatchが公開されていました。

最新バージョンの perl5.10.1(releaseから、半年以上経ってますが) ではpatchなしでコンパイルオプションを指定することで利用可能です。
(そのまま取り込んだ感じ?http://blogs.sun.com/alanbur/date/20050909

ただ、Makefile内の依存関係にバグがあるので(既にチケット切られててパッチがある?)
少し手直しがいります。

そのままコンパイルすると、以下のように miniperl作るのにperldtrace.o がないと言われます。


$ make
...
/usr/bin/cc -L/usr/lib -L/usr/ccs/lib -L/opt/sunstudio12.1/prod/lib -L/lib -L/usr/local/lib -o miniperl \
gv.o toke.o perly.o pad.o regcomp.o dump.o util.o mg.o reentr.o mro.o hv.o av.o run.o pp_hot.o sv.o pp.o scope.o pp_ctl.o pp_sys.o doop.o doio.o regexec.o utf8.o taint.o deb.o universal.o xsutils.o globals.o perlio.o perlapi.o numeric.o mathoms.o locale.o pp_pack.o pp_sort.o \
miniperlmain.o opmini.o perlmini.o -lsocket -lnsl -ldl -lm -lpthread -lc
Undefined first referenced
symbol in file
__dtrace_perl___sub__entry pp_hot.o
__dtraceenabled_perl___sub__return pp_hot.o
__dtraceenabled_perl___sub__entry pp_hot.o
__dtrace_perl___sub__return pp_hot.o
ld: fatal: symbol referencing errors. No output written to miniperl
*** Error code 1
make: Fatal error: Command failed for target `miniperl'

ということで、以下の手順でmakeします。


$ wget http://www.cpan.org/src/perl-5.10.1.tar.gz
$ gzip -cd perl-5.10.1.tar.gz | tar xf -
$ cd perl-5.10.1
$ chmod 755 Makefile.SH # 書き込み権限をつけてます。
$ vi Makefile.SH

○変更前


...
mini_obj = $(obj1) $(obj2) $(obj3) $(ARCHOBJS)
ndt_obj = $(obj0) $(obj1) $(obj2) $(obj3) $(ARCHOBJS)
obj = $(ndt_obj) $(DTRACE_O)
...
○変更後

...
mini_obj = $(obj1) $(obj2) $(obj3) $(ARCHOBJS) $(DTRACE_O)
ndt_obj = $(obj1) $(obj2) $(obj3) $(ARCHOBJS)
obj = $(obj0) $(ndt_obj) $(DTRACE_O)
...


以下は/usr/local以下にインストールする場合です。
ポイントは、"-Dusedtrace" になります。


$ ./Configure -des -Dcc=/usr/bin/cc -Dusethreads -Dprefix=/usr/local \
-Duse64bitint -Duseshrplib -Dusedtrace
$ make
/usr/sbin/dtrace -h -s perldtrace.d -o perldtrace.h
...
$ make test
...
t/x2p/s2p.....................................................ok
All tests successful.
u=2.21 s=1.45 cu=279.20 cs=22.38 scripts=1665 tests=234334
$ pfexec make install

こんな感じに perlプロバイダが見えるようになるので使えているはずです。


$ perl -e 'sleep 60' &
[4] 22551
$ pfexec dtrace -l |grep -i perl
65296 perl22511 libperl.so Perl_pp_sort sub-entry
65297 perl22511 libperl.so Perl_pp_dbstate sub-entry
65298 perl22511 libperl.so Perl_pp_entersub sub-entry
65299 perl22511 libperl.so Perl_pp_last sub-return
65300 perl22511 libperl.so Perl_pp_return sub-return
65301 perl22511 libperl.so Perl_dounwind sub-return
65302 perl22511 libperl.so Perl_pp_leavesublv sub-return
65303 perl22511 libperl.so Perl_pp_leavesub sub-return
65346 perl22551 libperl.so Perl_pp_sort sub-entry
65347 perl22551 libperl.so Perl_pp_dbstate sub-entry
65348 perl22551 libperl.so Perl_pp_entersub sub-entry
65349 perl22551 libperl.so Perl_pp_last sub-return
65350 perl22551 libperl.so Perl_pp_return sub-return
65351 perl22551 libperl.so Perl_dounwind sub-return
65352 perl22551 libperl.so Perl_pp_leavesublv sub-return
65353 perl22551 libperl.so Perl_pp_leavesub sub-return
$