Ubuntu + Xen 仮想マシン環境に FreeBSD をインストールする

# はじめに
Ubuntu 20.04 (LTS) Desktop に Xen をインストールして仮想マシン環境を構築し、その仮想マシン上で FreeBSD をインストールする手順を説明します。

# Ubuntu のインストール
空いているパソコンなどに Ubuntu 20.04 Desktop をインストールしてください。
* FreeBSD の仮想マシンを作成する際に virt viewer という GUI のアプリケーションを使用するので、Ubuntu の Desktop 環境を用意してください。
* 現時点での Ubuntu の最新版は 21.10 ですが、LTS (Long Time Support) の 20.04 を使用しました。
    * Ubuntu 21.10 では試していないので、20.04 の使用をお勧めします。

# Xen のインストール
Ubuntu にログインし terminal を起動し、下記のコマンドを実行して Ubuntu に Xen をインストールしてください。

```
$ sudo apt install xen-hypervisor
```

Xen のインストールが終了したら、Ubuntu を再起動してくださ。

```
$ sudo reboot
```

## Ubuntu 再起動後の確認
Ubuntu の再起動が完了したら、再びログインして terminal を起動し下記のコマンドを実行してください。

```
$ sudo xl list
Name                                        ID   Mem VCPUs	State	Time(s)
Domain-0                                     0 15690    12     r-----      62.9
$ 
```

上記の実行例のように「Domain-0」と表示されていれば、Xen が正しく動作しています。
* xl list コマンドがエラーになるなどの場合には、Xen が正しく動作していないかもしれません。
* VirtualBox など、他の仮想マシン環境がインストールされている Ubuntu に Xen をインストールすると正しく動作しないかもしれません。
    * このような場合は、別のマシンなどに Ubuntu をインストールしなおした後に Xen をインストールしてください。

# 再起動後の設定

下記のコマンドを実行して、仮想マシンの操作に使用するコマンドをインストールしてください。

```
sudo apt install libvirt-daemon bridge-utils virtinst libvirt-daemon-system
```

# FreeBSD の ISO イメージの取得
Ubuntu 上の terminal で下記のコマンドを実行し、FreeBSD の ISO イメージを取得します。
* 以下の例では、ホームディレクトリに tmp というディレクトリを作成し、各作業を tmp ディレクトリで実行しています。

```
$ cd
$ mkdir tmp
$ cd tmp
$ wget https://download.freebsd.org/ftp/releases/amd64/amd64/ISO-IMAGES/13.0/CHECKSUM.SHA512-FreeBSD-13.0-RELEASE-amd64
$ wget https://download.freebsd.org/ftp/releases/amd64/amd64/ISO-IMAGES/13.0/FreeBSD-13.0-RELEASE-amd64-disc1.iso
$ sha512sum -c CHECKSUM.SHA512-FreeBSD-13.0-RELEASE-amd64
＜略＞
FreeBSD-13.0-RELEASE-amd64-disc1.iso: OK
＜略＞
$ 
```

上記のように、「取得した ISO イメージ名: OK」と表示されれば、ISO イメージは正しく取得されています。
* CHECKSUM.SHA512-FreeBSD-13.0-RELEASE-amd64 ファイルには他のファイルの情報も書き込まれているので、取得した ISO イメージ以外のファイルに関して下記のエラーが表示されますが、これは無視してください。

```
sha512sum: FreeBSD-13.0-RELEASE-amd64-bootonly.iso.xz: No such file or directory
FreeBSD-13.0-RELEASE-amd64-bootonly.iso.xz: FAILED open or read
```

# FreeBSD 仮想マシンの作成
下記のコマンドを実行して、FreeBSD の仮想マシンを作成および起動します。

```
$ sudo virt-install \
--name=freebsd130 \
--memory=2048,maxmemory=4096 \
--vcpus=2,maxvcpus=4 \
--cpu host \
--os-variant=freebsd12.0 \ 
--cdrom=/home/asou/tmp/FreeBSD-13.0-RELEASE-amd64-disc1.iso \
--network=bridge=virbr0,model=virtio \
--graphics=vnc \
--disk path=/var/lib/libvirt/images/freebsd130.qcow2,size=8,bus=virtio,format=qcow
```

上記の virt-install コマンドを実行すると画面上に新しいウィンドウ「virt viewer」が表示されます。
* 以降の FreeBSD のインストール操作は、この「virt viewer」で実行します。
![virt-viewer-001-boot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/915655/1c0b51c7-4c7e-5572-e546-acea56c4d981.png)

# FreeBSD のインストール
上記の画面が表示されたのち、しばらくすると FreeBSD のインストーラーの画面が表示されます。
![virt-viewer-0011-installer.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/915655/a2051a3f-71dd-07f5-2752-ee824e38c114.png)

