OSvのご紹介 2014年12月版

ご注意:OSvは絶賛開発中のプロダクトであるため、将来のバージョンではここに書いてある通り動かない場合があります。

OSvとは

OSvは、ハイパーバイザやIaaSプラットフォームへアプリケーションをデプロイすることに特化した軽量OSです。
Linuxで動作するいくつかのアプリケーションが動きますが、Linuxを使わずにフルスクラッチで実装されています。

詳しくはOSCの発表スライドを見て下さい。

提供される機能
  • Linux互換 libc API(一部のLinuxアプリケーションとの互換性)
  • position independentでビルドされたLinux/x86_64バイナリのロード&実行
  • ZFS
  • TCP/IP(IPv4 only)、DHCP
  • SMP
  • シングルプロセス/マルチスレッド
  • REST APIによるプログラマブルな管理機構
  • Luaで実装された簡易シェル
  • 簡易デプロイツール「Capstan」による1コマンドデプロイ&実行
対応アプリ
  • openjdk7, 8(特殊な操作を行う物以外殆どのPure Javaアプリケーションが動作)
  • cruby 2.1.5(テストされた一部のRubyアプリが動作)
  • node.js 0.10.31 (テストされた一部のサンプルプログラムが動作)
    • express
    • socket.io
  • mruby
  • lua
  • mysql
  • memcached
  • haproxy
  • redis
実行環境

OSvの使い方

ここではLinux KVMを対象とし、Linux環境で実行する例を示します。
それ以外の環境についてはWikiを参照して下さい。

Capstanのインストー
curl https://raw.githubusercontent.com/cloudius-systems/capstan/master/scripts/download | bash
prebuiltイメージの実行
capstan run -n 'bridge' cloudius/osv # Lua Shellのみのイメージを実行

capstan run -n 'bridge' cloudius/osv-tomcat # Tomcatのみのイメージを実行

capstan run -n 'bridge' cloudius/osv-cassandra # Cassandraのみのイメージを実行

capstan run -n 'bridge' cloudius/osv-memcached-opt # memcachedのみのイメージを実行

capstan run -n 'bridge' cloudius/osv-redis-memonly # Redisのみのイメージを実行

libvirtによってvirbr0がNAT用に準備されていないとコマンドの実行が失敗します。
この場合はネットワークに繋がったブリッジデバイスを準備して-b br0などとして指定して下さい。

Web UIへのアクセス

OSvインスタンス起動時に、

OSv v0.16
eth0: 192.168.122.163

のように割り当てIPアドレスが表示されます。
WebサーバはこのIPアドレスのポート8000に起動しているので、ブラウザでここへアクセスします。
正常にアクセス出来るとこのようなWebページが表示されます。

REST APIへのアクセス

RESTサーバはWeb UIのサーバと共用になっており、同じIP・ポート番号を使用します。
REST APIのドキュメントは http://:8000/dashboard/swagger/ にアクセスする事で得られます。
このWebページはJavaScriptによりREST APIを実際に実行してみることも可能になっています。

curlを用いてシェル上で試す場合、以下のようになります:

# js.jarをアップロードする
curl -X POST http://192.168.122.89:8000/file/js.jar -Fname=@js.jar

# 次回起動時のcmdlineを変更
curl -X POST -d cmdline="java.so -jar js.jar" http://192.168.122.89:8000/os/cmdline

# OSvインスタンスを再起動
curl -X POST http://192.168.122.89:8000/os/reboot

次回予告

REST APIのより詳しい使い方、CLIの解説、アプリケーションのデプロイ方法などについて解説していきます。

Baytrail-M NUC(DN2820FYKH)でFreeBSDが起動しなかった話・その後

http://www.slideshare.net/syuu1228/intel-nuc
の続きの話です。

CURRENTにマージされたbug fixはMFCって言って、stableへマージされて次のRELEASEに含まれる仕組みになってるっぽいんですが、このパッチも無事取り込まれたようで、次のRELEASE(10.1, 9.3かな?)に入るようです。

[base] Revision 267809
[base] Revision 267821

これでFreeBSD起動しねぇ!って騒がなくてすむね!

Macでもmruby-simplehttpserverをcapstanを使ってお手軽簡単にOSv向けにビルド&実行

前回の記事ではLinuxに絞ってcapstanを使ったmruby on OSvのビルド&実行方法を紹介しましたが、アプリケーションのコンパイルが他プラットフォームでは出来ないと説明しました。

