1コマンドでJavaアプリをOSvへデプロイ

OSvは、ハイパーバイザやIaaSプラットフォームへアプリケーションをデプロイすることに特化した軽量OSです(※詳しくはこちら)。
また、CapstanはGo言語で実装されたOSvのデプロイツールです(※詳しくはこちら)。

OSvはJVM上で動くアプリケーションをメインターゲットとして開発が進められており、様々なJavaアプリケーションが動作します。
この記事ではCapstanの開発版を使って1コマンドで任意のJavaアプリからOSvのディスクイメージを生成&実行してみます。

Goをインストー

sudo yum install go
export GOPATH=~/go

コマンドラインFedoraの例です。ディストリごとにパッケージマネージャのコマンドは異なります。

Capstan開発版をインストー

go get github.com/cloudius-systems/capstan
go install github.com/cloudius-systems/capstan

これで~/go/bin/にCapstanがインストールされました。
PATH指定を省略してCapstanを呼びたい場合は~/go/binにPATHを通して下さい。
その際、既にバイナリ配布版のCapstanをインストールしている場合はPATHが異なることに注意して下さい(バイナリ配布版は~/bin)。

Rhinoを試す

まずは単一のjarで配布されているRhino Javascriptインタプリタを試します。

wget ftp://ftp.mozilla.org/pub/mozilla.org/js/rhino1_7R2.zip
unzip -x rhino1_7R2.zip
~/go/bin/capstan run rhino1_7R2/js.jar

capstan run によってOSv+JVMディスクイメージにjarファイルがコピーされ、KVM上で実行されます。
実行が開始されると、OSvの起動メッセージの後にRhinoが起動してくるのでJavaScriptで遊んでみます。

Downloading cloudius/osv-openjdk/index.yaml...
160 B / 160 B [=====================================================] 100.00 % 0
Downloading cloudius/osv-openjdk/osv-openjdk.qemu.gz...
74.34 MB / 74.34 MB [===========================================] 100.00 % 3m16s
Building js...
Uploading files...
1 / 1 [=============================================================] 100.00 % 0Created instance: js
OSv v0.16
eth0: 192.168.122.15
Rhino 1.7 release 2 2009 03 22
js> print("Hello World");
Hello World
js> 1 + 2;
3
js> quit();

複数のjarファイルからなるプログラムを実行してみる

One-JARを使うと複数のjarファイルを一つにまとめることが出来るようなので、これを使ってApache FtpServerを一つのjarにまとめてOSvへデプロイしてみます。

まずFtpServerとOne-JARをダウンロードしてきて解凍します。

wget http://ftp.riken.jp/net/apache/mina/ftpserver/1.0.6/dist/ftpserver-1.0.6.zip
unzip -x ftpserver-1.0.6.zip
cd apache-ftpserver-1.0.6
wget http://jaist.dl.sourceforge.net/project/one-jar/one-jar/one-jar-0.97/one-jar-boot-0.97.jar

まとめたjarファイルを作るための一時ディレクトリを./rootに作成し、ここのjarファイルをコピーします。

mkdir -p root/main
mkdir -p root/lib
cp common/lib/*.jar root/lib
mv root/lib/ftpserver-core-1.0.6.jar root/main/
cd root
jar xvf ../one-jar-boot-0.97.jar
boot-manifest.mf

boot-manifest.mfにOne-Jar-Main-Classの行を足します。

Manifest-Version: 1.0
Main-Class: com.simontuffs.onejar.Boot
One-Jar-Main-Class: org.apache.ftpserver.main.CommandLine

capstan runを呼んでディスクイメージを生成・実行します。
FTPサーバに接続可能にするため、ネットワークをブリッジ接続にします。

jar -cvfm ../ftpserver.jar boot-manifest.mf .
cd ..
~/go/bin/capstan run -n bridge ftpserver.jar

capstan runが実行されると以下のような感じでFtpServerが起動します。

Building ftpserver...
Uploading files...
1 / 1 [=============================================================] 100.00 % 0Created instance: ftpserver
OSv v0.16
eth0: 192.168.122.77
Using default configuration
log4j:WARN No appenders could be found for logger (org.apache.ftpserver.impl.DefaultFtpServerContext).
log4j:WARN Please initialize the log4j system properly.
FtpServer started

ftpクライアントで繋いでみます。

$ ftp 192.168.122.77
Connected to 192.168.122.77 (192.168.122.77).
220 Service ready for new user.
Name (192.168.122.77:syuu): anonymous
331 Guest login okay, send your complete e-mail address as password.
Password:
530 Authentication failed.
Login failed.
ftp>

…デフォルト設定の場合に有効なユーザ名・パスワードが分からなかったのでログイン失敗しましたが、FTPサーバが上がっているようです。