Rubyでコマンドラインから与えられたオプションで仮想マシンを管理するでござる。

Ruby逆引きレシピAdvent Calendarの5日目ということで、実に1年以上ぶりにBlog書きますよ。
このレシピ本には結構お世話になっていて、今でも結構見てます。
勿論実際コード書くときはドキュメントやgoogle様を併用するわけですが、この本をパラパラめくってると、色々インスピレーションが湧いていいですね。

で、お題ですが今回はインフラエンジニアらしく、KVMを管理するlibvirtAPIRubyから叩けるコマンドラインスクリプトを作りたいと思います。
ターゲットページは #058 『コマンドラインから与えられたオプションを解析したい』です。


今回の環境はこんな感じ

OS: Redhat Enterprise Linux 6.0 2.6.32-71.el6.x86_64
ruby: 1.8.7 (2010-06-23 patchlevel 299) [x86_64-linux]
ruby-libvirt: 0.2.0-1.el6.x86_64

ruby-libvirtについては、libvirt.org/rubyから git clone た後ビルドして各自こさえてくださいね。


あ、余談ですがRHELじゃなくてFedora14だと既にリポジトリにありますので

yum install ruby-libvirt.x86_64

Fedoraな方はコレでもオッケーです。


ところでlibvirtといえば、pythonなわけで、コマンドラインから管理するなら virsh という超絶便利なshellすらあるのになんでわざわざrubyで超機能限定版を再実装するのかというと、それは深い意味があるようでないようで、実はコマンドラインから扱いたいんじゃなくてRailsのcontroller的な所に処理の部分だけ持ってって、 /vm_name/power_on みたいなURIに引数付けて Ajax で post 飛ばすと仮想マシンがガーっと立ち上がったり新規に作成できたり電源落とせたりとか、まぁ要は某石狩データセンターなところのVPSの管理画面みたいなのが作れます、というか既に作ったんだけど、それネタにしたら全然レシピ本と関係ないし、やべぇ俺プログラマーじゃねーし、とか思ったから簡単そうなので行こうぜ、という事でコレを選んでみたわけだが、アレこれ意外とスゲー使えるじゃん的な。


さて、前置きが揃ったところで早速レシピを参考にちょちょっと書いてみました。
なんかエラー処理が甘い感じだし、ミョーに無駄が多い気もしますが、まぁいいでしょう。
こう言ったちょっとしたものを15分もかければ作れてしまうのがRubyのいい所ですね。


vm_power.rb

#!/usr/bin/ruby
require 'libvirt'
require 'optparse'

OPTIONS = {
}

ARGV.options do |opts|
  opts.on("-r", "--remote <HOST NAME>", "libvirtd host, ex: root@localhost.localdomain") {|host|
    OPTIONS[:host] = host
  }

  opts.on("--on", "--on <VM NAME>", "VM Power ON") {|p_on|
    OPTIONS[:p_on] = p_on
  }

  opts.on("--off", "--off <VM NAME>", "VM Shutdown") {|p_off|
    OPTIONS[:p_off] = p_off
  }
  opts.parse!
end


if OPTIONS[:host] then
  conn = Libvirt::open("qemu+tcp://#{OPTIONS[:host]}/system")

  if OPTIONS[:p_on] then
    begin
      vm = conn.lookup_domain_by_name(OPTIONS[:p_on])
      vm.create
    rescue => ex
      puts "Error #{ex.message}"
    else
      puts  "Power ON #{OPTIONS[:p_on]}"
    ensure
      unless conn.nil?
        conn.close
      end
    end
  elsif OPTIONS[:p_off] then
    begin
      vm = conn.lookup_domain_by_name(OPTIONS[:p_off])
      vm.shutdown
    rescue => ex
      puts "Error: #{ex.message}"
    else
      puts "Power OFF: #{OPTIONS[:p_off]}"
    ensure
      unless conn.nil?
        conn.close
      end
    end

  else
    puts "Help: vm_power.rb -h"
  end
end


使い方はこんな感じですね。

# ./vm_power.rb -h
Usage: vm_power [options]
    -r, --remote          libvirtd host, ex: root@localhost.localdomain
        --on                VM Power ON
        --off               VM Shutdown

# ./vm_power.rb -r root@hoge.localdomain --on vm1
Power ON vm1

# ./vm_power.rb -r root@hoge.localdomain --off vm1
Power OFF: vm1

基本的な考え方は、 OptionParser#on でオプションを登録して、それに対応する動きを書く感じになるんですね。
で、最後に OptionParser#parse! メソッドでそのオプションに該当する動作を実行するみたいです。
ぶっちゃけそこでは、ほとんど何もしてないんですが。


