2016年7月17日日曜日

libvirtを忘れずに

これまでのKVMの利用方法は、あくまでQEMUを通してのモノだった。
KVMは、libvirtというライブラリ(デーモン)を通して利用するのが、今のトレンドで正しいやり方のようだ。
多くのツールキットが、libvirtを通してKVMを利用するように出来ているし、libvirtはバックエンドの仮想化環境がKVMだけでなく、旧来のqemuやXen、果てはVMware ESXにも対応しているようだ。(ESXi / vSphereに対応しているかは不明。)
http://libvirt.org/

また、libvirtはC言語で書かれているため、C言語用のAPIは用意されているが、Python用のAPIも用意されているらしい。
更に、PerlやRuby等用にもAPIを準備しているとのこと。(多分、C言語APIか、Python用APIに対するラッパーを開発しているのだろう)
通常のコマンドラインで利用するための virsh コマンド、GUIで設定確認等が行える virt-manager というのも用意されている。

libvirtを使うと、Virtual Machineの管理がしやすくなる。
どういう風に管理しやすいか?っていうところだけど…あまり詳しくない。使ってみれば分かるだろう。
分かっている限りだと…
  • 仮想マシンの起動オプションは設定ファイルに
    起動のたびに、「あれ?起動オプション何だっけ?」って悩まなくていい
  • 仮想マシンに対する外付けデバイス(CD-ROMやらUSB機器)を、コマンド等でオン/オフ出来る
    仮想マシンにアプリケーションを導入するのに、CD-ROMイメージを交換するのが簡単になる
といった所かな?

さっそく、libvirtを用いた仮想マシン操作をしてみたいところだが、その前に準備が必要だ。
  1. 仮想マシンの定義はXML形式のファイルに記載する
  2. Web上にサンプルはあるが、これだけでは書けない
    (これだけで書けたらすごい)
  3. 定義を作るツール(virt-install)がある
  4. 今はインストールされていないので、インストールする必要がある
  5. 仮想マシンの定義(XMLファイル)と仮想ディスクイメージを配置するディレクトリは、原則固定
    (/var/lib/libvirt/images/?)
とりあえず、仮想ディスクイメージは、実際に配置される場所が明確になるまでは、内蔵ディスクに配置するようにする。
明確になったところで、iSCSI領域に配置し直すことにする。

なので、virt-installをインストールしよう
$ sudo apt-get install virtinst

あと、osinfo-query というコマンドを後で使う。
なので、これもインストールしておこう。
$ sudo apt-get install libosinfo-bin

で、virt-install を使うんだけど、その前にネットワークの設定を確認しておこう。
Ubuntuの場合、仮想環境(libvirt-bin?)をインストールした段階で、仮想ネットワークvirbr0というのが出来上がる。
実際に、IPアドレスも付与されているはずだ。
$ ip address show dev virbr0

私の環境では、192.168.122.1/24 というIPアドレスが付与されていた。
(virbr0-nicというのも存在するんだけど、これは何なのか不明…。恐らく、virbr0が物理NICに接続する中間デバイスのようなものではないか?
仮想マシンNIC - virbr0(スイッチ) - virbr0-nic - 物理NIC という経路なのかと。)

また、brctlなるコマンドで一覧が見られる。
$ brctl show

virbr0 のエントリが出力されたはずだ。(virbr0-nic は出力されていない。やっぱり謎だ。)
私の環境では、出力結果の interfaces 項目が空なのだが、どういうことだろう?
予想では、virbr0-nic か、物理NIC名が入ってくるものと思ったのだが…。

もう一つ、bridge コマンドというのもある。これも良く分からないのだが…。
$ bridge vlan show
$ bridge fdb show
で、何か表示される。(何かってナンダヨ…)

前者は、ブリッジネットワークのVLAN定義が出力されるんだけど、何も設定していないので「1 PVID Egress Untagged」ってな具合に、Untaggedと表示される。(タグ付けしてないので、少なくともタグVLANじゃないね。)

後者は、Forwarding Database entry の略で、何だろう?転送先かな?Networkデバイス名とmacアドレスっぽい文字列の組み合わせが大量に出力された。
そのうちの一つ、「01:00:5e:00:00:01」というのは、レイヤ2転送用のmacアドレスらしい。
それ以外には、「33:33:ff」で始まるmacアドレスが復数存在しているが、どうやらIPv6マルチキャスト用のmacアドレスのようだ。

ってことは、とりあえず無視しても構わないだろうな。

で、じゃあKVM的には、virbr0ってどんなん?ってことなんだが、今度は virsh コマンドを用いることになる。
ちょっと見てみよう。
$ virsh net-list --all

defaultという名前のエントリ1つだけ出てきたはず。
じゃぁコレの詳細は?
$ virsh net-info default

ブリッジという項目に、virbr0 と出てきたはずだ。
ということは、defaultネットワークにつなぐことが、virbr0につなぐ、ということになるのではないだろうか?

更に、定義をxml形式で出力することも出来る
$ virsh net-dumpxml default
(このネットワーク定義を保存しておけば、リストアで使用できるっぽいぞ)

とりあえず、xml形式の方を見ると、<forward mode='nat'> という定義がある。
これを見ると、どうやらnat形式のネットワークのようだ。
#VMware系等の仮想環境で言うところの、NATネットワークと同じようだ。

う~ん。これだけ見てみても、色々あって覚えきれねぇ。

とりあえず、virt-install のマニュアル(man virt-install)にサンプルが載っているので、これをいじって一つ仮想マシンを立ててみよう。
その前に、仮想マシンのOS定義がどの程度あって、何が使えるか確認しておこう。
$ osinfo-query os

