KVMでホストオンリーネットワークを作る


[vagrant-kvmを使ってVMを立ち上げる](http://qiita.com/knqyf263/items/15917ec34cd9708e644c)で書いたように、`vagrant-kvm`を使ってVMを立ち上げたのですが、デフォルトだと`vagrant`というNATネットワークに属することになります。
NATネットワークではなく、VirtualBoxで言うところのホストオンリーネットワークに属させたい、という場合のやり方を書こうと思います。

#環境
- ホストOS
 - Ubuntu 14.04
- ゲストOS
 - ubuntu 14.04
- KVM
 - virsh 1.2.2
- Vagrant 1.6.5 
- vagrant-kvm 0.1.9

#手順
##KVMのネットワーク構成について
まず、KVMでVMを立ち上げた場合、どうなるかですが、特に何もせず立ち上げた場合は`default`というNATのネットワークに属します。
今回はvagrantを使って起動したので`vagrant`というネットワークに属しています。
`virsh`を用いて確かめることが出来ます。

```console
$ virsh net-list
 Name                 State      Autostart     Persistent
----------------------------------------------------------
 vagrant              active     yes           yes
```

このネットワークの詳細ですが、`net-dumpxml`を使うと確かめられます。

```
$ virsh net-dumpxml vagrant
<network connections='1'>
  <name>vagrant</name>
  <uuid>5450c7ae-3535-42d5-8d02-cb4cdb901c01</uuid>
  <forward mode='nat'>
    <nat>
      <port start='1024' end='65535'/>
    </nat>
  </forward>
  <bridge name='virbr0' stp='on' delay='0'/>
  <mac address='52:54:00:df:98:c3'/>
  <domain name='vagrant.local'/>
  <ip address='192.168.123.1' netmask='255.255.255.0'>
    <dhcp>
      <range start='192.168.123.100' end='192.168.123.200'/>
      <host mac='52:54:00:04:70:15' name='nic-1412957878' ip='192.168.123.7'/>
    </dhcp>
  </ip>
</network>
```

dhcpでIPアドレスを配っているので立ち上げたVMの数だけ<host/>が追加されます。
実体は`/etc/libvirt/qemu/networks/vagrant.xml`です。
同じディレクトリに`network-name.xml`が存在します。
中身がほぼ空なので、これを使ってホストオンリーネットワークを作ろうと思います。

```shell-session
$ cd /etc/libvirt/qemu/networks
$ sudo cp network-name.xml host_only.xml
$ sudo vim host_only.xml
<network>
  <name>host_only</name>
  <uuid>934780ae-3534-4ec4-8338-fe6a8379cbc5</uuid>
  <bridge name='host_only0' stp='on' delay='0'/>
  <mac address='52:54:00:25:f1:c6'/>
</network>
# ネットワークを定義します
$ virsh net-define host_only
Network host_only defined from host_only.xml
# 自動で起動するように設定します
$ virsh net-autostart host_only
error: failed to mark network host_only as autostarted
error: Requested operation is not valid: cannot set autostart for transient network
```

autostartを実行しようとしたら怒られました。
よく分からなかったのですが、
https://www.mynakedgirlfriend.de/libvirt-cannot-set-autostart-for-transient-network/
を見るに、一度`virsh edit`してからなら出来るみたいです。

```console
$ virsh
#net-editでMACアドレスの部分を消す。
virsh # net-edit host_only
<network>
  <name>host_only</name>
  <uuid>934780ae-3534-4ec4-8338-fe6a8379cbc5</uuid>
  <bridge name='host_only0' stp='on' delay='0'/>
</network>

Network host_only XML configuration edited.

virsh # net-autostart host_only
Network host_only marked as autostarted
```

あとはこれをVMにattachすれば完了です。
ホスト側にIPアドレスを自動で割り当ててくれたりはしないので、手動で割り振って下さい。
そのあたりは調べれば出ると思うので省略します。暇だったらいつか書きます。

##おまけ：固定IPアドレスのNATネットワーク
DHCPじゃなくて固定IPアドレスのNATネットワークも欲しくなったので追記しておきます。
上記のhost_only.xmlと同様に、xmlを作成します。
`vagrant.xml`をコピーして作ると手っ取り早いと思います。


```xml:host_only.xml
<network>
  <name>hostonly0</name>
  <forward mode='nat'/>
  <bridge name='hostonly0' stp='on' delay='0'/>
  <domain name='hostonly0.local'/>
  <ip address='192.168.124.1' netmask='255.255.255.0'>
  </ip>
</network>
```

uuidやmac addressは消します。
nameやbridge nameを変えて、ip addressのネットワークを他と被らないように変更したあと、dhcpの部分を消すだけです。
これで上記同様にすれば固定IPアドレスのNATネットワークが出来ます。