SEIL/x86 Ayame on FreeBSD bhyve

**注意: この方法はサポート外になります。
動かないからと言ってサポートに問い合わせないでください。
問い合わせたところで公式の回答は得られません。**

# SEIL/x86 Ayame とは

[SEIL/x86 Ayame](https://www.seil.jp/product/x86ayame.html) は、[IIJ](https://www.iij.ad.jp/) が開発しているソフトウェアルータです。

[2019/12](https://www.iij.ad.jp/news/pressrelease/2019/1219-2.html) に発表された [SEIL/x86](https://www.seil.jp/product/seil-x86.html) の後継ソフトウェアルータです。

## 動作環境
- VMware ESXi
- qemu + KVM
- ベアメタル環境

での動作がサポートされています。

FreeBSD bhyve は動作環境にリストアップされていませんのでサポート外となります。

# SEIL/x86 Ayame の入手方法

[SEIL/x86 Ayame](https://www.seil.jp/product/x86ayame.html) を利用するためには、ソフトウェアルータ本体意外にプロダクトキーを取得する必要があります。
プロダクトキーには、
- トライアル
- スタンダード
- エンタープライズ

の三種類がありますが、トライアルは評価目的のものなので、個人で使う場合はスタンダードが入手しやすいでしょう。

## SEIL/x86 Ayame のダウンロード
[SEIL/x86 Ayame 仮想マシン](https://www.seil.jp/product/download.html#dl__x86ayame) をダウンロードします。
VMDK形式からRAW形式に変換して利用するため、"VMware形式（OVF版を同梱）" をダウンロードします。
ダウンロードした ZIP ファイルの中には、VMware 

## スタンダードのプロダクトキーを購入
スタンダードのプロダクトキーは、[Amazone で購入](https://www.amazon.co.jp/dp/B083W8HR8G) します。

購入すると、プロダクトキーがかかれた資料が届きます。

![seilx86_ayame_prokey.jfif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150828/3d695463-9776-1fbb-eeee-b9908980ef5e.jpeg)

このなかにプロダクトキーが書かれています。

# SEIL/x86 Ayame 用 FreeBSD bhyve の設定
SEILシリーズは[NetBSD](https://www.netbsd.org/)ベースで開発されています。
- [SEILシリーズの歩み](https://www.seil.jp/history.html)

[SEIL/x86](https://www.seil.jp/product/seil-x86.html)をVirtualBoxやVMwareで動かす記事を参考にして、NetBSDをbhyveで動かす方法をアレンジして動かしてみます。
- [Vagrant と SEIL/x86](https://www.seil.jp/blog/vagrant-x86fuji.html)

## bhyve 環境の用意
[FreeBSD 12.1](https://www.freebsd.org/ja/where.html)をインストールしたPCを用意します。
インストール時にはファイルシステムとしてZFSを選択しておきます。
UFSでインストールした場合は、べっとZFSのpoolを用意してください。
以降はZFS poolとして zroot を想定します。

FreeBSDのインストールが終わったらbhyve用のツールをインストールします。
bhyveをそのまま使うのは面倒なので、vm-bhyveをインストールします。
vm-bhyveのインストールとセットアップは [Quick-Start](https://github.com/churchers/vm-bhyve#quick-start) などを参考にしてください。
- [Quick-Start](https://github.com/churchers/vm-bhyve#quick-start)

vm-bhyveをインストールします。

```
pkg install vm-bhyve bhyve-firmware grub2-bhyve
```

vm-bhyveを初期化します。
ZFS pool として zroot を使うことにします。

```
zfs create zroot/vm
zfs set mountpoint=/vm zroot/vm
mkdir -p /usr/local/etc/rc.conf.d
echo 'vm_enable="YES"' > /usr/local/etc/rc.conf.d/vm
echo 'vm_dir="zfs:zroot/vm"' >> /usr/local/etc/rc.conf.d/vm
vm init
cp /usr/local/share/examples/vm-bhyve/* /vm/.templates/.
```

ルータとして使うためPCのそれぞれのインタフェースを接続するブリッジインタフェースを作成します。
PCのインタフェースはem0, em1があるものとします。
em0, em1 は環境に合わせて変更してください。

```
vm switch create vswitch-00
vm switch add vswitch-00 em0
vm switch create vswitch-01
vm switch add vswitch-00 em1
```

## [SEIL/x86 Ayame 仮想マシン](https://www.seil.jp/product/download.html#dl__x86ayame) 配布ファイルの展開
[SEIL/x86 Ayame 仮想マシン](https://www.seil.jp/product/download.html#dl__x86ayame) が ZIP ファイルで提供されているため unzip をインストールします。
```
pkg install unzip
```

ダウンロードした[SEIL/x86 Ayame 仮想マシン](https://www.seil.jp/product/download.html#dl__x86ayame)のVMware用のファイルを展開します。

```
cp x86ayame-201-vmware.zip /tmp/.
cd /tmp
unzip -x x86ayame-201-vmware.zip
```

展開するとVMware用のOVFやVMDKがあることがわかります。

```
# ls seilx86-vmware/
seilx86-ovf.vmdk        seilx86.vmdk
seilx86.ovf             seilx86.vmx
# 
```

## VMDK を RAW DISK に変換

VMDK imageのままでは ZFS ZVOL に書き込んで利用できないため、RAW imageに変換しておきます。
変換にはqemu-imgを使うため、qemu-utilsをインストールします。

```
pkg install qemu-utils
```

qemu-imgを使ってRAW imageに変換します。

```
qemu-img convert -f vmdk -O raw ./seilx86-vmware/seilx86.vmdk ./seilx86-vmware/seilx86.raw
```

変換後のRAW imageのサイズを確認します。

```
# ls -l seilx86-vmware/
total 39803
-rw-r--r--  1 shigeru  wheel   13593600 12▒▒ 18 16:08 seilx86-ovf.vmdk
-rw-r--r--  1 shigeru  wheel       4874 12▒▒ 18 16:08 seilx86.ovf
-rw-r--r--  1 shigeru  wheel  134217728  2▒▒ 11 11:36 seilx86.raw
-rw-r--r--  1 shigeru  wheel   14942208 12▒▒ 18 16:08 seilx86.vmdk
-rw-r--r--  1 shigeru  wheel        901 12▒▒ 18 16:08 seilx86.vmx
```

RAW image のサイズが134M byteぐらいなので、VMのディスクサイズは256M byteで作成することにします。

## VM 作成
[Supported Guest Examples](https://github.com/churchers/vm-bhyve/wiki/Supported-Guest-Examples) を参考にしながら、SEIL/x86 Ayame 用 template file を作成します。

設定の概要は次の通り。
- スタンダード版だとCPUの上限は1
- NetBSDのboot loaderはGRUPを使う
- ネットワークは二つ
- VNCを設定しておく
    - アドレスとポートは環境依存なのでコメントアウトしておく

```
cat > /vm/.templates/seilx86-ayame.conf <<EOM
uefi="yes"
cpu=1
memory=1024M
utctime="no"
graphics="yes"
#graphics_listen="192.168.0.1"
#graphics_port=5901
#graphics_res="1024x768"
loader="grub"
grub_run0="knetbsd -h -r ld0a (hd0,msdos1)/netbsd"
grub_run1="boot"
disk0_type="virtio-blk"
disk0_name="disk0"
disk0_dev="sparse-zvol"
network0_type="virtio-net"
network0_switch="vswitch-00"
network1_type="virtio-net"
network1_switch="vswitch-01"
EOM
```

作成した template file を使って VM を作成します。

```
vm create -t seilx86-ayame -s 256m seilx86-ayame
```

VMを作成出来たら、VNCの設定を行います。
graphics_listen, graphics_port, graphics_res を自分の環境に合わせて設定します。

```
vm configure seilx86-ayame
```

```
graphics_listen="192.168.0.1"
graphics_port=5901
graphics_res="1024x768"
```

## SEIL/x86 Ayame のイメージを書き込む

raw image を ZFS volume に書き込みます。

```
dd if=./seilx86-vmware/seilx86.raw of=/dev/zvol/zroot/vm/seilx86-ayame/disk0 bs=1m
```

# SEIL/x86 Ayame 用 VM を起動

作成したVMを起動します。

```
vm start seilx86-ayame
```

起動したら、VNCクライアントを使って接続します。
pkg binary を使う場合は、tightvnc などが利用できます。

<img width="513" alt="seilx86_ayame_login.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150828/41e5c5d5-49a3-dc17-ae2a-b626cabf6f37.png">

VNCクライアントで接続して login: プロンプトが表示されていれば成功です。
あとは、[SEIL/x86 Ayameの取り扱い方法とチュートリアル](https://www.seil.jp/sx4/doc/about/x86ayame/start.html)にしたがって、プロダクトキーを設定し、SEIL/x86 Ayame の設定を行っていってください。

# おわりに

「SEILシリーズってNetBSDだったよな。FreeBSDのbhyveでNetBSD動くから、SEIL/x86 Ayameもうごくかな?」と思ってやってみたら、なんか動いたようです。

ほかに Xen DOM0 / FreeBSD 環境があるから、次は Xen 環境でやってみようかと思います。

**なお、公式サポート環境ではなないため、動かなかったからといってサポートに問い合わせないようにしてください。**