ずらずらと出てきたエントリの中に、ubuntu14.04が見つかっただろうか?
このエントリを、次の virt-install コマンドの --os-variant 引数に適用する。

$ virt-install \
     --virt-type kvm \
     --name aries \
     --vcpus 2 \
     --memory 512 \
     --disk size=2,sparse=yes \
     --check disk_size=off \
     --network network=default \
     --cdrom ~/iscsivol/ubuntu-14.04.4-server-amd64.iso \
     --graphics spice,port=9001,password=test \
     --os-variant ubuntu14.04

っとコケた。
「ERROR    サポートされない設定: spice TLS ポートが XML 設定において設定されていますが、TLS が qemu.conf において無効化されています」
だそうな。

どうも、--graphics spice のオプションに port オプションを付与すると、tlsによる接続環境も作ろうとしてしまうようだ。
ただ、/etc/libvirt/qemu.conf は一切いじっておらず、tls 関連の環境はまだまったく作っていない。
そもそも、サーバ証明書等の準備は一切していないから、tls は使えない状態だ。
さてどうしよう…。
  1. SPICEプロトコルをやめて、別プロトコル(VNCとか)を指定する
  2. tls の環境を整える
  3. GUIでインストールする virt-manager を使用する
  4. ポートオプションを無くして初期作成し、別途portを指定する
1番から3番は、環境を整えないといけないのでちょっと後回しにしたい。
なので4番を使ってみたい。

port オプションを指定しない場合、SPICEのポートはどうやら5900番を使用するようだ。
sshポート転送に以下の内容を追加して、ログインし直そう。
  • ローカルのポート:5900
  • リッスン:127.0.0.2
  • リモート側ホスト:127.0.0.2
  • リモート側ポート:5900
(今回は、敢えて127.0.0.2を指定してみた)
その後、ポートを9001に変えてみたいと思うので、併せて以下の設定も入れておこう。
  • ローカルのポート:9001
  • リッスン:127.0.0.2
  • リモート側ホスト:127.0.0.2
  • リモート側ポート:9001
ログインし直したら実行だ。
$ virt-install \
     --virt-type kvm \
     --name aries \
     --vcpus 2 \
     --memory 512 \
     --disk size=2,sparse=yes \
     --check disk_size=off \
     --network network=default \
     --cdrom ~/iscsivol/ubuntu-14.04.4-server-amd64.iso \
     --graphics spice,listen=127.0.0.2,password=test \
     --os-variant ubuntu14.04

う~ん。
「Couldn't open libGL.so.1: libGL.so.1: 共有オブジェクトファイルを開けません: そのようなファイルやディレクトリはありません」
というエラーが出る。
ただ、libGLが無くても動いているようなので、あまり気にしないようにしよう。
(多分、libGLをインストールすればいいんだと思う。)

念の為に、プロセスが生きているか確認してみよう。
$ ps -ef | grep qemu | grep -v grep
くっそ長い行が出てきたはずだ。これが出てくれば、実行成功だ。

実行出来たら、Remote viewer(Virtviewer)を起動して、spice://127.0.0.2:5900 へ接続してみよう。
(パスワードは、引数に指定している test だぞ)


無事に接続が出来たら、言語選択(UbuntuのOSメディアでブートした一番最初の画面)が表示されるはずだ。


ここまで出来たら、一旦この状態で設定確認をしてみよう。
コマンドプロンプトから以下のコマンドを実行することで、仮想マシンの設定が見られるぞ。
$ virsh list --all
$ virsh dumpxml aries
1つ目は、このlibvirt管理下の仮想マシン一覧だ。今はまだ1つしか作っていないから、1行しか出てこないはずだ。
2つ目は、仮想マシンariesの設定情報をxml形式で出力するコマンドだ。
ズラズラと出てくるが、xml形式なのである程度は読めるはずだ。

一旦、現状の設定を保存しておこう。
$ virsh dumpxml aries > aries.xml

そうしたら、通常通りインストールは進めてしまう。
最小構成にssh-serverを入れるだけでとりあえずはいい。
(以前、piscesを作った時と同じオプション構成だ。ホスト名はariesとする。)

インストール完了後、再起動せずに停止状態になった。
おかしいな、再起動すると思ったんだが…。

とりあえず、spiceの待受ポートだけ変更しよう。
$ virsh edit aries

viが立ち上がり、仮想マシンariesの設定情報(xml形式)が編集できる状態になったと思う。
以下の部分を変更しよう
    <graphics type='spice' autoport='yes' listen='127.0.0.2' passwd='test'>
      <listen type='address' address='127.0.0.2'/>
      <image compression='off'/>
    </graphics>

    <graphics type='spice' port='9001' autoport='no' listen='127.0.0.2' passwd='test'>
      <listen type='address' address='127.0.0.2'/>
      <image compression='off'/>
    </graphics>

書き換えたら、仮想マシンariesを起動してみる。
起動はvirshコマンドで実行出来るぞ。
$ virsh list --all
$ virsh start aries
$ virsh list --all

起動できたか確認してみよう。
virt-viewer(RemoteViewer)で、spice://127.0.0.2:9001 へアクセスしてみよう。

無事にアクセス出来たら、ログインプロンプトが出ているはずだ。
ariesをインストールした時のユーザIDでログインしてみよう。
ログインできたはずだ。

かなり長くなってしまったので、一旦ココで切って、次回以降で少しずつ内容確認していく。
ariesはシャットダウンしておこう。
(aries) $ sudo shutdown -h now
(aquarius) $ virsh list --all

0 件のコメント:

コメントを投稿