Vagrant: 仮想マシンのコピーとネットワーク
ZeroMQで遊んでいたらPub/Subに限りトランスポートプロトコルにPGM(RFC3208)を選択できる事を知った。
PGMはUDPと同じトランスポートレイヤのプロトコルで動作するマルチキャストを提供する実験的なプロトコルで、 実装にはOpenPGMがある。 Blackduckをみると2011年頃には開発が止まっている。
EPGMはPGMをUDPに埋め込んだプロトコル。
PGMの利用にはマルチキャストをサポートするデバイスを使って通信する必要がある。 だがループバックデバイスはマルチキャストをサポートしていない。
しかし他の仮想デバイス(enp0s9, …)はサポートしていた。 そこで現在のVMをコピーして内部ネットワーク内に2台起動している状態を作る事にした。 今の設定の時点で"public_network“を使っているため単純に2台起動するだけで仮想マシン間で通信可能になるが、別の機会に活かすためプライベートネットワークの設定も調べた。
これによりZeroMQ over PGMを試せる状態になった。 しかし手数が多いわりに、開発も停止した古い実験的なプロトコル上でZeroMQが稼働するのを観察するだけ。。 (自分も含めて)誰得作業に突き進んでいて末法って感じがする。 しかも別の機会に書くけど(e)pgm上でZeroMQ を動かせずに終わった。。
Vagrantについては下を参考にコマンドとモデルを知っておく
だいたい下を眺めた。ただしリストの最後の2つでVagrantのネットワークに関する説明が読めるけど整理が不完全な気配がある。
- [official doc.]Vagrant::Networking
- [official doc.]Vagrant.Provider.VirtualBox.Networking
- Vagrantコマンドのチートシート
- VagrantコマンドとVagrantfileの設定メモ
- Vagrantのネットワーク周りのあれこれ(ちょっと怪しい)
- vagrantのネットワークについて(ちょっと怪しい)
仮想内部ネットワークはVirtualBoxの用語だし、ホストオンリーアダプタは内部ネットワークを提供するVirtualBoxの用語になる。 簡単にはVagrantのホストオンリーアダプタという用語は見つけられなかった。
Qiita記事などによるとホストオンリーアダプタは仮想ネットワークインタフェースを作成してホストとゲストに閉じたネットワークを構築するらしい。 プロバイダがVirtualBoxの場合しか確認していないものの、その様なネットワークは構築されない。
プロバイダがVirtualBoxの場合、ゲストOSはデフォルトでNATを経由し外部ネットワークに接続する。 VirtualBoxのオプションでポートフォワードを設定できる様になっておりVagrantはデフォルトでssh用にポートフォワードを設定している。 これによりホストからゲストへsshが可能になるが、ホスト・ゲストのみが所属するネットワークが構成されるわけではない。 (この辺を調べるのに下のコマンドを利用した)
|
|
ref. Linuxと挙動がちがってて使いにくいOSXのコマンド(top/ps/netstat)の代替)
現在のVMを増やす手順
やった作業は下になる。
- 利用中VMのスナップショットをboxファイルにパッケージ化
- boxファイルをboxリストに登録
- Vagrantファイルを書き換えて内部ネットワークを共有する設定に変更
- 新規ノードを立ち上げる
- ファイアウォールを停止
1, 2 スナップショットのboxリスト登録まで
下のコマンドで完了。改めてVagrantは便利。
|
|
3 Vagrantファイル書き換えまで
Vagrantファイルはずいぶん前にAnsibleのプロビジョニングを設定していたものを利用していた。 今回、下の様に書き換えた。ポイントは3つ。
- 既存ノードはdefaultとして名前も設定も維持する
- 新規ノード(fortest)を定義、boxには作ったスナップショットを利用する
- 通信に使うプライベートネットワークはVirtualBoxの仮想内部ネットワークを利用する
|
|
4,5 新規ノードを立ち上げてファイアーウォールを停止する
以下のようにfortest ノードを立ち上げる。 (打ちミスしてdefault ノードを破壊してもスナップショットがあるので問題ないので気楽)
|
|
内部ネットワークを共有する2台のVMを立ち上げられた事になる。 疎通確認としてはpingを利用する。またICMP以外が通過しなかったのでとりあえずファイアーウォールを停止した。
|
|
とりあえず以上でスナップショットを使った簡単VM複製(内部ネットワークで通信可能)は完了する。 確認したところ、ここまで実施したらTCP上でZeroMQを利用できた。