QEMU guest agentを使って仮想マシンのIPアドレスを取得

LinuxKVMで、ゲストのIPアドレスを取得する方法の覚え書き。


VMNICの接続先が仮想ネットワークであれば、

/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を編集する方法もあります。

QEMU guest agentのインストー

Fedoraではゲスト上にインストールされた場合、自動的にQEMU guest agentが導入され、qemu-gaというプロセスが実行されます。入っていない場合は、

sudo yum install qemu-guest-agent

で導入できます。Ubuntu等の場合は、

sudo apt-get install qemu-guest-agent

で。

勝手に有効になるはずですが、念のため sudo systemctl enable qemu-guest-agent を実行しておきます。

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ログインすることもできます。