人間とウェブの未来

「ウェブの歴史は人類の歴史の繰り返し」という観点から色々勉強しています。

mrubyでファイルシステムを隔離してリソースを分離しIPも割り当てられるmruby-virtualingを書いた

Kazuho's Weblog: jailing - chroot jailを構築・運用するためのスクリプトを書いた

まずは昨日サクッとこういうのを作られたkazuhoさんのjailingを見ていて、こういうのやっぱり面白いなー素晴らしいなーと思いつつ、そういえば僕もmrubyでこういうの書くとか宣言していたなーというの思い出しました。

やろうかなとか言って1年以上たってますね....ですので、なんか今日は夜になってテンションが上がってきたので早速作ってみました。mruby-virtualingと呼ぶことにします。

github.com

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にアクセスすると、

f:id:matsumoto_r:20150514233054p:plain

こんな感じでCPU30%に制限されている事がわかります。また、chroot配下なのでファイルシステムも隔離されています。

まとめ

ということで、とりあえず動かしたかったという理由で上記のような最低限の機能でmruby-virtualingを実装してみました。今後は、CPUだけでなくDISK I/Oなども制限できるように実装する予定です。(そもそもmruby-cgroupではDISK I/Oを制限できる機能は実装済みなのでそれをmruby-virtualngに追加するだけけです。)

また、jailingをmruby-chrootとして再実装したり、IPの操作を既にあるmruby-netlinkで操作できるようにして、よりmruby内で完結できるような実装にしていこうかなぁと思っています。

こういうのやっぱり面白いですよねー。