xhyve で FreeBSD を動かしてみた

xhyve で FreeBSD をサポートさせるプルリクを見つけたので、xhyve で FreeBSD を動かしてみた。

github.com

xhyve のビルド

プルリクのトピックブランチを取得して xhyve をビルドした。

$ git clone git@github.com:mist64/xhyve.git
$ cd xhyve
$ git checkout -b xez-freebsd master
$ git pull git@github.com:xez/xhyve.git freebsd
$ make

これで FreeBSD に対応した xhyve のバイナリーが生成される。

FreeBSD の起動

起動用スクリプトの作成

下記の内容で起動用スクリプト xhyverun-freebsd.sh を作成した。

#!/bin/sh

USERBOOT="test/userboot.so"
BOOTVOLUME="FreeBSD-10.1-RELEASE-amd64.raw"
KERNELENV=""

MEM="-m 1G"
#SMP="-c 2"
#NET="-s 2:0,virtio-net"
#IMG_CD="-s 3,ahci-cd,/somepath/somefile.iso"
#IMG_HDD="-s 4,virtio-blk,/somepath/somefile.img"
PCI_DEV="-s 0:0,hostbridge -s 31,lpc"
LPC_DEV="-l com1,stdio"
#UUID="-U deadbeef-dead-dead-dead-deaddeafbeef"

build/xhyve -A $MEM $SMP $PCI_DEV $LPC_DEV $NET $IMG_CD $IMG_HDD $UUID -f fbsd,$USERBOOT,$BOOTVOLUME,"$KERNELENV"

BOOTVOLUME で指定している FreeBSD-10.1-RELEASE-amd64.rawここからダウンロードしてきたものである。

起動

$ sudo ./xhyverun-freebsd.sh 

FreeBSD のブートメニューが表示される。 f:id:holidayworking:20150627183706p:plain ただし、ディスクをマウントすることができず、ブート中にエラーが発生してしまった。 f:id:holidayworking:20150627184726p:plain FreeBSD にディスクを認識されていないため、マウントに失敗するようである。

Docker Machine で RancherOS を起動してみる

Docker Machine で RancherOS が起動できるようになっていたので、早速試してみることにした。

blog.docker.com

virtualbox-boot2docker-url オプションに RancherOS の ISO イメージの URL を指定して、マシンを作成するようにする。virtualbox-boot2docker-url オプションを指定しない場合は boot2docker でマシンが作成されるようになっている。

$ docker-machine create -driver virtualbox --virtualbox-boot2docker-url https://releases.rancher.com/os/v0.3.1/machine-rancheros.iso RancherOS
Downloading boot2docker.iso from https://releases.rancher.com/os/v0.3.1/machine-rancheros.iso...
Creating VirtualBox VM...
Creating SSH key...
Starting VirtualBox VM...
Starting VM...
To see how to connect Docker to this machine, run: docker-machine env RancherOS

作成したマシンへのログインして、本当に RancherOS が起動されているかを確かめてみた。

$ docker-machine ssh RancherOS
[docker@RancherOS ~]$ cat /etc/lsb-release 
DISTRIB_ID=RancherOS
DISTRIB_RELEASE=v0.3.1
DISTRIB_DESCRIPTION="RancherOS v0.3.1"
[docker@RancherOS ~]$ ps axuww | head -n 2
PID   USER     COMMAND
    1 root     {system-docker} docker -d --log-driver syslog -s overlay -b docker-sys --fixed-cidr 172.18.42.1/16 --restart=false -g /var/lib/system-docker -G root -H unix:///var/run/system-docker.sock

Riak Erlang MapReduce でハマってしまった

Riak の MapReduce は Erlang と JavaScript で書くことができるが、JavaScript のサポートは将来的に廃止されることが決まっている。

JavaScript MapReduce is deprecated; we have expanded our Erlang MapReduce documentation to assist with the transition.

riak/riak-2.0.md at develop · basho/riak · GitHub

