LinuxのKVMで、ゲストのIPアドレスを取得する方法の覚え書き。
/var/lib/libvirt/dnsmasq/virbr0.leases
等にDHCPサーバが仮想マシンにリースしたIPアドレスが入っていますので、ここから取得できます。
一方、物理NICへのブリッジを作っている場合は、ここには記録されませんので、ゲスト内でip addrコマンド等を実行しなくてはなりません。QEMU guest agent(qemu-ga)がゲストに入っていれば、いちいちゲストにログインしなくてもホスト側からネットワーク情報を問い合わせることが可能です。
事前準備
最近のFedora(20で確認)であれば、自動的に下記のセットアップが行われるはずです。それ以前のVMの場合などは、手動で事前の設定が必要です。
チャネルの作成
最近のvirt-managerであれば自動でqemu-ga用のchannelが作られますが、存在しない場合、
virt-manager等を使って org.qemu.guest-agent.0 という名前のChannelを作ります。
http://wiki.libvirt.org/page/Qemu_guest_agent にあるように、virsh edit等でゲスト構成XMLを編集する方法もあります。
jqのインストール
問い合わせの結果はJSONで返ってきます。見やすくする & 以下で使うスクリプトで利用するために、jqというJSONフィルタツールを導入しておきます。
sudo yum install jq
IPアドレスの取得
QEMU guest agentに、
{"execute":"guest-network-get-interfaces"}
という問い合わせを送ると、結果が帰ってきます。
# sudo virsh qemu-agent-command domain-name '{"execute":"guest-network-get-interfaces"}' | jq . { "return": [ { "hardware-address": "00:00:00:00:00:00", "ip-addresses": [ { "prefix": 8, "ip-address": "127.0.0.1", "ip-address-type": "ipv4" }, { "prefix": 128, "ip-address": "::1", "ip-address-type": "ipv6" } ], "name": "lo" }, ... "name": "eth0" } ] }
このままだと情報量が多すぎる&&コマンドも長いので、フィルタリングするためのシェルスクリプトを用意します。
https://gist.github.com/NeoCat/9903497
これをvirt-addrという名前でパスの通った場所に保存しておきます。
実行例:
$ virt-addr usage: virt-addr [OPTIONS] domain -6 get ipv6 address (default: ipv4) -h show this help -n show interface name -p show prefix -i interface specify interface (default: all)
$ virt-addr fedora20 127.0.0.1 10.0.0.123
$ virt-addr -n fedora20 lo: 127.0.0.1 eth0: 10.0.0.123
$ virt-addr -i eth0 -p fedora20 # prefix付きで表示 10.0.0.123/24
$ virt-addr -i lo -6 fedora20 # loインターフェースのIPv6アドレス ::1
ssh $(virt-addr -i eth0 fedora20) 等とすれば、対象ゲストにsshログインすることもできます。