Ubuntu＋XenのVM構築手順

# はじめに

LPIC305の勉強をしていく中で[Xen](https://wiki.xenproject.org/wiki/Main_Page)をいじる機会があったのでVMの構築方法を備忘録がてら記載しておきます。

Xen＋LivbirtでVMを構築している手順はQiitaで[見かけます](https://qiita.com/masatonasou/items/5c29252934a39663178f)が、`Libvirt`を入れずに**XenだけでVMを構築する手順**が見当たらなかったので今回記事を作りました。

以下が今回の要件です。

- [Proxmox](https://pve.proxmox.com/wiki/Main_Page)を使用してホストとなるVMを立てます。
- そのホストVMにXenをインストールします。
- ホストVM(Dom0[^1])は「Ubuntu Server 22.04.05 LTS」です。
- ゲストVM(DomU[^1])も「Ubuntu Server 22.04.05 LTS」です。
- GUIは入れるのが面倒なので入れません。コンソールで頑張ります。
- Xenのゲストタイプは[HVM](https://wiki.xenproject.org/wiki/Xen_Project_Software_Overview#HVM_and_its_variants_.28x86.29)とします。

[^1]: 「Domain 0」「Domain U」の意味がわからない人は[Xen Wiki](https://wiki.xenproject.org/wiki/Xen_Project_Software_Overview#Introduction_to_Xen_Project_Architecture)を見てください。

基本的には[公式手順](https://help.ubuntu.com/community/Xen#Creating_vms)を参考にしていますが、ちょいちょいハマるポイントがあるので、このままやれば構築できるように書き直しています。


# ホスト(Dom0)の構築

[Ubuntu Server 22.04.05 LTS](https://releases.ubuntu.com/22.04/?_gl=1*s68ak5*_gcl_au*MTIzMDk4MjYwNC4xNzI3NjI1NDI4&_ga=2.137089587.2017345655.1728100089-367481063.1726969423)でホスト用のVMを作ります。

:::note warn
注意
Ubuntu server **24.04.01** LTSで本手順を進めると`sudo apt install xen-hypervisor-amd64`を実施して`reboot`したあとに**正常にVMが起動しなくなります**。
そのためこの記事ではUbuntu Server **22.04.05** LTSで実施しています。
![スクリーンショット 2024-10-05 21.26.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395943/6a89905a-e31f-3916-c9dc-ec4293e2475e.png)
:::


Proxmoxを使ってのVM構築は他にいくらでも記事が転がっていると思うので詳細には触れません。

ただしcpuの設定ではhvmを有効化しておいてください。
（今回Proxmoxを入れているサーバがIntel N100なので`hv-evmcs`になっています）

![スクリーンショット 2024-10-05 15.07.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395943/6fd0e40d-b10f-a1bf-fd58-6fb70d259fa5.png)

今回はXenを載せるのでメモリは気持ち多めの8GB、ディスクは24GBとしています。[^2]
（Xenのゲスト用のディスクはまたあとで払い出すので、ディスクもそこまで大きくなくてOKです）

ひとまず以下のような感じで作っています。 

[^2]:今回入れるのはUbuntu Server 22.04.05ですが、Ubuntu Server 24.04.01の[システム要件](https://ubuntu.com/download/server#system-requirements)はメモリ1GB、ディスク5GBのようです。

![スクリーンショット 2024-10-05 13.13.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395943/5b6b172d-5063-a790-c81e-b51ed3538afe.png)

なおProxmox 8.2.7だと`hv-emvcs`を有効にするとなぜかVMが正常に起動してこなくなるので
ここでProxmox自体にSSHログインをして、VMの設定ファイルを直接変更します。[^3]


[^3]: だいぶ[前のバージョンからのバグ？](https://forum.proxmox.com/threads/nested-virtualization-stopped-working-pve-6-1-5.64316/)のようです。

`args: -cpu host,+vmx`を一番上にでも追記しておいてください。
今回はProxmoxで私が作ったVMのIDが113なので`113.conf`になっていますが、各々の環境でIDは変わるので気をつけてください。

```/etc/pve/qemu-server/113.conf
args: -cpu host,+vmx
boot: order=scsi0;ide2;net0
cores: 1
cpu: x86-64-v2-AES,flags=+hv-evmcs
ide2: local:iso/ubuntu-22.04.5-live-server-amd64.iso,media=cdrom,size=2086842K
memory: 8096
meta: creation-qemu=9.0.2,ctime=1728100750
name: ubusv22
net0: virtio=BC:24:11:9B:D7:25,bridge=vmbr0,firewall=1
numa: 0
ostype: l26
scsi0: local-lvm:vm-113-disk-0,iothread=1,size=24G
scsihw: virtio-scsi-single
smbios1: uuid=75f2d119-3a2d-4e48-ba3f-fdfa0ec64f32
sockets: 2
vmgenid: 533945e4-6ba8-4f86-87ed-0a4f2859f3c6
```

こうすればVMが起動するのでコンソール上で適当にインストールを進めてください。

![スクリーンショット 2024-10-05 13.07.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395943/43598f45-6a97-90b5-4de6-4bb165171e3b.png)

ほぼデフォルト設定でOKですが今回は他のホストからアクセスしやすいように固定IPにしました。
固定IPじゃなくてもなんとかなりますが、この記事では以下のように固定IPとして進めます。

各項目は各環境で異なると思うので参考として使ってください。

- Subnet    192.168.3.0/24
- Address    192.168.3.217
- Gateway     192.168.3.1
- Name Server 192.168.3.1
- Search domains 設定なし

![スクリーンショット 2024-10-05 20.00.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395943/e354cf5d-43e8-f115-f80a-ba4bf504760e.png)

今回の例では`test`というローカルアカウントを作り、サーバ名は`ubu22`としています。
これ以降の画像でもホスト名が`ubu22`であったらホストVMと判断してください。

![スクリーンショット 2024-10-05 20.13.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395943/c491e23b-83b6-0b10-ba5e-b42703f34615.png)

インストール完了したら再起動すると思うので、起動したら今作ったVMにSSHログインします。
（そのままコンソールでやってもいいですがコピペができないのでSSH推奨です）

```
ssh test@192.168.3.217
```

ログインできたらaptでインストールします。

```
sudo apt update
sudo apt upgrade
sudo apt install xen-hypervisor-amd64
```

![スクリーンショット 2024-10-05 13.19.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395943/fd9219dc-730e-fa40-0d05-ba19bd9605ca.png)

`xen-hypervisor-amd64`はいっぱいインストールすることになりますが気にせず入れます。

![スクリーンショット 2024-10-05 13.20.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395943/c2ee12fa-19d1-36bf-c141-00c662815a68.png)

インストールが終わったら再起動します。

```
sudo reboot
```

![スクリーンショット 2024-10-05 13.23.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395943/8e593813-9ef0-2f1a-b315-c79945ccd8e0.png)


立ち上がってきて`xl list`コマンドが正常に打てればひとまずXenのインストールは完了です。

```
sudo xl list
```

![スクリーンショット 2024-10-05 13.26.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395943/ba422816-be7e-c80e-00e5-03b2aaf39fbb.png)

# Networkの設定

公式手順の[Disable Network Manager](https://help.ubuntu.com/community/Xen#Network_Configuration)については、Ubuntu22でNetwork Managerを使っていないので飛ばします。

`bridge-utils`は先ほどXenを入れた時に一緒に入ったので飛ばしてOKです。

![スクリーンショット 2024-10-05 14.03.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395943/b7b2e07b-2722-ab9a-06e7-02c47c6f0ddb.png)


`brctl`は何もせずとも打てるはずです。

```
brctl show
```

![スクリーンショット 2024-10-05 14.04.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395943/d2fd14bd-9dcc-d19c-97f7-3375fad4b33e.png)

公式手順だと`/etc/network/interfaces`をいじっていますが、Ubuntu22は`Netplan`を使っているのでその設定ファイルを書き換えていきます。


まずは既存のファイルをバックアップしてから編集します。

```
sudo mv /etc/netplan/50-cloud-init.yaml /etc/netplan/50-cloud-init.yaml.bak
sudo vim /etc/netplan/00-installer-config.yaml
```

`xenbr0`を作って`ens18`の設定を移す形になります。STPは正直お好みです。
IF名は各々の環境で異なる可能性があるので気をつけてください。

```/etc/netplan/00-installer-config.yaml
network:
  version: 2
  renderer: networkd
  ethernets:
    ens18:
      dhcp4: no
  bridges:
    xenbr0:
      interfaces: [ens18]
      addresses:
      - 192.168.3.217/24
      nameservers:
        addresses:
        - 192.168.3.1
      routes:
      - to: default
        via: 192.168.3.1
      parameters:
        stp: false
```


また`50-cloud-init.yaml`を読むと分かるのですが、このままだと再起動時に`50-cloud-init.yaml`が再生成されてしまうのでcloud-init側も編集しておきます。

```
sudo mv /etc/cloud/cloud.cfg.d/90-installer-network.cfg /etc/cloud/cloud.cfg.d/90-installer-network.cfg.bkup
sudo vi /etc/cloud/cloud.cfg.d/90-installer-network.cfg
```

```/etc/cloud/cloud.cfg.d/90-installer-network.cfg
network: {config: disabled}
```


`00-installer-config.yaml`はファイルパーミッション的にまずいので制限します。
その後`netplan apply`してちゃんと設定できているかを確認します。

```
sudo chmod 600 /etc/netplan/00-installer-config.yaml
sudo netplan apply
ip a
```

`vSwitch`のワーニングが出ていますが無視します。(エラーに書いている通りOpenVSwitch入れると多分消えると思いますが、このままでも普通に動いたのでそのままにしています)
また`ip a`コマンドで`xenbr0`がちゃんと作られていることを確認します。

![スクリーンショット 2024-10-05 14.16.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395943/e90bbf78-e220-b921-5c50-1612c5deb23b.png)

`brctl show`コマンドでも問題ないことを確認しておきます。

```
brctl show
```

![スクリーンショット 2024-10-05 17.29.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395943/2de26129-3a09-4735-a723-4b29f1789e0a.png)


# 仮想ディスクの設定

ここからはゲストOSをインストールする用のディスクを払い出します。

公式手順で言うと[Manually installing an HVM Guest VM](https://help.ubuntu.com/community/Xen#Manually_installing_an_HVM_Guest_VM)のあたりです。

ひとまずUbuntu Server 22.04.5 のisoファイルをダウンロードしておきます。
```
wget https://releases.ubuntu.com/22.04/ubuntu-22.04.5-live-server-amd64.iso
```

![スクリーンショット 2024-10-05 14.53.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395943/a7314be2-2b29-1de7-c2d8-b44e39cc77f4.png)

ダウンロードは時間がかかるので`wget`は放置してProxmox側の設定に移ります。

Hardware -> Add -> Hard Disk

![スクリーンショット 2024-10-05 13.28.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395943/e22a87c7-8913-1877-051b-6ee07f3e1048.png)


Ubuntu Serverのシステム要件的にはディスクは5GBあれば良いとのことなので、少しゆとりを持たせた8GBにしています。

![スクリーンショット 2024-10-05 13.29.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395943/bddc9249-ef9d-69ac-b8be-a1c08b1121d4.png)


作成後に`/dev/sdb`が見えていればOKです。

```
ls /dev/sd*
```

![スクリーンショット 2024-10-05 13.41.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395943/d0d81b1a-f2fb-1199-c55d-06315a6caeca.png)

追加したディスクについて`gdisk`を使ってパーティションを切っていきます。画像を参考にして作成してください。

```
sudo gdisk /dev/sdb
```

![スクリーンショット 2024-10-05 13.42.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395943/b4aae347-c289-1f36-d972-32ba1afa54ae.png)

最終的にLinux LVMが8GBできていればOKです。

![スクリーンショット 2024-10-05 13.45.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395943/9c9655d6-1c46-a9ac-1e07-02f63f049ec3.png)



ちゃんと`/dev/sdb1`ができていることを確認します。

```
ls /dev/sd*
```


![スクリーンショット 2024-10-05 13.47.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395943/e7a251c9-b33d-70e8-de16-baeef449f07c.png)

まずはPhysical Volumeを作ります。

```
sudo pvcreate /dev/sdb1
sudo pvs
```

ちゃんと`/dev/sdb1`で8GBできていることを確認します。

![スクリーンショット 2024-10-05 13.49.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395943/b930d837-4484-a268-d5ec-b1fad2d272b7.png)

次にLogical Volumeを作ります。

```
sudo lvcreate ubu_vol /dev/sdb1
sudo lvs
```

LV名は`ubu_vol`にしました。
ちゃんと`ubu_vol`ができていることを確認します。

![スクリーンショット 2024-10-05 13.53.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395943/b3f88eec-e8e6-d863-f1b8-a964214b90b6.png)

最後にLogical Volumeを作ります。
LG名は公式手順に則り`ubuntu-hvm`にしています。

```
sudo lvcreate -L 7.99G -n ubuntu-hvm /dev/ubu_vol
sudo lvs
```

写真を見るとわかる通り、サイズを8Gにすると容量が足りないと怒られるので7.99Gにしています。

![スクリーンショット 2024-10-05 14.56.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395943/3a4bb861-0ed9-0df8-7c1d-8347186d11f9.png)



# ゲスト(DomU)の構築

ここからゲスト用のコンフィグファイルを作ってインストールをしていきます。

```
sudo vi /etc/xen/ubuntu-hvm.cfg
```


```/etc/xen/ubuntu-hvm.cfg
builder = "hvm"
name = "ubu-hvm"
memory = "2048"
vcpus = 1
vif = ['']
disk = ['/dev/ubu_vol/ubuntu-hvm,,hda,rw','/home/test/ubuntu-22.04.5-live-server-amd64.iso,,hdc,cdrom']
vnc = 1
boot = "dc"
```

ほぼ公式手順通りですが、以下が変更点です。
- 名前は少し短くして`ubu-hvm`にしました。（何度も打つので長いと面倒）
- メモリは気持ち多めにしました。
- ディスクは公式手順に書いてある設定がdeprecatedになっているので少し変えていますが、ほぼ同じです（isoのパスが変わったくらい）。ディスク設定の詳細はマニュアル(`man xl-disk-configuration`)を読んでお好みで変えてください。

```
man xl-disk-configuration
```


コンフィグファイルの設定が終わったら`xl create`コマンドでゲストを作ります。
```
sudo xl create /etc/xen/ubuntu-hvm
```

![スクリーンショット 2024-10-05 15.26.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395943/b0176f9c-6b7f-4bd8-cbde-15972f4d41b5.png)

`xl list`コマンドでちゃんとDomUが作られていることを確認します。

```
sudo xl list
```

![スクリーンショット 2024-10-05 15.27.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395943/fef19835-db2b-2bc2-0649-8dd3168b14ad.png)


コンソールに入りインストーラの起動を待ちます。

```
sudo xl console ubu-hvm
```

**起動に2〜3分はかかる**ので気長に待つのをおすすめします。
正常に起動してくると以下のように文字が出てきます。

![スクリーンショット 2024-10-05 15.30.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395943/8204a979-607e-4897-3b20-287eecc1f39b.png)

もう少し待つとインストーラーが起動します。

![スクリーンショット 2024-10-05 15.32.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395943/a3bda921-a60e-c1fa-36ba-e32dd41bc09d.png)

インストーラーが起動したらお好みで設定していってください。

![スクリーンショット 2024-10-05 15.45.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395943/a6ab72f3-6a11-ff64-fc84-dfd6d3a44051.png)


インストールが完了したらコンフィグファイルを書き換えたいので、インストーラーの「Reboot Now」ではなく`xl`コマンドを使ってシャットダウンをします[^4]

[^4]: インストール中にコンフィグファイルを書き換えておき、インストーラーに従って`reboot`でも良いとは思います。コマンドの説明したかったのでこの形にしています。

コンソールから抜ける時は`Ctrl-]`（Ctrlキーを押しながら]キーを押す）です。
さらに`Ctrl-l`とすると画面がリセットされると思います。

以下のコマンドで`ubu-hvm`を落とします。

```
sudo xl shutdown ubu-hvm
```

正常に停止されるまで気長に待ちます。
ただし、あまりに落ちない時は`xl destroy`で強制的に落とします。ちなみにこの記事を書いている時は**10分待っても落ちなかった**ので`xl destory`しました。[^5]

[^5]: 全体的にXen重いんですよね。パラメータチューニングなどが必要な気もするのですが勉強のために作っているだけなのでそこまで深入りはしません。

```
sudo xl destroy ubu-hvm
```

```
sudo xl list
```

`ubu-hvm`がなくなったことを確認します。

![スクリーンショット 2024-10-05 16.34.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395943/a5b964e3-38af-e41b-8a81-5b93757ee649.png)


`ubu-hvm`が落ちたらコンフィグファイルを書き換えます。

```
sudo vi /etc/xen/ubuntu-hvm.cfg
```

```/etc/xen/ubuntu-hvm.cfg
builder = "hvm"
name = "ubu-hvm"
memory = "2048"
vcpus = 1
vif = ['']
#disk = ['/dev/ubu_vol/ubuntu-hvm,,hda,rw','/home/test/ubuntu-22.04.5-live-server-amd64.iso,,hdc,cdrom']
disk = ['/dev/ubu_vol/ubuntu-hvm,,hda,rw']
vnc = 1
#boot="dc"
boot="d"
```

`boot="dc"`というのは先にCDROMを見て、それで起動できなければHDDを読みにいく設定なので`boot="d"`として先にHDDを読むようにします。[^6]
ここら辺のパラメータの詳細はマニュアル(`man xl.cfg`)に色々書いてあるのでお好みで設定してください。

```
man xl.cfg
```

[^6]: 最初から`boot="cd"`にしておけば、はじめにディスクを見て、起動できなければCDROMを見るという動作になるのでそれが良いかと思います。もっと言うとデフォルト値が`boot="cd"`なのでbootの項目自体の記載が不要です。ただ、公式手順はなぜか`boot="dc"`なんですよね。

設定ファイルを書き換えたら起動します。

```
sudo xl create /etc/xen/ubuntu-hvm.cfg -c
```

`-c`は起動と同時にコンソールに繋げるオプションです。
**5分くらい経つ**と無事に起動してくると思います。

![スクリーンショット 2024-10-05 16.13.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395943/d405ba79-40c3-0640-c85a-121f93d3402e.png)

ちゃんと起動してきてログインできれば**VM構築完了**です！
コンソール上でも特に問題なく各種コマンドが打てますし、通信も問題なくできるかと思います。

![スクリーンショット 2024-10-05 16.16.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395943/cc272d7d-f63d-b253-f59e-509301adfa29.png)

コンソールから抜ける時は`Ctrl-]`です。

# 終わりに

正直おうちで仮想環境を作るならProxmoxで十分だと思いますが、LPIC305では[Xenが対象](https://www.lpi.org/ja/our-certifications/exam-305-objectives/#351.2_Xen_.28.E7.B7.8F.E9.87.8D.E9.87.8F:_3.29)なので、こんな感じでVMを立てたり壊したりで各自の勉強の役に立ててください。