2016年8月10日水曜日

spiceのlistenポート

ここまでの作業で、 pisces と aries という2つの仮想マシンが作られた。
で、それぞれ spice プロトコルでコンソール接続できるようにしているのだが、実は1点、困ったことが起きている。

仮想マシンのコンソール用の接続ソケットは、 127.0.0.? の 9001 番ポートを使おうと考えていたんだ。
#つまり、全ての仮想マシンのコンソールは、ホストマシンである aquarius の 9001 番ポートで、IPアドレス部だけが変わる、という状態。
表にまとめると、以下のような感じを想定していた。
仮想マシンspice用IPspice用ポート
pisces127.0.0.19001
aries127.0.0.29001
taurus127.0.0.39001
gemini127.0.0.49001
......9001
( taurus とか gemini は作るかどうか不明。あくまで想定ね。)

ところが、実際に試してみるとわかるが、 pisces と aries の同時起動が出来ない。
片方が起動している状態でもう片方を起動しようとすると、
エラー: ドメイン aries の起動に失敗しました
エラー: 内部エラー: ポート 9001 の予約に失敗しました
というエラーが出て失敗する。

となると、 127.0.0.1 と 127.0.0.2 が実は同じもの、という想定が出来るのだが、 127.0.0.2:9001 でサービス起動していたら( aries を起動していたら)、 127:0.0.1:9001 への接続が出来るわけではない。
いったいどういうことなんだろう…?

至極単純に、 127.0.0.1:9001 をオープンしリッスンするプログラムと、 127.0.0.2:9001 をオープンしリッスンするプログラムを作って動かしてみればいいんだろう。
その手のプログラムはC言語で作るのが王道だが、実は aquarius にCコンパイラは入れていない。
perl や python で簡単に作れないだろうか?

ちょっと調べてみる…。
すぐ見つかった。 python で簡単に作れそうだ。
Pythonによる通信処理http://qiita.com/nadechin/items/28fc8970d93dbf16e81b

というわけで、上記のURLに載っているプログラムでサクっと試してみた。
結論としては…
127.0.0.1:9001 と 127.0.0.2:9001 で別のサービスを動かすことが可能だった。

ということは、 libvirt/qemu の spice サーバ側が何かバグを持っている、ということなのだろうか…。

原因が判明するかわからないが、ちょっと見てみよう。
http://packages.ubuntu.com/ja/
ここから、 libspice-server1 を検索して、出てきたページから以下の3つをダウンロードしてみる。
http://archive.ubuntu.com/ubuntu/pool/main/s/spice/spice_0.12.6-4ubuntu0.1.dsc
http://archive.ubuntu.com/ubuntu/pool/main/s/spice/spice_0.12.6.orig.tar.bz2
http://archive.ubuntu.com/ubuntu/pool/main/s/spice/spice_0.12.6-4ubuntu0.1.debian.tar.xz

1つ、展開してみる。
(aquarius) $ tar xvjf spice_0.12.6.orig.tar.bz2
(aquarius) $ cd spice-0.12.6/

展開された先に、 server という名前のディレクトリがある。
(aquarius) $ cd server

ここで grep 等を駆使して探してみると、どうやら reds.c というソースプログラムが socket を開いているようだ。
その関数は reds_init_socket() 。
この中で確かに socket を開いているのだが、どうもポート番号がバッティングしている、というチェックはしていない。(つまり、これよりも前の段階でポート番号のチェックを行っているっぽい)
で、 reds_init_socket() の呼び出し元を辿って行ったのだが、それらしいコードを見つけることは出来なかった。
reds_init_socket()

reds_init_net()

do_spice_init()

spice_server_init()

結局、原因はわからないってことで…。

しょうがないので、IPアドレスで切り替えるのを止めて、ポート番号で切り替えることにする。
(tls は使用しないと思うけど、一応記載)
仮想マシンspice用IPspice用ポートspice(tls)用ポート
pisces127.0.0.190019002
aries127.0.0.190039004
taurus127.0.0.190059006
gemini127.0.0.190079008
......90099010

pisces と aries の設定を変更するのはまた次回…。

0 件のコメント:

コメントを投稿