MapReduce を書くときは JavaScript で書いていたのだが、将来的にサポートされなくことを考えると Elarng でも書けるようになっておいたほうが良いので、簡単な処理から Erlang に移植しようと考えてみた。

試しに下記の MapReduce を実行してみることにした。

Riak::MapReduce.new(client).
  index(bucket, 'time_int', 1434812400..1434898799).
  map('fun(_, _, _) -> [1] end.', language: 'erlang').
  reduce(['riak_kv_mapreduce', 'reduce_sum'], keep: true).
  run

そうしたら、下記のようなエラーが発生した。

Riak::ProtobuffsErrorResponse: Expected success from Riak but received 0. {"phase":0,"error":"[worker_startup_failed]","input":"{{{<<\"yokozuna\">>,<<\"action_logs\">>},<<\"2015-06-20-274335d7-e277-458c-850f-a8bd813472c8\">>},undefined}","type":"result","stack":"[]"}

Stack Overflow で似たような質問をしている方がいて、このような書き方をする場合は advanced.config に下記を記述する必要があるとのこと。

[
    {riak_kv, [
        {allow_strfun, true}
    ]}
].

セキュリティリスクがあるという回答をしている方もいたが、今回は勉強も兼ねているので advanced.config を編集することで対処することにした。

そうしたら、期待通りの結果を得ることができた。

Riak::MapReduce.new(client).
  index(bucket, 'time_int', 1434812400..1434898799).
  map('fun(_, _, _) -> [1] end.', language: 'erlang').
  reduce(['riak_kv_mapreduce', 'reduce_sum'], keep: true).
  run
=> [15]

本来は Erlang モジュールを作成して、そのモジュールの関数を呼び出すようにするのがベストだと思われる。

Riak Ruby Client 2.2.1 のリリース

Riak Ruby Client 2.2.1 がリリースされた。

このリリースではバグ修正と試験的な実装が行われている。

Version 2.2.1 is a bugfix release, and includes additional testing of character encodings.

Bug fixes:

  • Support bucket-typed buckets when creating secondary-index input phases for map-reduce, thanks to Hidekazu Tanaka.
  • Support Riak Search 2 / Yokozuna results as input phases for map-reduce, thanks again to Hidekazu Tanaka.
  • BucketTyped::Bucket#get_index now includes the bucket type name in the 2i request.
  • Bucket#== now performs an encoding-independent comparison on bucket names.
  • BucketType#== also does an encoding-independent comparison on type names.

Testing enhancements:

riak-ruby-client/RELEASE_NOTES.md at master · basho/riak-ruby-client · GitHub

MapReduce のバグ修正は僕が対応したもので、下記を MapReduce の入力とする場合の書き方が改善されている。

  • バケットタイプが指定されたバケットに対するセカンダリインデックスの検索結果
  • Riak Search (Yokozuna) の検索結果

どのように改善されたのかを簡単に説明する。

続きを読む

Homebrew で xhyve がインストールできるようになった

homebrew-head-only に xhyve が formula が追加されていた。

github.com

この formula を使って xhyve をインストールするには、下記のように実行すればよい。

$ brew tap homebrew/head-only
$ brew install --HEAD homebrew/head-only/xhyve

xhyve で Fedora 22 を動かしてみた

xhyve で Fedora 22 を動かしてみた。

CentOS 7 と手順は変わらないので、下記のようになる。

  1. インストールディスクイメージの取得
  2. インストール用スクリプトの作成
  3. Fedora のインストール
  4. 起動用スクリプトの作成
  5. Fedora の起動
続きを読む

Riak Ruby Client における MapReduce の問題点と対応方法 #3

下記の記事の続き。

blog.holidayworking.org

Riak Ruby Client における MapReduce には下記の問題点があった。

  • Secondary Indexes でバケットタイプを指定することができない
  • Riak Search (Yokozuna) を使うことができない

これらの問題を解決するるためにプルリクを作成した。

github.com

github.com

何か指摘されるのではドキドキしていたが、何の指摘もなくすんなりとマージされることになった。次のリリースではこれらの修正が含まれるはずなので、リリースを楽しみにしている。