FreeBSD のインストールに関しては、[Install FreeBSD](https://freebsd.seirios.org/doku.php?id=install) の「インストール手順」で解説されているので、そちらを参照してください。

ただし、実際には以下で説明する画面以外では、デフォルトで選択されている「Yes」あるいは「OK」などのまま Enter キーを押下すればよいはずです。
* インストール中には以下で説明する画面も表示されます。
* 画面数が多いので、特に説明が必要と思われる画面のみを掲載します。
* [Install FreeBSD](https://freebsd.seirios.org/doku.php?id=install) の「インストール手順」には全ての画面を掲載しています。

## ホスト名の入力
![virt-viewer-002-hostname.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/915655/97a8c813-1c1b-6288-8949-46ebb098d8b0.png)
仮想マシン上で動作する FreeBSD のホスト名を入力してください。

## ドメイン名の入力
![virt-viewer-004-domain.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/915655/c2d1a554-75a7-b729-f775-b2e73d14e64a.png)
ネットワークのドメイン名 (example.co.jp など) を入力してください。取り敢えず「my.domain」のようなものを指定してもよいです。

## インストール先の HDD の選択
![virt-viewer-005-zfsSelectHDD.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/915655/bce85183-dad4-f4e9-4576-c18d32610d7a.png)
インストール先 (ZFS ファイルシステムで初期化する HDD) を選択してください。前述の virt-install コマンドを使用した場合には、一つの HDD が表示されているので、スペースキーを押してその HDD を選択して ([ ] の表示が [*] に変わります) Enter キーを押してください。

## ZFS ファイルシステムによる初期化の確認
![virt-viewer-006-zfsConfirm.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/915655/87f42dd2-2ce2-85ef-a4fb-3f81aadd5310.png)
HDD を初期化する旨の確認メッセージが表示されます。デフォルトでは「NO」が選択されているので、矢印キーあるいは TAB キーで「YES」を選択して HDD の初期化を開始します。

## root パスワードの設定
FreeBSD では Ubuntu (sudo コマンドを使用する) とは異なり、初期状態では su コマンドを使用してスーパーユーザーの権限を取得するようになっています。
![virt-viewer-007-rootPassword.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/915655/4d5ce6cd-6024-5da2-4d55-92f7dbd45787.png)
インストール終了後、スーパーユーザー権限で下記のコマンドを実行して sudo コマンドをインストールすることができます。

```
$ su
Password: (root のパスワードを入力します)
# pkg install sudo
# visudo (sudo コマンドの設定ファイルを編集します)
# exit
```
以降は、Ubuntu と同様に sudo コマンドを使用できます。

```
$ sudo sh
[sudo] password for USERNAME: (自分のアカウントのパスワードを入力します)
# 
![virt-viewer-0080-timeZone.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/915655/ca3e6d01-1f3a-0ea2-5415-424c0befa971.png)
```

## IPv6 の設定の無効化
![virt-viewer-003-ipv6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/915655/21c69fdf-b8a3-90cd-002f-381b6c2956e3.png)
前述の virt-install コマンドで起動した仮想マシンでは IPv6 が使用できないようなので、「Would you like to configure IPv6 for this interface?」に対しては、矢印キーあるいは TAB キーで「No」を選択してから Enter キーを押してください。

## タイムゾーンの設定
![virt-viewer-0080-timeZone.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/915655/10869fdc-d373-fb01-dccb-4afba1d1e092.png)
![virt-viewer-008-timeZone.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/915655/aec45459-2f54-da39-2161-e7d0199658d0.png)
タイムゾーンを設定します。
BIOS の時計が日本時間であれば、デフォルトの「UTC」のまま Enter キーを押してください。BIOS の時計が UTC の場合には、「Asia」を選択して Enter キーを押してから「Japan」を選択して Enter キーを押してください。

## 一般ユーザーの登録
![virt-viewer-009-addUser.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/915655/93a2af19-5caa-1954-9430-9abd875e62ac.png)
![virt-viewer-010-addUser.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/915655/dc880fc8-1212-4730-0360-a3c49ca892ec.png)
一般ユーザーの登録を行います。
下記の画面では、「Username: yamada」を登録しています。
「Login group is yamada. Invite yamada into other group? []: 」に対しては wheel を指定してください。これを指定しないと、su コマンドを使用してスーパーユーザーの権限を取得できません。

## 以降の設定
![virt-viewer-011-finalConfiguratrion.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/915655/7ddc53fd-dd24-752c-9a71-8e165ea4c88d.png)
「Final Configuration」画面に対しては、デフォルトの「OK」のまま Enter キーを押してください。
この後、しばらく画面に変化がありませんが、数分後に下記の「Macual Configuraion」画面が表示されます。
![virt-viewer-00111-manualConfiguration.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/915655/66a09879-66ac-cc3f-cc5d-72077e5a21b4.png)
デフォルトの「No」のまま Enter キーを押してください。

![virt-viewer-012-reboot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/915655/613894f5-4660-b731-f143-5b89ede7b756.png)
「Complete」画面に対しては、デフォルトの「Reboot」のまま Enter キーを押してください。

FreeBSD が再起動されます。

# 再起動後の画面
![virt-viewer-001-boot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/915655/66c79758-6484-c74d-94a0-d1b0e5deb92c.png)
ISO イメージから起動した時と同様に、FreeBSD の boot loader の画面が表示された後、
![virt-viewer-013-smMta.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/915655/de274d5d-92cf-23c5-4bd8-f589c5d2eb95.png)
このような画面が表示されて数分経過したのちに、以下のように「ログインプロンプト (login: )」が表示されます。
![virt-viewer-014-login.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/915655/9302bcb0-42d3-919b-43f5-2b33e8ebd8d6.png)
前述の「一般ユーザーの登録」で登録した　Username と Password を指定してログインします。

# shutdown
下記のコマンドを実行して shutdown します。

```
$ su
Password: (root のパスワード)
# shutdown -p now
```
shutdown コマンドに渡す第一引数の「-p」には 小文字 の「p」を指定します。

pkg install sudo を実行して sudo コマンドをインストール済みであれば、下記のように sudo コマンドを使用してもよいです。

```
$ sudo shutdown -p now
```

# Ubuntu 上で仮想マシンを操作するコマンド

virt-install を使用して仮想マシンの作成とインストールを行なっている最中や、インストール終了後に FreeBSD を再起動 (Reboot) した後で
* 仮想マシンの状態を知りたい。
* 仮想マシンを停止したい。
* 仮想マシンを削除したい。
といったことが必要になるかもしれません。

その際に使用する virsh コマンドの解説を行います。
* 細かい解説は省いて、コマンドの使用例のみを掲載します。

## 仮想マシンの状態を見る

```
$ sudo virsh list --all         
 Id   Name         State
-----------------------------
 -    freebsd130   shut off

$ 
```
FreeBSD にログインしてから shutdown コマンドを実行して shutdown が完了した状態です。

## 仮想マシンを起動する

```
$ sudo virsh start freebsd130
Domain freebsd130 started

$ sudo virsh list --all      
 Id   Name         State
----------------------------
 4    freebsd130   running

$ 
```
「virsh start」で起動しても virt-viewer は起動されないので、次の手順で virt-viewer を起動します。

## 仮想マシンのコンソールに接続する

```
$ sudo virt-viewer freebsd130
```

## 仮想マシンを shutdown する

```
$ sudo virsh list --all
 Id   Name         State
----------------------------
 4    freebsd130   running

$ sudo virsh shutdown freebsd130
Domain freebsd130 is being shutdown

$ sudo virsh list --all         
 Id   Name         State
-----------------------------
 -    freebsd130   shut off

$ 
```

## 仮想マシンを削除する

```
$ sudo virsh undefine freebsd130
Domain freebsd130 has been undefined

$ sudo virsh list --all         
 Id   Name   State
--------------------

$ 
```

この操作では仮想マシンが削除されるだけで、仮想マシンに割り当てた HDD イメージは残ったままになっています。HDD イメージの操作を以降に掲載します。

## HDD イメージの操作

```
$ sudo virsh pool-list --all                         
 Name     State    Autostart
------------------------------
 images   active   yes
 tmp      active   yes

$ sudo virsh vol-list images                         
 Name               Path
--------------------------------------------------------------
 freebsd130.qcow2   /var/lib/libvirt/images/freebsd130.qcow2

$ sudo virsh vol-delete --pool images freebsd130.qcow2
Vol freebsd130.qcow2 deleted

$ sudo virsh vol-list images                          
 Name   Path
--------------

$ 
```

# 仮想マシンの再インストール

前述の「仮想マシンの削除」と「HDD イメージの操作 (vol-delete)」により仮想マシンと HDD イメージを削除すると、同名の仮想マシン (freebsd130) と HDD イメージ (freebsd130.qcow2) を指定して、最初に使用した virt-install コマンドにより仮想マシンを再び 作成・起動 できます。
* 仮想マシン名、HDD イメージ名に別のものを指定すれば、最初に作成した仮想マシンを削除しなくても、新しい仮想マシンを作成できます。