Win10 VirtualBox上のCentOS7 virsh上でVyOSを建ててみた

# はじめに
どもども、S.S(ダブエス)です。
今回の記事ではタイトル通り、Win10のVirtualBox上のCentOS7のlibvirtd上でVyOSを建てることについて書いています。
ただどちらかというと、VyOSはたつけど、`virsh destory`して、`virsh start`したら、うまく起動しなかったのを解決できたので、それについて書いています。
# 目的
この記事では、Windows10のVirtualBox上のCentOS7で、libvirtdをインストールし、libvirtdを用いてVyOSを動作させることを目的とします。
# 環境構成
Windows10 : バージョン1903(OSビルド 18362.239)
VirtualBox : バージョン 6.0.10 r132072 (Qt5.6.2)
CentOS7 : CentOS Linux release 7.6.1810 (Core)

```bash
# virsh version --daemon
コンパイル時に使用したライブラリ: libvirt 4.5.0
使用中のライブラリ: libvirt 4.5.0
使用中の API: QEMU 4.5.0
実行中のハイパーバイザー: QEMU 1.5.3
デーモンに対して実行中: 4.5.0
```
VyOS : 1.1.8

# 下準備
[この記事]()(まだないですが…)で、kickstartを用いて自動作成したCentOS7を使用しています。
記事の通り、firewalldやSELinuxが無効化されていたり、sshのサービスが起動されていたり、eth0s8に192.168.1.1/24のIPアドレスが設定されていたりしますので、承知の上続けてください。

# libvirtdインストール
そんなわけで、まずは何も入っていないCentOS上にlibvirtdを入れましょう。
以下のコマンドを実行します。

```bash
yum -y install bridge-utils qemu-kvm libvirt-bin virtinst virt-install virt-manager wget libvirt libvirt-client virt-top virt-who virt-viewer
systemctl start libvirtd
systemctl enable libvirtd
```

これによって、libvirtdを使えるようになります。
# ブリッジの設定
さて、libvirtdを使えるようになったのでさっそく、VyOSを建てたい。なのですが、その前にVyOSと接続するブリッジを作成、設定します。
ちなみに、ブリッジですがeth0s8を使用するので、もしeth0s8以外の場合でやりたい場合は、適宜変更してください。
以下のコマンドを実行します。

```bash
nmcli connection add type bridge ifname br0
nmcli connection modify bridge-br0 bridge.stp no
nmcli connection modify bridge-br0 ipv4.method manual ipv4.addresses "192.168.1.1/24"
nmcli connection add type bridge-slave ifname enp0s8 master bridge-br0
nmcli connection delete enp0s8; nmcli connection down bridge-br0;nmcli connection up bridge-br0;
```
恐らく、最後のコマンドを実行すると、一時的にフリーズすると思います。
ですが、これはブリッジの設定を適応するためにインターフェースを無効化・有効化しているだけです。
しばらくしたら、192.168.1.1に通信ができ、sshもできるはずです。

# libvirtd上にVyOSをインストール
それでは、ブリッジの設定が終わったので早速、VyOSをlibvirtd上で建てましょう。
そのためにまずは、以下のコマンドを実行し、VyOSのisoをダウンロードしましょう。
ちなみに、`wget`コマンドの行にある`1.1.8`の部分を変えるだけで任意のバージョンのVyOSのisoがダウンロードできるはずです。
あと、wgetはかなり時間がかかるので、のんびり待ってください。

```
cd /var/lib/libvirt/images/
wget http://0.uk.mirrors.vyos.net/iso/release/1.1.8/vyos-1.1.8-amd64.iso
```

そんなわけで、ダウンロードができたら次のコマンドを実行して、isoファイルからVyOSを起動しましょう。
まずは、`qemu-img`コマンドを実行し、VyOS用のdiskを作成しておきます。
次の`virt-install`コマンドを実行して、VyOSのインストールを始めます。
また、これも`wget`の時同様、かなり時間がかかります。
恐らく、5分程度かかります。
もし仮に、consoleから出たい場合は^[ ( Ctrl+[ )を押しせば元のbashに戻れます。
そして、接続し直したい場合は、`virsh console vyos`で再接続できると思います。
また、`[    0.000000] tsc: Fast TSC calibration failed`や`[    0.290000] Failed to access perfctr msr (MSR c0010004 is 0)`みたいなログが出てきたりするかもですが、大丈夫なので気にしないでください。

```
qemu-img create -f raw vyos.img 2G
virt-install --connect qemu:///system --name vyos --vcpus 1 --ram 512 --network bridge=br0 --file /var/lib/libvirt/images/vyos.img --file-size 2 --cdrom /var/lib/libvirt/images/vyos-1.1.8-amd64.iso --accelerate --nographics --os-type=linux --os-variant=debiansqueeze
```

さて、ログイン画面が出てきたでしょうか？
以下みたいな画面みたく出てくるはずですが。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/161666/7aa76c4e-3052-4b81-2316-6ce76598bb14.png)

そしたら、VyOSの初期ユーザ情報を使用してログインしましょう。
初期ユーザ情報は、ユーザ名:パスワードの表記で書くと、`vyos:vyos`です。

そしたら、以下の通りに入力してください。
すると、VyOSをvyos.imgにインストールすることができます。
ちなみに、以下の部分でYesとしないと、DefaultでNoになっているので死ぬ(?)ので、気をつけてください。
(僕はこれで、`virsh destory`して、`virsh start vyos --console`したときに、永遠に待たされた挙句、起動しないということになったので…)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/161666/1fc9f0d6-7b1e-f5cc-4c3a-19e189214e9b.png)