代わりに、github上にビルド済みのアプリケーションバイナリを置いて、OS Xでcapstanを使ってOSvのイメージを作成&実行することに成功したので、これを紹介します。

brewで必要になるアプリをインストー

brew install go qemu git

環境変数を設定

echo 'export GOPATH=$HOME/go'    >>  $HOME/.profile
echo 'export PATH=$PATH:$GOPATH/bin'  >> $HOME/.profile
source  $HOME/.profile

capstanをインストー

go get github.com/cloudius-systems/capstan

mruby-simplehttpserver用のcapstanリポジトリをチェックアウト

git clone -b prebuilt https://github.com/syuu1228/capstan-mruby-simplehttpserver.git

リポジトリのビルド

QEMUのウインドウが一時的に表示されることがあるようですが、特に触らなくて問題ありません。

cd capstan-mruby-simplehttpserver
capstan build

VMの実行(VM上のポート番号80をホスト上のポート番号10080へ転送)

ハイパーバイザを指定しない場合VirtualBoxが用いられますが、正常に動作するようです。

capstan run -f 10080:80

http serverへのアクセステスト

curl http://127.0.0.1:10080/html -v

* About to connect() to 127.0.0.1 port 10080 (#0)
*   Trying 127.0.0.1...
* Adding handle: conn: 0xd0d8f0
* Adding handle: send: 0
* Adding handle: recv: 0
* Curl_addHandleToPipeline: length: 1
* - Conn 0 (0xd0d8f0) send_pipe: 1, recv_pipe: 0
* Connected to 127.0.0.1 (127.0.0.1) port 10080 (#0)
> GET /html HTTP/1.1
> User-Agent: curl/7.32.0
> Host: 127.0.0.1:10080
> Accept: */*
> 
* HTTP 1.0, assume close after body
< HTTP/1.0 200 OK
< Server: my-mruby-simplehttpserver
< Date: Mon, 19 May 2014 17:57:13 GMT
< Content-Type: text/html; charset=utf-8
< Content-Length: 28
< 
<H1>Hello mruby World.</H1>
* Closing connection 0

matsumotory氏のmruby-simplehttpserverをcapstanを使ってお手軽簡単にOSv向けにビルド&実行する

OSvは最近capstanというビルド・デプロイツールが出来たので、以前のようにOSをビルドしなくてもアプリだけビルドしてVMイメージ作成&実行が簡単にできます。

ここでは、@matsumotory氏がブログで解説されていたmruby-simplehttpserver用のcapstanリポジトリを作成してみたので、インストール&実行方法を紹介します。

バイナリディストリビューションのインストール&実行はWindows・Mac・Linuxに対応していますが、今のところソースコードからアプリをビルドするにはLinuxが必要(公式対応ディストリはFedora 20)なので、以下の手順はFedora 20を使って説明します。

なお、この記事ではcapstan用リポジトリの作り方について詳しい解説をしていませんが、こちらにビルド設定定義ファイル「Capstanfile」のドキュメントがあるので、興味があれば読んでみて下さい。

GoとQEMUとgitをインストー

wget http://go.googlecode.com/files/go1.2.1.linux-amd64.tar.gz
sudo tar -C /usr/local -xzf go1.2.1.linux-amd64.tar.gz
sudo yum install qemu-system-x86 git

.bashrcに環境変数を追加

export GOROOT=/usr/local/go
export GOPATH=$HOME/go
export PATH=$PATH:$GOROOT/bin:$GOPATH/bin

capstanをインストー

go get github.com/cloudius-systems/capstan

mruby-simplehttpserver用のcapstanリポジトリをチェックアウト

git clone https://github.com/syuu1228/capstan-mruby-simplehttpserver.git

リポジトリのビルド

cd capstan-mruby-simplehttpserver
capstan build

VMの実行(VM上のポート番号80をホスト上のポート番号10080へ転送)

capstan run -f 10080:80

http serverへのアクセステスト

curl http://127.0.0.1:10080/html -v

* About to connect() to 127.0.0.1 port 10080 (#0)
*   Trying 127.0.0.1...
* Adding handle: conn: 0xd0d8f0
* Adding handle: send: 0
* Adding handle: recv: 0
* Curl_addHandleToPipeline: length: 1
* - Conn 0 (0xd0d8f0) send_pipe: 1, recv_pipe: 0
* Connected to 127.0.0.1 (127.0.0.1) port 10080 (#0)
> GET /html HTTP/1.1
> User-Agent: curl/7.32.0
> Host: 127.0.0.1:10080
> Accept: */*
> 
* HTTP 1.0, assume close after body
< HTTP/1.0 200 OK
< Server: my-mruby-simplehttpserver
< Date: Mon, 19 May 2014 17:57:13 GMT
< Content-Type: text/html; charset=utf-8
< Content-Length: 28
< 
<H1>Hello mruby World.</H1>
* Closing connection 0

Linux上のmikutterでリンクをクリックしたら別のLinux上のブラウザで表示する方法

Linux上のmikutterでリンクをクリックしたらMac上のブラウザで表示する方法 - かーねる・う゛いえむにっきの続きですが、「いや、おれMacとか使ってねぇし?不自由なOSユーザー氏ね!」みたいな声が聞こえてくる気がする*1ので、Linuxでも出来るかどうか考えてみました。
で、なんか10秒くらい考えた結果、出来そうなのでここに書いておきます。

基本的な設定は前回の記事と全く同じなのでそちらを参照して下さい。
シェルスクリプトだけ違うものを使います。

cat > open <<EOS
#!/bin/sh
ssh teokure.local env DISPLAY=:0.0 xdg-open $*
EOS
chmod +rx open

あんまりしっかり試してないけど多分これで大丈夫

*1:完全な被害妄想

Linux上のmikutterでリンクをクリックしたらMac上のブラウザで表示する方法

VM上のLinuxでmikutterを動かしてたり、synergyで2台のPCを並べて使ってたりする場合に、TwitterだけLinuxのmikutterで眺めてWebはMacで見たい場合ってありませんか。僕はあります。
そんな時、SSHを使えば割と簡単に実現出来ます。

MacSSHサーバを有効化

システム環境設定→共有でリモートログインにチェック。

Linuxにmulticast DNSを設定

FedoraUbuntuのようなお手軽ディストリなら設定済みです。
GentooやArchやDebianの人はこのへんを見て設定して下さい。

ここでmulticast DNSを敢えて使用するのは、DHCPMacIPアドレスが変更されたり、VMのネットワーク設定が変わってホスト側のMacIPアドレスが変わって見えたりしたときにもIPアドレスを自動的に解決する方法として適しているからです。
必要なければIP直打ちでも以下の設定をおこなう事が出来ます。

SSH公開鍵認証を設定

Linux側でパスフレーズの無いSSH鍵を作成し、Mac側の~/.ssh/authorized_keysに追加しておいてパスワード・パスフレーズ無しでMacへログインできるようにしておきます。

Macのホスト名は各自チェックして下さい。

ssh-keygen -t dsa
scp ~/.ssh/id_dsa.pub syuu-no-MacBook-Pro.local:~/
mkdir .ssh
cat id_dsa.pub >> .ssh/authorized_keys
シェルスクリプトを作る

Linux側で以下のようなシェルスクリプトを作ります。

cat > open <<EOS
#!/bin/sh
ssh syuu-no-MacBook-Pro.local open $*
EOS
chmod +rx open

試しに叩いてブラウザが上がってくるかみてみます

~/open http://www.google.com
mikutterに設定する

設定→表示→URLを開く方法で次のコマンドを使うを選び、
/home/syuu/open
などと書き込んでおけば、次からブラウザではなくて上述のシェルスクリプトが実行されて何故かMacでブラウザが立ち上がるようになります(ホームディレクトリのパスは各自チェックして下さい)。

応用

mikutterではなくデスクトップ環境のデフォルトブラウザにopenを指定すれば別のアプリでリンクを踏んでもMacでブラウザが立ち上がります。
また、ファイルをscpしてからopenをMacで実行する所までをシェルスクリプト化すれば、コマンドラインで指定したファイルをMacで開くことが出来ます(Macのopenコマンド自体はURLを開くためのコマンドではなく、URLやファイルを引数に与えてデフォルト設定のアプリケーションで開くためのコマンドです。詳しくはmanを見てね)。

おやくそく

SSHサーバを起動したりパスフレーズなし鍵認証を設定したりとセキュリティが緩くなる方向に設定を変更してるので、ファイヤウォールで必要ないIPは弾くとかSSHの設定を厳しくするなどして穴を広げない方向でお使い下さい。

githubで公開することにしました

既にこのブログで第1回、第2回を公開していますが(追記:githubでの公開にあわせて削除済み)、原稿元データを含めて全ての回をgithubで公開することにしました。

現在、TeXへの変換作業のボランティアを募集しています。
詳しくはgithubリポジトリのREADME.mdを参照して下さい。