Ubuntuにkvm/QEMUをいれてCockpitで快適に仮想マシンサーバを運用してみる

ご家庭にある開発サーバっぽくつかうMini PCが低スペック×複数台になってしまったので、タイムセールで買ったMini PCに集約することにしました。ここではUbuntuで仮想サーバを構築したメモを残します。

# 今回入れ替えた環境

- 旧
    - Intel NUCほかMini PC×3台
    - CPUスコア 1500-2000おもにCeleronなど
- 新
    - Ryzen 4700U
    - RAM 16GB　SSD　500GB
    - 5万円くらい
    - Windows 11を削除してUbuntu 22をインストール

# 今回のゴール

各マシンを集約して効率運用したい。先日試したvscode-serverやDockerホスト用、家庭内DNSサーバほかツール群、たまに使うクリーンなWindows検証環境、その他立てたいときに使うサーバ用など、マシンリソースの効率化と管理の容易さを上げたいなと思っていました。

もともとはvirtualboxで行おうと思っていたのですが、kvmのパフォーマンスがいいらしいと聞いてkvm/QEMU環境で構築することにしました。サーバ用でGUI環境はインストールしていないものの、Webコンソールなんかがあったら便利だなーと思っていました。

検索したところ、Cockpitと呼ばれる管理コンソールが便利らしく、こいつを使うことにしました。

# 構築手順

前提：Ubuntu 22 ServerのisoをダウンロードしてUbuntu Server (minimal)でインストールした状態からスタートします。

## (たぶん不要)UbuntuのLVパーティションをディスク目いっぱいに広げる

なんかUbuntu 22では標準でLV（論理ボリューム）になっていたのですが、インストーラーデフォルトだと100GBしかアロケーションされていませんでした。そこで目一杯広げます。

```bash
## 確認
$ df -h
$ lsblk
## 広げる
$ sudo lvextend -l +100%FREE /dev/mapper/ubuntu--vg-ubuntu--lv
## 確認
$ lsblk
## ファイルシステムを追随させる
$ sudo resize2fs /dev/mapper/ubuntu--vg-ubuntu--lv
## 確認
$ df -h
```

## kvm/QEMUのインストール

おおむねこのサイトのとおり（Bridgeネットワーク以降はCockpitで実施します）

https://www.linuxtechi.com/how-to-install-kvm-on-ubuntu-22-04/

```bash
# 仮想化対応CPUか確認
$ egrep -c '(vmx|svm)' /proc/cpuinfo
8
# 0でなければOK　無事8コアぶん認識されてる
$  sudo apt install -y qemu-kvm virt-manager libvirt-daemon-system \
   virtinst libvirt-clients bridge-utils
```

### 仮想化daemonの有効化

```bash
$ sudo systemctl enable --now libvirtd
$ sudo systemctl start libvirtd
$ sudo systemctl status libvirtd
```

### kvmグループにユーザを追加

```bash
$ sudo usermod -aG kvm $USER
$ sudo usermod -aG libvirt $USER
```

## cockpit（WebGUI）をインストール

```bash
sudo apt install cockpit -y
sudo systemctl status cockpit
sudo systemctl start cockpit
sudo systemctl status cockpit
```

これでhttps://{IPアドレス}:9090/でWebGUIにアクセスできます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8727/32c7750e-4d97-8177-3eca-fba7718fec77.png)

かっちょいい画面が立ち上がりました。ここにUbuntuのユーザでログインします。


## ネットワーク管理をNetworkManagerに変更

標準のUbuntu Serverではnetplanによるネットワーク管理になっていたので、Cockpitで扱えるようにNetworkManagerでの管理に変更します。

```bash
$ sudo vim /etc/netplan/00-installer-config.yaml 


# This is the network config written by 'subiquity'
network:
  #  ethernets:
  #  enp1s0:
  #    dhcp4: true
  renderer: NetworkManager
  version: 2
```

version以外の定義をコメントアウトし、`renderer: NetworkManager`を追加しました。

有効にします

```bash
$ sudo netplan generate
$ sudo systemctl restart NetworkManager
```

これで、Cockpitからネットワークを管理することができるようになりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8727/c362093c-4d62-fb80-1307-ba43dfa0b28b.png)

## bridgeネットワークの作成

※この作業は既存のネットワークを一度切断し、あたらしいbridgeネットワークで接続するため、DHCP環境ではIPアドレスの変更を伴います。そのためリモート経由でなくオフライン操作ができる環境で作業しましょう。

ちなみに今回bridgeネットワークを作成しましたが、どういう用途でどのネットワークを作成すべきかは、この記事がわかりやすいのでおススメです。kvmようではありませんが、もともとvboxユーザなので。。。

https://qiita.com/feifo/items/0fde474005589afcff68

bridgeネットワークの作成はCockpit左側のネットワーキングから、「ブリッジの追加」を押して、既存のインターネットにつながるデバイスを選択するだけです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8727/f0dca87d-21df-ec3c-2238-e1d8632e5e28.png)

適用すると、リモートから作業している場合いきなり切断されるのでご注意ください。あらたに`ip addr`などでIPアドレスを調べて、再接続します。

## 仮想マシンの作成

仮想マシンもこの勢いで作っていきましょう。cockpitにプラグインがありますので導入します。

```bash
$ sudo apt install cockpit-machines

```

Web画面をリロードすると、仮想マシンというメニューが現れます。ここから仮想マシンを作成するのですが、リモートからダウンロードする方法ではうまくいかなかったため、isoイメージをダウンロードしておきました。

```bash
$ wget "https://releases.ubuntu.com/22.04.1/ubuntu-22.04.1-live-server-amd64.iso"

```

そうすると、メモリとストレージ容量を選択するだけですぐに作成することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8727/75b0909d-787e-0161-245f-abb16b5f54a2.png)


起動中の仮想マシン画面を開くとこんな感じで、勝手にVNCからコンソール画面が転送されてきてめちゃくちゃ使いやすいです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8727/1c39ae55-4ed7-0ef6-8b31-0341cb93230b.png)

インストール完了時にcdromのejectに失敗したので、そこだけコマンド打ち込みました。

```bash
$ virsh change-media ubuntu-code --path sda --eject --live
```

# まとめ

ベンチはとっていませんがいろいろインストールしたりソースをビルドした感じ、なかなかパフォーマンスは良さそうです。管理画面からvCPUの数やメモリの量を再割り当て可能なので、とても使いやすい感じです。ぜひお手持ちの仮想環境をひっこしする際には候補に入れてあげてください。