最近、MacBook の SSD の空き容量がいつの間にか無くなっていて、スワップを作れなくなった結果、フリーズするということがあって反省したのでちゃんと管理しようという気持ちになった。
ひとまず家にある中で壊れたりトラブルが起きると一番困るのは QNAP なので、これを監視することにした。
Mackerel は Go で書かれた agent を入れるだけでよい割にアラートの閾値をいい感じに定義することができるので便利。
QNAP で mackerel-agent を動かす
僕の持っている QNAP は TS-220 というモデルで CPU は ARM v5 で OS は Linux ベースらしい。
mackerel-agent は最近の CentOS と Debian しか動作することを保証されていない:
For now, mackerel-agent is guaranteed to run only on CentOS 5/6 and Debian 6/7.
https://github.com/mackerelio/mackerel-agent#readme
とはいえ Go で書かれているし Linux ベースなら取り付く島が無いなんてことはないだろうと思ってちょっと試したら動いた。
テストは書いていないしかなりいい加減だがこれで動いた。
- QTS (QNAP の OS) に入っている
uname
は-o
(Operating System) をサポートしていない- どのような意図でもって実装されていないのかは不明だけれどもさして重要な情報ではないので決め打ちで
"Linux"
とする
- どのような意図でもって実装されていないのかは不明だけれどもさして重要な情報ではないので決め打ちで
- QTS に入っている
df
は-P
オプションをサポートしていないし出力の形式が少し違う1024-block
が1k-block
だった- それ以外は特に書式に大きな違いはなかったので正規表現を修正する
Docker でビルドする
mackerel-agent は OS X ではビルドに失敗するので Docker を使うことにした。
Dockerfile:
FROM golang:cross RUN mkdir -p /go/src/github.com/mackerelio ADD ./mackerel-agent /go/src/github.com/mackerelio/mackerel-agent WORKDIR /go/src/github.com/mackerelio/mackerel-agent RUN make deps CMD bash -c "GOOS=linux GOARCH=arm GOARM=5 CGO_ENABLED=0 make build && cp ./build/mackerel-agent /host/_mackerel-agent"
これで docker build -t mackerel-agent . && docker run -v "$(pwd)":/host mackerel-agent
とすると _mackerel-agent
が作られる。
Docker Hub Registry には golang が登録されているが、そのうちクロスコンパイルするための環境がセットアップされているタグを選ぶ。最新 (1.3) でよければ cross
.
ビルドの際に指定している環境変数は Optional environment variables
を参照した。
また GOARM
変数については GoArm - go-wiki が詳しい。
ルート証明書が見つからないエラー
ビルドはできたものの実行時エラーが出る:
x509: failed to load system roots and no roots provided
意味がわからなかったが調べたところ x509 は SSL 通信のために使われているらしい。“roots” がよくわからなかったがルート証明書のことらしい。
ルート証明書が無いなら配置すればよいかと思ったもののどこに配置すればよいのかわからない。
Go において CertPool
は参照すべき証明書を保持するオブジェクトの型で、SSL 通信などを扱うライブラリ (e.g. net/http
) ではデフォルトではシステムの証明書を参照するようだった。
ではシステムの証明書の配置場所はどこかというと root_unix.go というファイルに定義されている。
var certFiles = []string{ "/etc/ssl/certs/ca-certificates.crt", // Debian/Ubuntu/Gentoo etc. "/etc/pki/tls/certs/ca-bundle.crt", // Fedora/RHEL "/etc/ssl/ca-bundle.pem", // OpenSUSE "/etc/ssl/cert.pem", // OpenBSD "/usr/local/share/certs/ca-root-nss.crt", // FreeBSD/DragonFly }
QNAP では /etc/ssl/certs/myroots.crt
に配置されていたので symlink を作った。
おわり
これで QNAP 上で mackerel-agent を動かすことができるようになったはず。
あとは init スクリプトを書いたりしてデーモン化しておけばよい。
ディスク容量だけではなく netin/netout や CPU 使用状況も見れるので並列にコピーを走らせて無茶を走らせているときなど、余裕があるかなど見れて便利。
だいたい普通の Linux という感じでかなり手軽に運用できるので、次は nasne あたりも監視したい。