というか最後の怒涛のif文はどう見ても綺麗じゃないですね、本当にありがとうございました。

Ruby 逆引きレシピ すぐに美味しいサンプル&テクニック 232 (PROGRAMMER’S RECIPE)

Ruby 逆引きレシピ すぐに美味しいサンプル&テクニック 232 (PROGRAMMER’S RECIPE)

はい、という訳で積ん読してる方は引張り出してみるなり、まだの人は書店やamazonにお急ぎいただければと思います。

追記 Wed Dec 15 18:54:02 JST 2010

どうやら12日にruby-libvirt 0.3.0がReleaseされていたようですね。
ちなみにこの記事は 0.2.0前提で書きましたが、0.3.0でも動作することを確認しました。
あと、gitからcloneしなくとも、rubygems.orgに登録されていたので、そちらを利用しても良いですね。

gem install ruby-libvirt

です。

VPSを試して見てる

急に固定IPのサーバが欲しくなって、VPSをレンタルしてみました。
http://vpsstock.jp/

プランはメモリ 256MB/HDD 10GBのS256プラン。
現在絶賛トライアル中。


Xen系で月額1,980円は安いほうですね。
Virtuozzo系のVPSならもっと安く借りれるのですが、SWAP領域が取れないため、メモリ使いきった時点で停まるか落ちるかしてしまうので、やめておきました。

『国内初XenベースVPS』と言う触れ込みですが、提供OSのラインナップを見るに、多分Citrix XenServer5.xですね。
OSはCentOS5.2を選択。

トラブった。

まずですね、提供開始初日からトラブリました!!!111


どうやら、割り振られたIPがなんかとバッティングしてたみたい。
いきなり接続出来ないなんて…!
数分お置きに、たまーに繋がる感じ。
しかも、80番で見に行くとS/Wの管理画面出てくるし、オイコラw
寝る前にサポートにメール投げて見た。


すると翌朝返信が来て、お昼には対処してくれました。
つっても仮想マシン消して新しく作り直したらしいですが。
まぁ、サポートは良い(≒速い)方なんじゃないでしょうか。


気を取り直して弄くり出します。


んだば軽くスペックを見て行きましょう。

[root@centos52 ~]# cat /proc/cpuinfo 
processor       : 0
vendor_id       : GenuineIntel
cpu family      : 6
model           : 15
model name      : Intel(R) Pentium(R) Dual  CPU  E2220  @ 2.40GHz
stepping        : 13
cpu MHz         : 2400.082
cache size      : 1024 KB
fdiv_bug        : no
hlt_bug         : no
f00f_bug        : no
coma_bug        : no
fpu             : yes
fpu_exception   : yes
cpuid level     : 10
wp              : yes
flags           : fpu tsc msr pae mce cx8 apic mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe nx lm constant_tsc up pni monitor ds_cpl est tm2 cx16 xtpr lahf_lm
bogomips        : 6005.09

成程、ペンDですね。
と言うことは、Intel-VTは非対応ですね。完全仮想する訳ではないので、あまり気にしなくてもいいのかもしれません。

Ping飛ばして見る。

国内だけあって、やっぱ速い。
10msくらいで到達してる。

初期セキュリティ

ちなみに最初サーバを発行してもらうタイミングでは、iptablesを使ってセキュリティを保っています。
SSH以外は全て閉まっています。また、SSHに関してもポート番号は変えてありますね。

root権限とyum

root権限も勿論あるので、yum updateも可能です。
ただし、CentOS5.2で単にupdateしてしまうと、新しいカーネルと共にCentOS5.3に上がってしまうので注意。
また、カーネルが上がると言うことは、reboot必須な訳ですが、その辺を弄れる管理マネージャ的なものはVPS Stockでは提供されていないので、SSHから運頼みのrebootになります。
一応、サポートフォーラムに再起動についての質問が上がっていましたが、

現状の場合、sales@triglav.jp 宛にご依頼をいただければ、こちらで対応させていただきます。

との事。
また、OSのバージョンも上がってしまうため、サポート対象外になる可能性があります、というか非常に高いので、その辺は自己責任でガンバレ。

Ruby@開発環境

で、今回はrubyを使いたかったので、環境を整えて行ったのですが、一点ハマリどころがありました。
要はメモリ不足です。

まぁなんと

yum install rubygems
gem upudate --system

が通りません。

