KVMチュートリアル (VMのセットアップと簡単な操作) 

- VMのインストールからVMの操作までのチュートリアル的なドキュメントです。
- ホストOSは`Ubuntu 20.04`を前提としています。

# ゲストOSのインストール
VMのスペックは以下のようにしましたが後から変更可能です。
- VM名：vm01
- vCPUの数：2
- RAM容量：2 GiB

[参考文献](https://ubuntu.com/blog/kvm-hyphervisor)
```sh
# 関連パッケージのインストール
sudo apt update
sudo apt -y install \
    bridge-utils \
    cpu-checker \
    libvirt-clients \
    libvirt-daemon \
    virt-manager \
    qemu \
    qemu-kvm \
    curl

# ゲストOSのインストール (ubuntuのインストーラが起動)
## IPアドレスはDHCPでインストールします。
## インストーラに従ってOpenSSH serverをインストールしてください。
sudo virt-install \
    --name vm01 \
    --os-variant ubuntu20.04 \
    --vcpus 2 \
    --ram 2048 \
    --location http://ftp.ubuntu.com/ubuntu/dists/focal/main/installer-amd64/ \
    --network bridge=virbr0,model=virtio \
    --graphics none \
    --extra-args='console=ttyS0,115200n8 serial'

# インストールが終わったら以下のキーを入力して，シェルに戻りましょう
ctrl ]
```

# OSの起動
以下ホスト上で打つコマンドを`ホスト：`，ゲスト上で打つコマンドを`ゲスト：`と書いています。
`virsh`はホストOSからKVMのVMを管理するコマンドです。
```sh
# ホスト：vm01が起動していることを確認
sudo virsh list
# ホスト：起動していない場合はゲストOSの起動
sudo virsh start vm01

# ホスト：ゲストIPアドレスの確認
sudo virsh net-dhcp-leases default

# ホスト：SSHでゲストに接続 (usernameはインストーラで設定したユーザ名に置き換えてください)
ssh username@192.168.122.xx

# ゲスト：ホストからゲストにコンソール接続出来るようにする
sudo systemctl start serial-getty@ttyS0
sudo systemctl enable serial-getty@ttyS0
# ゲスト：sshセッションを切断してホストに戻る
exit

# ホスト：ゲストへのコンソールアクセスできる事を確認 
## コンソール接続は，ssh出来なくなった時の緊急手段として使ったりします
sudo virsh console vm01
# ゲスト：コンソール切断 (コマンドではないです)
ctrl ]
```

# 簡単なvirshコマンド
よく使うvirshコマンドを紹介します。
```sh
# ホスト：起動
sudo virsh start vm01
# ホスト：シャットダウン
sudo virsh shutdown vm01

# ホスト：一時停止
sudo virsh suspent vm01
# ホスト：再開
sudo virsh resume vm01

# ホスト：強制終了
sudo virsh destroy vm01
# ホスト：削除
sudo virsh undefine vm01

# ホスト：接続
sudo virsh console vm01

# ホスト：仮想マシン一覧  
sudo virsh list --all
# ホスト：仮想マシンの情報  
sudo virsh dominfo vm01
```

# ハードウェアリソースの割り当て
後からメモリサイズとかvCPU数とかを変更したくなった時に参考にしてください[[参考文献](https://www.eastforest.jp/centos6/3694)]
ハードウェアリソースの設定はVMをシャットダウンさせてから行います。
```sh
# ホスト：ゲストのシャットダウン
sudo virsh shutdown vm01
# ホスト：シャットダウンの確認
sudo virsh list --all
```

## メモリサイズの設定
```sh
# ホスト：メモリの変更
sudo virsh setmaxmem vm01 8G
sudo virsh setmem vm01 8G --config
# ホスト：メモリサイズの確認
sudo virsh dominfo vm01
```

## vCPUの設定
vCPU数の変更
```sh
# ホスト：vCPU数の変更
sudo virsh setvcpus vm01 4 --config --maximum
sudo virsh setvcpus vm01 4 --config
# ホスト：vCPU数が変更されたことを確認
sudo virsh dominfo vm01
```

物理コアとvCPUの対応付けの固定
```sh
# ホスト：ゲストの起動
sudo virsh start vm01
# ホスト：物理コアとvCPUの対応付けが時々刻々と変わっていることを確認
sudo virsh vcpuinfo vm01
# ホスト：物理コアとvCPUを対応付ける
# virsh vcpuin vm01 <vCPU> <物理コア>
sudo virsh vcpupin vm01 0 0
sudo virsh vcpupin vm01 1 1
sudo virsh vcpupin vm01 2 2
sudo virsh vcpupin vm01 3 3
# ホスト：固定されていることを確認
sudo virsh vcpuinfo vm01
```

# スナップショット
[参考文献](https://qiita.com/hana_shin/items/c43f824f16797e0d7e62)
```sh
# ホスト：作成
sudo virsh snapshot-create-as --domain vm01 --name init
# ホスト：確認
sudo virsh snapshot-list --domain vm01
# ホスト：復元
sudo virsh snapshot-revert --domain vm01 --snapshotname init
# ホスト：削除
sudo virsh snapshot-delete --domain vm01 --snapshotname init
```

# まとめ
- 本記事ではKVMを使ったハイパーバイザ型VMの構築について解説をしました。
- 今回はIPアドレスをDHCPで割り当てましたが，ubuntuの場合`/etc/netplan`配下のyamlファイルにIPアドレスの設定を書けば静的に割り当てることも可能です。
- ディスク容量の拡張は少し複雑なので省略しました。デフォルトでは20 GB程度割り当てられていると思います。
- ハイパーバイザ上で動作するVMは独自にカーネルを持つため，Docker等のホストとカーネルを共有する仮想化方法では出来ないことが出来たりして結構便利です。例えばVMを複数立ち上げれば，各VMをノードとしたマルチノードKubernetesクラスタを疑似的に作ることも出来たりします。

# 参考文献
- [ゲストOSのインストール](https://ubuntu.com/blog/kvm-hyphervisor)
- [ハードウェアリソースの割り当て](https://www.eastforest.jp/centos6/3694)
- [ディスクの確認](https://blog.adachin.me/archives/2023)
- [スナップショットの作成](https://qiita.com/hana_shin/items/c43f824f16797e0d7e62)