2008年12月19日金曜日

vserver + aufs その後

vserverのディレクトリをaufsで共有することで複数のvserverを立ててもディスクへの圧迫が小さいようにする.

まずテンプレートとなるvserverをつくっておく.centos で

> vserver template build -m yum --hostname xxx --interface ech0:xxx.xxx.xxx.xxx/24 -- -d centos5
で,これをcloneする.
> vserver newone build -m clone --hostname xxx --interface ech0:xxx.xxx.xxx.xxx/24 -- --source /vservers/template
これでできたnewoneができたわけだがここでできたディスクは使わないで消す. で,/tmp/newone に空のディレクトリを作ってこれをtemplateのディレクトリにかぶせてマウントする
mount -t aufs -o br:/tmp/newone:/vservers/template=ro none /etc/vservers/newone/vdir
とやる.で起動すると起動するには起動するが,
WARNING: '/etc/vservers/newone/vdir/bin/cat' does not end on newline
こんなエラーが無限にでる.結構はまってしまったが,/etc/vservers/newone に直接vdirをマウントしてしまったのが良くなかったらしい.configurationファイルを探すスクリプトが,findでvdirの中身を全部スキャンしていた.だから一度別のところにマウントしてからsymlinkを張ればよい.
mount -t aufs -o br:/tmp/newone:vservers/template=ro none /mnt/newone
ln -s /mnt/newone /etc/vserver/newone/vdir
さらに既存の/usrや/homeをマウントしたいaufsでマウントするベースディレクトリにbindでマウントすればいいかなと思い,
mount --bind /usr /tmp/newone/usr
とやってみたが,うまく行かない.どうもaufsでマウントするともとのブランチのbindマウントされている点は全部無視されてしまうようだ.aufsのマニュアルにはこれを使ってブランチをaufsの外からいじれなくするハックが書かれている.

でどうしたかというと,aufsでマウントしたところに,あとからbindしてみた.こちらはうまく行く.

mount --bind /usr /mnt/newone/usr
ただしこの場合 vserver のなかで/usrに書き込むと,大本の/usrに書き込まれてしまう.これはうまくない.が今のところ解決法が見当たらない.

2008年12月17日水曜日

Jam

C++ のライブラリ boost のビルドに使われているビルドツール http://en.wikipedia.org/wiki/Perforce_Jam http://freetype.sourceforge.net/jam/index.html - #includeを読んでdependencyを自動的に解析してくれるらしい.そりゃ便利だ. - オリジナルのJamと改良版のFT Jamというのがあるらしい.FTはFreeType. texのようなツールか? - kjamという別実装もあるようだ. - boost でつかわれているのは bjam というもので,また微妙に違うものらしい. - ここに簡単な言語のチュートリアルがある. http://www12.ocn.ne.jp/~dante98/bbv2-tutorial.html

dpkg

インストール済みパッケージ一覧
dpkg -l 
パッケージでインストールされたファイルの一覧
dpkg -L PACKAGE_NAME

2008年12月16日火曜日

vserver + aufs

vserver に stackable file system の一つであるaufsを組み合わせてみる.aufsはanother union file system の意.linuxにはunionfs というstackable file systemがありカーネルへのマージも予定されていたりするらしいのだが,aufsのほうが安定している,という話もあるようなので,いろいろ迷うところ.aufs は日本人の方が開発なさっているようだ. CentOS 5.2にvserverをいれた環境に入れてみる.aufsはsourceforgeでホストされているのだが,ダウンロードは用意されていなくて,cvsからチェックアウトするしか無い.cvsとはいってもstable版のみ置くようにしているということなので安心.その割には毎週月曜更新という頻度が逆にちょっと怖い.

google して参考になりそうなサイトを発見.ありがたいことだ.

  1. NFS と AUFS (Another Unionfs) を使って、ディスクレス (diskless) サーバ群からなる低コスト・高可用な大規模負荷分散システムを構築する
  2. CentOS で aufs (another unionfs) を使う
  3. OpenVZ でunionfsを使ってみた
インストール 結構手間取った.vserverだったから.まず,kernelのソースをインストールしておく.vserverをyumで入れていれば,そのまま
  yum install kernel-devel  
で入るはず. 次に参考リンクの1に従って,ディレクトリを掘り,cvsからチェックアウト.make -f local.mk で カーネルもジュールができるはずなんだけど,コンパイルエラー.vfs_xxxxの類いの関数が軒並み too few argument になっている.確かにincludeファイルの方は3引き数なのに,aufsのソースは2引数で呼ぼうとしていたり.googleでいろいろ調べてみると本来2引数なのに,vserverが3引数にしているらしい.