CentOSの標準リポジトリだと、rubygemsのバージョンは0.9.4あたり。
Bulkupdateとなりますので、メモリ展開が追いつかなく、いつまで経っても終わりません。
あちゃー。

よってrubygemsは最新版を取ってきて、checkinstallRPM化してから使うことにしました。
その後はgem updateが普通に通るようになります。
これはVPS側が悪いわけじゃなくて、rubygems1.1(1.0?)辺りで解消された仕様のようなので、どうしよも無いですね。

とりあえずこんな感じ。

『僕』が旅に出る理由

そうそう、今回のOSCのテーマとして「僕らが旅に出る理由」と言うのがあったので、帰りの飛行機でまどろみながらも色々考えて見ました。

楽しいから

北海道も勿論ですが、今まで島根だとか仙台だとか色々お邪魔していますが、何でわざわざ行くかっていうと、最終的には楽しいから、なんですよ。
他にももっと、色々な絡みとか、政治的なアレもあるような気もしますが、個人としてはそれに尽きるんですよね。

いろんな人に会える

で、何が楽しいのかと言うと、きっと一番でかいのは『いろんな人に会える』から。
別に僕は景色だとか、歴史的建造物を見に行ってる訳ではない(# 勿論見れれば見たいし、好きですよ!)ので、行っても人っ子一人いなかったら寂しいかも。
初めて会う人、そうで無い人、地元を盛り上げようと頑張ってる人、これからこの業界に入ってこようとしてる人、いろんな人に出会える、話せる。
それって凄く楽しくて幸せなことだと思うのですよ。

結論

普段はディスプレイとキーボード、機器類とにらめっこしてる僕らエンジニア。
それゆえにリアルにこだわるのは不思議なものですが、それが楽しいのだからしょうがないです。はい。


だから行く。これからも行く。仕事が変わってしまっても行く。
それでいいんじゃないかなー、と思った。まる。

反省点

講演に関しては個人的に反省点が沢山あり、という感じ。
具体的には…
・テーマのターゲット
・話す速さやテンション
・まとめかた

このあたりですね、精進します。

あと一部で写真及びその掲載について軽く話題が上がりましたが、個人的なスタンスとしては掲載全然おっけーです。
ただ、写りたくない、お忍びなんです、という意見は理解できるので、標準的なガイドラインがあるといいかもですね。

これに関しては、すもけさんが凄くいい記事を書いているので、運営とかに興味ある方は是非読んで見ると良いと思います。
[-*煙猴*-]: イベント時の映像配信・写真撮影について




さて、次はいついきますかねー。

OSC2009 Hokkaidoいってきた。

オープンソースカンファレンス2009 Hokkaido - 行くしかないっしょ?!
LOCAL | Leading Organization of Community Activity for LOCAL
と、言う事でOSC-do2009いってきましたよ。
今年二回目の北海道ですね。
やっぱ北海道楽しいです、もう大好き。


まずはまたまた講師をさせて頂いたので資料をば。


今回は主にXenを実際に運用して行く際のTipsですね。
具体的には自動でゲストマシンをプロビジョニングするだとか、ネットワーク構成をどうしたら良い?と、言うことについてです。
ちょっと詰め込みすぎたかなー、という感はありますが。

第9回 仮想化友の会勉強会いってきた

遅くなったけど、木曜日に第9回仮想化友の会勉強会いってきたよ。
いつも10〜20人くらいなのに、今回は40人とか集まった罠。

とりあえず、メモ貼っつけときます。


2009/05/28 第9回 仮想化友の会勉強会@日本RedHat
※ 一応、RedHat社の総意/公式見解ではないよ、って事でひとつ。


KVMインタラクション

  • QEMU
    • type-2の仮想化
    • 結構古くからある → なのでドライバ関係も結構古いのが多い
    • SPARCをエミュレーションできる
  • KVM
    • QEMUを高速化しましょう、というアプローチ
    • /dev/kvm を利用
    • 実行の管理はLinux側。普通のユーザプロセスで動く
    • だから普通にkillコマンドでプロセス=ゲストマシンを殺せてしまうよ
  • そこでゲストモード
    • 仮想化用のセンシティブ命令を追加 → VT必須
    • ホストとゲストの特権命令を丸めて、スケジューリング
  • KVMによるQEMUの高速化
    • CPUエミュレーション
    • センシティブ命令チェック
    • 命令の書き換えで対応
    • I/Oであれば、デバイスエミュレータに渡す

Virtio

※ 要点だけ。詳しくは資料みるよろし

  • Zero-copy I/Oを実装するためのフレームワーク
  • 共有メモリにオペレーション(リクエスト)があって、I/O命令を実行
    • トラップ多くなる → どんどん遅くなる
    • それ、直接デバイスに送ったり、必要ならエミュレーションとかすればよくね
  • Linux側で、仮想ソフト用の口を用意しておくから、後は各自頑張って → それがVirtio

※ たぶんAPIちっくなもの?

  • 今実装されてるのはQEMUのみ
    • 要するにXenKVM
    • PVドライバがいらなくなった(完全仮想化のことね)
  • virtio_ring
    • ゲストとホストの共有ページを利用したリングバッファを提供
    • バッファが共有ページの上に乗る
  • virtio_pci
    • 仮想PCIバイス
    • I/O命令は仮想環境がフックする
    • で、処理をたたかせる
    • これも共有ページで共有
  • virtio_blk
  • virtio_console
    • コンソールは割り込み処理が多いので、準仮想化する意義がある!
  • ポイント
    • 共有メモリ使うから早いよ
    • それを実装するのはvirtioだよ

RedHatの仮想化戦略

  • 2月 マイクロソフト相互運用で合意
    • ポイント : 全部仮想化上の話
    • RHEL上でWinを保障
    • 逆:Win上のRHEL
    • サポートは両方から受けれるよ
  • 5.4から本格実装
    • 今秋
    • 2k,2k3,2k8サポ
    • Hyper-V上でサポ受けれる
    • ベータ版は来月(?)

ロードマップ

  • KVMLinuxに組み込む
      • 5.4から。
    • Xenのサポートは継続
    • 仮想化エンジンは2つ(Xen,KVM)
  • GUIベースの管理系のソフトを提供
    • Red Hat Enterprise Virtualization Manager for Servers / Desktop
  • For Servers

Q&A

  • KVMのアドバンテージ
    • Linuxカーネルの実装である
    • ゲストに修正不要(完全仮想化)
    • よって、プロプラエタリなドライバでも利用できる → LinuxRaidカードのドライバなど → Xenでは現状利用できないものも使える
  • 価格
    • VMwareよりは高くできない
    • ライセンス形態も検討中 → MSの様な形態も検討中
  • P2Vツール
    • 現状用意できていない状態
    • VMwareコンバーターやDDコマンドで引っこ抜いて、qemuでコンバートと言う昔ながらの方法では、既に可能だよね、的な
  • 管理ツールのグレード分け
    • 検討中
  • EPTのベンチマーク
    • 公開できない(oracleのを使ってるため)
    • 速くなる訳ではない
    • 遅くならない為のもの
    • でも、あるとないとじゃ全然違うよ。Nehalem かわいいよ Nehalem
  • 現状でKVMを試すとすれば?
    • Fedoraを使ってほしい
    • 5.4Betaが出たら、それが最善
  • oVirtはどうなるのか
    • 捨てた訳ではない
    • 管理ツールとして、段々上記製品に組み込んでいく

こんな感じです。
間違えて思えてる所もあるような気がするので、まぁ参考程度に。

各種資料は、こちらから。
http://sites.google.com/site/kasotomo/

Mac欲しいけど金ないからLinuxで我慢するでござるの巻

そのまんま。
Mac欲しいけどお金ないです。


つーか、Objective-Cの為だけに買うのは正直負けた気がするので、UIをそれっぽくして我慢することにしました。
これぞLifeHackですね。



それっぽい。



Docもそれっぽく。



グリグリ回すじぇ。



Expose
これが便利なんですよね。



iTunesっぽいあれ。



仮想デスクトップを展開してみる。



結論:
30分位グリグリいじった挙句、Exposeだけ有効にしてデフォルトに戻した。

Windows 7 RC をThinkPadにインストールした

勢いあまってThinkPad X61Windows 7 RC x64インストールしてみました。
今のところ普通に使えています。
ぶっちゃけ、適当なターミナルソフトとgvimLimeChatが使えれば何でもいいのですけどね。

一応Aeroも有効になります。
MtronのRead200MB/Write120MBモデルで使っていますが、今のところ快適。
ただし、XPよりももっさくなった感は否めませんね。


グラフィック以外はまぁそこそこ高めなスペコーですね。
まぁまぁ快適です。



WindowsでもExpose。
これ便利なんですよ、マジで。
もともともVista用のソフトですが、7でも使えるようです。
残念ながら、Aero用のライブラリを使ってるようで、XPや非AeroのVistaでは動きませんが。
http://www.nazspace.com/wp/2007/05/03/expose-for-vista/