DigitalOceanのFreeBSD 10.1でPrometheusをビルドしたときのメモ

2週間前、DigitalOcean(海外のVPSサービス)でFreeBSDが使えるようになった、というニュースが飛び込んできました。気になりつつ触れていなかったんですが、ちょっと試してみました。

メモリ1Gで$10/monthのプランでやってみました。前はさくらVPSに自分でOSインストールしてたけど、DigitalOceanはボタンをポチポチするだけでFreeBSDが手に入るというお手軽さでよいですね。しかしながら、毎度のことながらLinux感覚でFreeBSDを使うとところどころつまづきます。Prometheusをビルドした時のメモ。

依存パッケージを入れる

The above requires a number of common tools to be installed, namely curl, git, gzip, hg (Mercurial CLI), sed, xxd. Should you need to change any of the protocol buffer definition files (*.proto), you also need the protocol buffer compiler protoc, v2.5.0 or higher, in your $PATH. (https://github.com/prometheus/prometheus#use-make)

とか書いてるのでこれを入れます。hgpy27-hg-gitです。xxdvimを入れればいっしょに入るみたいです。protocprotobufパッケージに入っています。golangはPrometheusがmakeするときに取ってきてくれるので不要みたいです。

$ sudo pkg install curl gzip py27-hg-git vim protobuf

(DigitalOceanのFreeBSDイメージにははじめからsudoが入ってます。便利!)

makeする

ということで、さっそくmakeしてみます。

$ cd WORKDIR
$ git clone https://github.com/prometheus/prometheus.git
$ cd prometheus
$ make build

すると、

...なんかエラーが出ます。むむ。

make: "/usr/home/freebsd/repo/prometheus/Makefile.INCLUDE" line 32: Missing dependency operator
make: "/usr/home/freebsd/repo/prometheus/Makefile.INCLUDE" line 34: Need an operator
make: "/usr/home/freebsd/repo/prometheus/Makefile.INCLUDE" line 36: Need an operator
make: "/usr/home/freebsd/repo/prometheus/Makefile.INCLUDE" line 39: Need an operator
make: Unknown modifier '%'
make: Unknown modifier '%'
make: Unknown modifier '%'
make: Unknown modifier '%'
make: Fatal errors encountered -- cannot continue
make: stopped in /usr/home/freebsd/repo/prometheus

なんか文法エラーっぽいです。

gmakeする

それもそのはず、LinuxmakeFreeBSDmakeは違います。Linuxが使ってるmakeをするには、FreeBSDではgmakeしないといけません。

$ sudo pkg install gmake

ということで気を取り直してもう一度ビルドしてみます。

$ gmake build

すると、

...やっぱりエラーが出ます。ぐぬぬ

TMPDIR=/tmp GOROOT=/home/freebsd/repo/prometheus/.build/root/go GOPATH=/home/freebsd/repo/pr
ometheus/.build/root/gopath /home/freebsd/repo/prometheus/.build/root/go/bin/go build -o pro
metheus -ldflags " -X main.buildVersion 0.10.0 -X main.buildRevision 4e6a807 -X main.buildBr
anch master -X main.buildUser freebsd@nested-headache -X main.buildDate 20150207-02:49:17 -X
 main.goVersion 1.4" .
go build github.com/prometheus/prometheus/web/blob: /home/freebsd/repo/prometheus/.build/roo
t/go/pkg/tool/freebsd_amd64/6g: signal: killed
Makefile:30: recipe for target 'build' failed
gmake: *** [build] Error 1

killedってなんでだろう?と思ってログを見ると、スワップを使いきっていたみたいでした。。

$ sudo less /var/log/messages
...snip...
Feb  7 03:30:39 myfreebsd kernel: swap_pager_getswapspace(9): failed
Feb  7 03:30:39 myfreebsd kernel: swap_pager_getswapspace(16): failed
Feb  7 03:30:39 myfreebsd kernel: swap_pager_getswapspace(3): failed
Feb  7 03:30:39 myfreebsd last message repeated 141 times
Feb  7 03:30:39 myfreebsd kernel: pid 3902 (6g), uid 1001, was killed: out of swap space

メモリ1GBではgoはビルドできませんよ、という話でした。

と思ったら、再起動してもう一度ビルドするとうまくいきました。なんと。