Kazuho's Weblog: jailing - chroot jailを構築・運用するためのスクリプトを書いた
virtuald + ipalias + cgroup + これで快適に「そこそこ隔離したサービス環境」作っていきましょー / “Kazuho's Weblog: jailing - chroot jailを構築・運用するためのス…” http://t.co/aweVwa9kDX
— MATSUMOTO, Ryosuke (@matsumotory) 2015, 5月 14
まずは昨日サクッとこういうのを作られたkazuhoさんのjailingを見ていて、こういうのやっぱり面白いなー素晴らしいなーと思いつつ、そういえば僕もmrubyでこういうの書くとか宣言していたなーというの思い出しました。
mruby-cgroup、mruby-capability、mruby-criuができたので、mrubyで簡単にLinuxのアプリケーションコンテナみたいなのを作ったり管理したりできるようになってきた。mruby-containerでこれらをラッパーしてとりあえず完成かな。
— MATSUMOTO, Ryosuke (@matsumotory) 2014, 4月 14
@matsumotory mruby-containerの続報も気になります…
— Uchio KONDO (@udzura) 2014, 6月 15
やろうかなとか言って1年以上たってますね....ですので、なんか今日は夜になってテンションが上がってきたので早速作ってみました。mruby-virtualingと呼ぶことにします。
jailingの機能をmruby-chrootという名前で再実装して、mruby-netlinkにipaliasを制御できる機能を実装して、mruby-cgroupとmruby-capabilityを組み合わせて作ろう、と 一瞬だけ思いました がやっぱりまずはjailingという素晴らしいツールが既にあるしとにかく動かしてみたいので、既存のツールやコマンドをwrapして実装しましたすみませんすみません。chroot機能のほかに、現状はCPUを制限したりIPアドレスを割り当てたりできるようにしているので、virtualingという名前でも良いかなと思ってそうしました。Linuxで動きます。
使い方
とにもかくにも、jailingをインストールして下さい。
その後、mrubyをcloneしてきてbuild_config.rbを以下のように設定します。
MRuby::Build.new do |conf| toolchain :gcc conf.gembox 'full-core' conf.gem :github => 'iij/mruby-process' conf.gem :github => 'matsumoto-r/mruby-cgroup' conf.gem :github => 'matsumoto-r/mruby-virtualing' end
そしてrakeでビルドしましょう。その後できたmrubyバイナリに対して、以下のようなRubyコード(設定)を渡します。
Virtual.new({ :resource => { # CPU 30% :cpu_quota => 30000, # TODO: 実装する #:io_rate => 30000, #:mem => 512, }, :jail => { :path => "/usr/local/bin/jailing", :root => "/tmp/apache", :bind => ["/usr/local"], :cmnd => "/usr/local/apache/bin/httpd -X -f /usr/local/apache/conf/httpd.conf" }, :ip => { :vip => "192.168.0.30", :dev => "eth0", }, }).run
こうすると、jailingの機能を使ったり、IPアドレスやCPUリソース制御の設定を自動でやってくれて、その隔離環境下でapacheが動きます。もちろんapacheにはここで設定する:vip
の設定をしておきましょう。
また、適当にloopするようなCGIを用意してそいつにhttp://192.168.0.30/loop.cgi
にアクセスすると、
こんな感じでCPU30%に制限されている事がわかります。また、chroot配下なのでファイルシステムも隔離されています。
まとめ
ということで、とりあえず動かしたかったという理由で上記のような最低限の機能でmruby-virtualingを実装してみました。今後は、CPUだけでなくDISK I/Oなども制限できるように実装する予定です。(そもそもmruby-cgroupではDISK I/Oを制限できる機能は実装済みなのでそれをmruby-virtualngに追加するだけけです。)
また、jailingをmruby-chrootとして再実装したり、IPの操作を既にあるmruby-netlinkで操作できるようにして、よりmruby内で完結できるような実装にしていこうかなぁと思っています。
こういうのやっぱり面白いですよねー。