```
install image
[Enter]
[Enter]
[Enter]
Yes
[Enter]
[Enter]
[Enter]
vyos
vyos
[Enter]
reboot
Yes
[Enter]
vyos
vyos
```

# VyOSの設定
さて、これでvyos.imgにVyOSをインストールすることができたのですが、せっかくなので設定を確認したり、IPアドレスを設定したり、SSHできるようにしたりしましょう。

まずは、設定の確認ですが、以下のコマンドで確認できます。

```
show configuration
```

これで、インターフェースにeth0があり、eth0にはIPアドレスが振られていないことがわかります。

なので、以下のコマンドを実行して、eth0に192.168.1.2/24のIPアドレスを設定しましょう。
ついでに、sshのサービスも起動するようにしましょう。

```
configure
set interface ethernet eth0 address 192.168.1.2/24
set service ssh
```

最後に、以下のコマンドを実行して、設定の反映と起動時に現在の設定を設定してくれるようにしましょう。

```
commit
save
```

以上です。
あとは、適当に`exit`したり、`^] ( Ctrl+] )`でコンソールから出たりしてくださいね。

# 通信の確認
さて、IPアドレスを設定し、sshのサービスの設定をしたので、pingやsshを実際してみましょう。
以下のコマンドを実行して、3回通信が行われ、接続できていることを確認しましょう。

```
ping -c3 192.168.1.2
```

以下のコマンドを実行して、VyOSにsshしましょう。

```
ssh vyos@192.168.1.2
```

sshできたでしょうか？
そしたら、`poweroff`コマンドを実行して、VyOSをshutdownしてみてください。

# VyOSはちゃんとvirsh startで起動するのか
さて、`virsh list --all`を実行してみてください。
`poweroff`コマンドを実行してすぐの場合、実行中であるとおもいますが、しばらくするとシャットオフになるはずです。(以下の画像みたく)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/161666/1114bcb8-7169-a6b9-5cac-475ce736d161.png)

そしたら、`virsh start vyos --console`を実行してみてください。
すると、以下の画像のように起動できたはずです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/161666/0e459e52-b12b-b277-9a8e-e392fc10724a.png)

これで、ちゃんと起動できることが確認できましたね。
ついでに、`virsh destroy vyos`しても大丈夫かを確認しましょうか。
一度、^[ でコンソールから抜け、`virsh destroy vyos`を実行してください。
そして、`virsh start vyos; ping -W1000 192.168.1.2`を実行してみましょう。
すると、pingがタイムアウト1000 msで実行されるので、VyOSが起動したら通信が接続されるはずです。
ちなみに、僕の場合は以下の画像の通り、通信できるまでに159回かかったので、起動に150秒つまり2分程度かかったことがわかりますね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/161666/0dc7c3dd-9abc-1a40-83dd-3e9c7b1597e5.png)

# 今後の課題
さて、これでVyOSをlibvirtd上で生成し、起動したりすることができたわけなんですが、一つだけ問題があります。
それは、ホストに通信できないってことです。
理由は、ルーティングが出来てないとか、IPフォワードができていないとか考えられるのですが、どうもうまくいかないのです。
なので、もしこれを見てくれた人の中で、出来た人は教えてくれるとありがたいです。
具体的には、ホストのWindows10からVyOSからsshができればよいのですが。

# おわりに
そんなわけで、無事libvirtdでVyOSが起動でき、停止し、再度起動できたでしょうか？
少しでも役に立てたのであれば、うれしいですね。

# 参考文献(役に立ったサイト、あとはメモ代わりとかもあるけど)
- https://gist.github.com/328/8e1e645a26e15125cdc3
- https://qiita.com/yoshiyasu1111/items/8d07a4fd55116fba07f7
- https://qiita.com/jimaoka/items/d528a7f55e832982c193
- http://memo.saitodev.com/home/vyatta/
- http://kt-hiro.hatenablog.com/entry/20180813/1534125175
- https://blog.akagi.jp/archives/4324.html
- https://qiita.com/TsutomuNakamura/items/22d9d2629a8eb9360865
- https://zassoul.blogspot.com/2018/03/vyos-118qcow2.html
- https://running-dog.net/2015/01/post_1335.html
- https://zassoul.blogspot.com/2016/04/vyos.html
- https://qiita.com/nl0_blu/items/3094785d6234c47da911
- https://mikeda.hatenablog.com/entry/20120331/1333172105