ubuntu 18.04 上でkvm仮想マシンを動作させるまでの最低限の手順

# はじめに
自宅のサーバ(FUJITU PRIMERGY TX1310)にubuntu 18.04をクリーンインストールしたので、仮想マシンを動かすまでの設定を記録しておく。サーバ本体は母艦として最小限の環境を作り、学習環境は仮想マシン上に構築し、コピーや廃棄を可能としたい。

# 必要なパッケージだけ入れる
virshコマンドが実行できるようにする。

```bash
$ virsh

Command 'virsh' not found, but can be installed with:

sudo apt install libvirt-clients

$ sudo apt install libvirt-clients
```

仮想マシンイメージを作るときに使用する。

```bash
$ qemu-img

Command 'qemu-img' not found, but can be installed with:

sudo apt install qemu-utils

$ sudo apt install qemu-utils
```

kvmで動かしたいのでこれも入れる。

```bash
$ kvm

Command 'kvm' not found, but can be installed with:

sudo apt install qemu-kvm

$ sudo apt install qemu-kvm
```

```bash
$ virt-install

Command 'virt-install' not found, but can be installed with:

sudo apt install virtinst

$ sudo apt install virtinst
```
virsh listしてみるもこの時点ではまだ動かない。

```bash
$ sudo virsh list
error: failed to connect to the hypervisor
error: Failed to connect socket to '/var/run/libvirt/libvirt-sock': No such file or directory

```
これも必要っぽいので入れる。

```bash
$ sudo apt install libvirt-bin
$ sudo virsh list
 Id    Name                           State
----------------------------------------------------
 
```
これで一旦、準備完了。ubuntu 16.04のときはlibvirt-binを個別にインストール必要がなかったので、何か変化があったのかもしれない。

ここでいったん再起動しておく。

```bash
$ sudo shutdown -r now
```

# 仮想マシンを作る
まずはディスクイメージの作成。下の例では150GBのQCOW2イメージを作っている。

```bash
$ qemu-img create -f qcow2 main.qcow2 150G
Formatting 'main.qcow2', fmt=qcow2 size=161061273600 cluster_size=65536 lazy_refcounts=off refcount_bits=16
$ file main.qcow2
main.qcow2: QEMU QCOW Image (v3), 161061273600 bytes
```
ディスクにOSをインストールする。今回はubuntu 18.04上にubuntu 18.04をインストールする。

```bash
$ virt-install -n main -r 8192 --disk=/usr/devel/vm/main.qcow2,bus=virtio --graphics vnc,password=vnc,listen=0.0.0.0,keymap=ja --noautoconsole -v --boot hd --cdrom /usr/devel/iso/ubuntu-18.04-live-server-amd64.iso
WARNING  No operating system detected, VM performance may suffer. Specify an OS with --os-variant for optimal results.

Starting install...
Domain installation still in progress. You can reconnect to
the console to complete the installation process.
```

# 仮想マシン上にOSをインストール
先ほどの手順まで正常に進んでいると、仮想マシンがインストールCDで起動している状態になっているはずなので、VNCで接続する。Macであれば

- Finderを右クリック
- サーバへ接続
- vnc://<サーバのIPアドレス>/ に接続
- パスワードはvnc 

インストールの段階においては、IPアドレスはDHCPで取得する設定で進める。あとで静的IPアドレスが割り当てられるよう設定を変更する。インストールが完了したら再起動する。

# 仮想マシンに静的IPアドレスを設定する
今の状態だとlinux bridgeがDHCPでIPアドレスを払い出し、仮想マシンからインターネット向けの通信についてはNATされて出て行くので、固定IPアドレスが割り当てられるように設定していく。サーバの物理ポートが一個余っているので、VMには母艦とは別のポートを使用し、アドレスは母艦と同じセグメントの値を割り当てることにする。

これから仮想マシンの設定を変えることになるので、一旦仮想マシンをshutdownする。

```bash
$ virsh shutdown main     # mainという名の仮想マシンをshutdown
```

今後、仮想マシンを複数立てる予定なので、物理ポート直結ではなく、bridge経由にする。bridgeは私の趣味によりovsにする。

```bash
$ ovs-vsctl

Command 'ovs-vsctl' not found, but can be installed with:

sudo apt install openvswitch-switch

$ sudo apt install openvswitch-switch
$ sudo ovs-vsctl add-br ovs-ext             # ovs-extという名のbridgeを作る
$ sudo ovs-vsctl add-port ovs-ext enp2s0    # 空きの物理ポートを取り付け
$ sudo ovs-vsctl show
5202f5fe-f794-4d79-b2d1-0036dde8e5ae
    Bridge ovs-ext
        Port "enp2s0"
            Interface "enp2s0"
        Port ovs-ext
            Interface ovs-ext
                type: internal
    ovs_version: "2.9.0"
$
```

~~デフォルトで作られたlinux bridgeは不要なので停止する。~~
仮想マシンを増やす予定がある場合はこの操作は不要。(2019/02/16更新)

```bash
$ virsh net-list
 Name                 State      Autostart     Persistent
----------------------------------------------------------
 default              active     yes           yes

$ virsh net-info default
Name:           default
UUID:           30379418-5670-4ba0-8d11-6588bb33c722
Active:         yes
Persistent:     yes
Autostart:      yes
Bridge:         virbr0

$ virsh net-destroy default
Network default destroyed

$ virsh net-autostart default --disable
Network default unmarked as autostarted

```

仮想マシン側がovs-extを使用するよう、定義ファイルを編集する。

```
$ virsh edit main
```

interfaceの箇所を探し、以下のように編集する。

```xml:編集前
    <interface type='network'>
      <mac address='52:54:00:0e:5c:fe'/>
      <source network='default'/>
      <model type='rtl8139'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
    </interface>
```

```xml:編集後
    <interface type='bridge'>
      <source bridge='ovs-ext'/>
      <virtualport type='openvswitch'/>
      <model type='virtio'/>
    </interface>
```
macアドレスやaddressについては、省略しても問題ない。自動的に再割り当てが行われる。
これで仮想マシン側に静的IPアドレスを設定すれば、直接(NATなしで)ネットワークにでることが可能になる。

# 編集後記
ovs bridgeに追加した物理ポート`enp2s0`だが、何も設定しないと物理的にリンクアップしない。ubuntu 16.04までは`/etc/network/interfaces`に

```
auto iface enp2s0
iface enp2s0 inet static
        address 0.0.0.0 
```
と書いておけばインターフェースがUPしていた。
ubuntu 18.04からは`/etc/netplan/50-cloud-init.yaml`を編集することになる。
これについても同じように

```
network:
    ethernets:
        enp0s25:
            -- 省略 --
        enp2s0:
            addresses:
            - 0.0.0.0/0
            optional: true
    version: 2
```
と書いてみたのだが、構文エラーになるようで肝心のenp0s25のIPアドレスすら設定されずに起動してくる有様だった。(サーバにモニターを接続して、再編集するのに時間を取られてしまった...)

実際下記のように設定するとうまくいったのでここに記録しておく。

```
network:
    ethernets:
        enp0s25:
            -- 省略 --
        enp2s0:
            addresses:
            - 0.0.0.0/32
            optional: true
    version: 2
```
ネットマスク長を32にすることで無事インターフェースがUPしたが、なぜだかenp2s0には10.0.0.1/32が設定されていた。気持ちが悪いので今は`192.168.255.255/32`を設定している。

0.0.0.0/32を設定すると10.0.0.1/32が設定されるのが仕様なのかは、時間ができたら調べてみようと思う。

# 2018/12/02 編集
ディスクが故障して再インストールした。手順を更新。