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

# はじめに
あたらしいUbuntuがリリースされたので、自宅のサーバ(FUJITU PRIMERGY TX1310)を更新した。せっかくなのでUbuntu ServerをSSHサーバのみの最小インストールで構築した。サーバ本体は母艦として最小限の環境を維持し、学習環境は仮想マシン上に構築し、コピーや廃棄を可能としたい。

# パッケージのインストール
とりあえずpingがないことにびっくりしたのでpingを入れる。
```sh
$ ping 8.8.8.8
-bash: ping: command not found

$ sudo apt install iputils-ping
```

viが無いことにもびっくりしたので入れる。
ありがたいことにvimを入れると自動的にaliasしてくれるようだ。
```sh
$ vi /etc/fstab
-bash: vi: command not found

$ sudo apt install vim
$ vi /etc/fstab
```

virshを入れるが、この時点ではまだ動かない。
```sh
$ virsh
-bash: virsh: command not found

$ sudo apt-cache search virsh | grep lib
libvirt-clients - Programs for the libvirt library

$ sudo apt install libvirt-clients

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

virt-installを入れる。
```sh
$ virt-install
-bash: virt-install: command not found

$ sudo apt-cache search virt-install | grep util
virtinst - utilities to create and edit virtual machines

$ sudo apt install virtinst
```

ここでvirt-installが入ったか確かめようとmanを見ようとしたが、以下のように蹴られる。
```sh
$ man virt-install
This system has been minimized by removing packages and content that are
not required on a system that users do not log into.

To restore this content, including manpages, you can run the 'unminimize'
command. You will still need to ensure the 'man-db' package is installed.
```

しかたがないのでunminimizeコマンドとやらを叩いてみる。manも見れないようだと不便なので、次回インストールするときは最小インストールはやめておこうと思った。
```sh
$ sudo unminimize
This system has been minimized by removing packages and content that are
not required on a system that users do not log into.

This script restores content and packages that are found on a default
Ubuntu server system in order to make this system more suitable for
interactive use.

Reinstallation of packages may fail due to changes to the system
configuration, the presence of third-party packages, or for other
reasons.

This operation may take some time.

Would you like to continue? [y/N] y
...
$ man virt-install
```
見えた。

ここまでやったらいろいろ自動的に入ったのかvirshもqemu-imgも実行でるようになっていた。
最小インストールでなかったら何も苦労しなかったのかもしれない。
```sh
$ qemu-img
qemu-img: Not enough arguments
Try 'qemu-img --help' for more information

$ virsh list
 Id   Name   State
--------------------

$
```
最初からやりなおしたい気持ちを抑えて、先に進むことにする。

# 仮想マシンを作る

qcow2で８０GBのディスクイメージを作る。
```sh
$ qemu-img create -f qcow2 main.qcow2 80G
Formatting 'main.qcow2', fmt=qcow2 cluster_size=65536 extended_l2=off compression_type=zlib size=85899345920 lazy_refcounts=off refcount_bits=16
$ file main.qcow2
main.qcow2: QEMU QCOW2 Image (v3), 85899345920 bytes
```

ここでvirsh listできなくなっていることに気がついた。調べるとlibvirtdが動作していないようだ。動くようにする。ここも次回インストールするとき(があるかわからないが)、改善できる工程になるだろう。
```sh
$ 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
$ sudo apt install libvirt-daemon-system
$ sudo systemctl enable --now libvirtd
$ sudo virsh list
 Id   Name   State
--------------------

$ sudo shutdown -r now
$ virsh list
 Id   Name   State
--------------------

$
```

いよいよインストール
```sh
$ virt-install -n main -r 4096 --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-22.04-live-server-amd64.iso 

Starting install...
Creating domain...                                                                                           |    0 B  00:00:00     

Domain is still running. Installation may be in progress.
You can reconnect to the console to complete the installation process.
$ 
```
いま、この瞬間、仮想マシンがインストールCDで起動されている状態になっている。

# 仮想マシン上にOSをインストール
VNCで仮想マシンに接続する。Macであれば

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

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

```sh
$ virsh list
 Id   Name   State
----------------------
 1    main   running

$ virsh shutdown main
Domain 'main' is being shutdown

```

# 仮想マシンに固定IPアドレスを設定する
まずはブリッジの設定から。
ブリッジはopen vswitchを使うのが趣味なので個別に入れる。
```sh
$ 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
c01c25d2-d149-4cc4-bd69-ab1bf46c0a0a
    Bridge ovs-ext
        Port enp2s0
            Interface enp2s0
        Port ovs-ext
            Interface ovs-ext
                type: internal
    ovs_version: "2.17.0"
```

起動時にenp2s0をUPさせる。
いろいろ試行錯誤したが下のやりかただと、最少の手間でできそう。
```sh
$ vi /etc/netplan/00-installer-config.yaml 
network:
  ethernets:
    enp0s25:
      ...
    enp2s0:         #追加
      dhcp4: no     #追加
      dhcp6: no     #追加
  version: 2
```

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

interfaceの箇所を探し、以下のように編集する。
```xml:編集前
    <interface type='network'>
      <mac address='52:54:00:5d:c5:ea'/>
      <source network='default'/>
      <model type='virtio'/>
      <address type='pci' domain='0x0000' bus='0x01' slot='0x00' function='0x0'/>
    </interface>
```

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

```sh
$ virsh start main
```
mainが起動したら仮想マシンに固定IPアドレスを設定して終わり。
複数の仮想マシンを作りたければovs-extに接続すればネットワークに直接足だしができる。

おわり