よくパッケージを見るとpatchディレクトリにvserver用のパッチがある.これをaufsのソースに当てればよさそうだ.aufsのメイリングリストにも,vserverと組み合わせてアクティブに使われている方がいるようだ.非常に心強い.

patch -p 0 < patch/vserver-2.6.22.19-vs2.2.0.7.patch 
ところが,パッチあて失敗.どうもパッチとソースコードのバージョンの対応がとれていないようだ.幸い,失敗している部分はちょっと行がずれているだけで,見ればわかるようなものだったので,ソースを手で修正.makeするとaufs.koができる.
> mkdir /lib/modules/2.6.22.19-vs2.3.0.34.1/kernel/fs/aufs
> cp aufs.ko /lib/modules/2.6.22.19-vs2.3.0.34.1/kernel/fs/aufs
> depmod -a
でモジュールのデプロイ完了.これでとりあえず動くようになった.すばらしい.

ヘルパスクリプトのインストール

マニュアルに従って.
> install -m 500 -p mount.aufs umount.aufs auplink aulchown auchk /sbin
> install -m 644 -p etc_default_aufs /etc/default/aufs
> more /etc/default/aufs 
> echo FLUSH=ALL > /etc/default/auplink

vserverとの組み合わせ

まだ組み合わせて使ってみていないのだけど,MLには時々変なことがおこるようなことが書いてある.どうも,vserverのディレクトリをaufsで構築し,vserverごとdestoryすると正規の手続きを踏まずにumountされることになっておかしなことになるらしい. 注意しないと.

2008年12月15日月曜日

vserver hashify

vserver には複数の仮想環境のファイルをハードリンクする機能がある.むかしはunifyと呼ばれる機能があった.多分これはファイル名をキーにして同じかどうかを判別していたのだと思われる.その後追加されたのがこのhashifyでこちらは,ファイルのハッシュ値を使って同一性を判別するようだ.

こちらのFAQを参照して,vserver2とvserver3をunifyしてみる.

まず準備として,hashifyが利用するディレクトリを作る.

> mkdir /etc/vservers/.defaults/apps/vunify/hash /vservers/.hash
> ln -s /vservers/.hash /etc/vservers/.defaults/apps/vunify/hash/root
ただし,私の環境では,1行目で作っているディレクトリはすでに存在した.

次に,各仮想サーバのほうにもディレクトリを作る.

> mkdir /etc/vservers/vserver2/apps/vunify
> mkdir /etc/vservers/vserver3/apps/vunify
で,仮想サーバを起動しておいて,順次hashifyする.動作中のをいじるのは怖いような気もするが,逆に停止中だとhashifyできない.
> vserver vserver2 hashify
Duplicate hash-dir entry 'root' found
> vserver vserver3 hashify
Duplicate hash-dir entry 'root' found

効果は?

duの値を比べてみる.
hashify 前
  vserver2: 260736 
  vserver3: 254308 
hashify 後
  vserver2: 257304 
  vserver3: 199300 
vserver3は大きく減っている.といっても20%程度だが.そもそもvserver3はvserver2をクローンしたものなのに,これだけしか減らないというのも不思議な話だ.

2008年12月14日日曜日

java class ファイルのバージョン

mac osであれば, file コマンドでわかる.javap -v でも分かるらしい.
$ file test.class
test.class: compiled Java class data, version 50.0
バージョン番号とJDKの対応は
48  - JDK 1.4
49  - JDK 1.5
50  - JDK 1.6
ということ.

2008年12月6日土曜日

Eclipse 起動せず

気がついたらMac上で,eclipseが起動しなくなっていた... 基本的に一度立てたら立てっぱなしなので,なにが原因なのかわからないのだが,今朝software updateして再起動している. いろいろ調べてみると,eclipseはmacの64bitのJVMでは動かないらしい.しかたなくdefaultのjavaを
/Utilities/Java/Java Preferences 
で32bitの1.5に切り替えたりもしてみたのだが,なんかうまく動かん.うーん面倒くさい. 結局 eclipse/Eclipse.app/Contents/Info.plist のなかに,それらしい部分があったので,コメントアウトされている1.5の設定をアンコメントして復旧.しかし面倒だなあ.