QNAP の NAS 内だけで vSphere 7 環境を作るには

# 家ラボのマシン台数を減らしたい！
家ラボを作るときに悩むのは、用途に応じてハードウエアがどんどん増えていってしまうこと。我が家も vSphere クラスタが NUC 2セットと Raspberry Pi 1セットあり、それ以外に NAS と vCenter Server 他の管理系の仮想マシンが動くクラスタのためのホストがあり、冬は暖房いらずで夏はエアコン必須の状態になっていました。これ、どうしようもないかなぁと思いつつも「何とかしたい！」と考えていたところに閃き！。NAS が Intel 系 CPU なので、その上に仮想化環境を動かして管理系やらちょっとしか小さい仮想マシンの環境をそこに移しちゃえばいいんじゃね？と。

# NAS に仮想環境を作るには？
この発想、QNAP の NAS では Virtualization Station という KVM をベースとした仮想化環境を動かすことができ、今までのモデルでもちょっとした管理系の仮想マシンはそこで動かしていました。例えば vCenter Server 用の Windows マシン、Active Directory 用の Windows マシンなどです。これらは何も問題なく QNAP の Virtualization Station 上で動かすことができるので、結構重宝していました。でも、vSphere 7 からは Windows の vCenter Server が用意されなくなり、結局のところ別途 1台管理用マシンを動かす ESXi 環境のために NUC を 1台手配する・・・・ということになりそうだったんですが、ふと気づいて手元に残る 1台の QNAP の仕様を見てみたところ、今までは 8GB Max だったのに、なんかメモリーをいっぱいつめそうに見えます。QNAP にもいろいろなモデルがあるし、様々なベンダーからいろいろなモデルの NAS が出ています。でも、民生用の NAS って CPU しょぼくメモリーの量も小さいのがほとんど。なんか思いついたけれどダメダメだなぁ。。。と思っていたのに、既に10年以上いろいろなモデルを使い続けている QNAP のこのモデルは、仕様では 32GB のメモリが搭載できると書いてある。じゃ！、載せてやってみようということで早速 amazon でメモリーを注文。トライすることにしました。

#QNAP NAS 側の準備（ハードウエア編）
まずは QNAP NAS 側のハードウエア環境を整備します。使わないで置いてあった QNAP の NAS には M.2 SSD 2枚と 3.5 インチディスク 4台搭載できるベイがありました。[QNAP TS-473](https://www.qnap.com/ja-jp/product/ts-473/specs/hardware)なので、手元に余っていた処分した ノート PC に載せていた 2.5 インチ SSD と、USB メモリー代わりに使っていた M.2 SSD を転用することにします。2.5インチ SSD は容量も小さく、でも数はあるのでこんな便利なもの（[QDA-A2AR](https://www.qnap.com/ja-jp/product/qda-a2ar)）があったので早速調達。これで8本の容量小さ目な SSD と M.2 SSD を NAS のストレージとして利用することができました。引退させようと思っていた NAS にいきなりの日の目。NAS も驚いているかも。
そしてメモリーは[仕様](https://www.qnap.com/ja-jp/product/ts-473/specs/hardware)では 32GB までの搭載となっているのですが、この CPU では 64GB までは行けるはずなので、チャレンジでメモリーを 64GB 買って勝手に搭載。無事にメモリーも認識です。これでハードウエア側の準備は万端！！

#QNAP NAS 側の準備（ソフトウエア編）
QNAP の NAS に標準でインストールできる Virtualization Station は KVM ベースであることは上で書きました。でも、これ、QNAP が独自にいろいろと UI をかぶせたりして使える機能をだいぶ制限しています。まずはいくつか解決しなけれなならない課題として、
1. Nested Virtualization 環境が使えない
2. NIC が制限されている
これを解決しないと先に進むことができません。これ、QNAP の UI からは全く弄ることのできないところであり、ファームウエアや Virtualization Station のアップデート、また仮想マシンの設定変更で元に戻されてしまう部分なので注意が必要です。ファームウエアや Virtulization Station のアップグレード、仮想マシンの設定変更時には再度修正が必要になるということ、忘れないようにしてください。

#Virtualization Station の設定変更
まずは Virtualization Station の設定変更をします。この部分は純粋な KVM の設定変更になりますので、何をしているかの詳細はそちらの情報を見つけて読んでください。変更する部分は以下の通りです。

* NAS にターミナルで SSH ログイン

    TeraTerm などを使い、SSH で NAS にログインします。admin のアカウントとパスワードで入ることができます。ログインすると「Console management - Main menu」が表示されますので、「Q: Quit (return to normal shell environment)」でメニューを終了し、shell に移ります。
* nested を有効にする
    まずは nested のファイルの場所を検索します。私の場合は AMD CPU のモデルの NAS なので、

```
[~] # find / -name nested -print
/sys/module/kvm_amd/parameters/nested
[~] #
```

のように「kvm_amd」で出てきます。Intel の場合はここが「kvm_intel」になります。ここの値が 0 だと nested Virtulization が使えません。なので、1 になるように qpkg のスクリプトを修正します。

```
vim /share/CACHEDEV1_DATA/.qpkg/QKVM/usr/etc/qvsd.d/44-preload/01-module
```

ファイル内のこの部分を直します。**nested=0** を **nested=1** にします。

```
load_kvm()
{
    ___load_module kvm.ko ignore_msrs=1
    check_ret

    # load kvm module
    if [ $VMX_FEATURE -ne 0 ]; then
        ___load_module kvm-intel.ko
        check_ret
    elif [ $SVM_FEATURE -ne 0 ]; then
        ___load_module kvm-amd.ko nested=1
        check_ret
    else
        elog "Platform not support KVM"
        exit 1
    fi
}
```
この後 NAS を再起動することで nested Virtualization が使えるようになります。再起動後に正しく設定がされたかを確認します。

```
[~] # cat /sys/module/kvm_amd/parameters/nested
1
[~] # cat /sys/module/kvm_amd/parameters/npt
1
[~] #
```
このように 1になれば完了です。（Intel の場合は kvm_amd が kvm_intel で、npt が ept になります。）

# ESXi 7 仮想マシン側の設定
QNAP の Virtualization Station で設定できる項目は非常に制限されており、ESXi 6.7 までのように多くの NIC を利用することができません。ESXi 7 ネイティブにドライバが用意されているデバイスしか使えなくなっています。これは Linux kernel サポートを ESXi 7 からやめたことで今までの Linux ドライバに ESXi のライブラリを組み入れたような手作りドライバが排除されたためなのですが、これは KVM 上で ESXi を動かすのにも影響が出ています。KVM 上で ESXi を動かしていた人が最初に挫折するのはこのあたりだと思います。そして、QNAP の Virtualization Station の場合もさらに使えるデバイスを制限しているので影響は大です。
これには仮想マシン側にいくつかの設定変更を加える必要があります。手順として
1. 仮想マシンを作成する
2. virsh コマンドで設定を変更する
3. 仮想マシンを起動し、ESXi 7 をインストールする
のような流れになります。
まず Virtualization Station で ESXi をインストールする仮想マシンを作成します。ここでインストール媒体の CD も設定しておきますが、起動はさせません。
次に NAS のターミナルの shell から以下のコマンドを実行し、仮想マシンの設定を編集します。変更する場所は下記の部分、NIC を ESXi 7 がサポートするものに書き換えます。KVM の 仮想 NIC の中では e1000e および vmxnet3 の 2つの 仮想NIC が ESXi 7 でサポートされていますが、e1000e では正しく通信できないようなので、ここでは VMware が作っている仮想 NIC の vmxnet3 を使用するように設定を書き換えます。ちなみに、QNAP の KVM で利用できる NIC タイプは以下の通りです。

```
[~] # /share/CACHEDEV1_DATA/.qpkg/QKVM/usr/bin/qemu-system-x86_64  -net nic,model=?
qemu-system-x86_64: info: try to get stathdr
qemu-system-x86_64: info: stathdr refcount: 4
stathdr_getstat get vmstat from stats[9f]
This is a normal VM
vm_stathdr processing completed
[smbios_set_defaults] qnap_pattern = -1
Supported NIC models:
e1000
e1000-82544gc
e1000-82545em
e1000e
i82550
i82551
i82557a
i82557b
i82557c
i82558a
i82558b
i82559a
i82559b
i82559c
i82559er
i82562
i82801
ne2k_pci
pcnet
rocker
rtl8139
virtio-net-pci
virtio-net-pci-non-transitional
virtio-net-pci-transitional
vmxnet3
[~] #
```

作成した仮想マシンのドメイン名を使い、設定ファイルを編集します。まずは仮想マシンのドメイン名を調べます。

```
[~] # /share/CACHEDEV1_DATA/.qpkg/QKVM/usr/bin/virsh list --all
 Id    Name                           State
----------------------------------------------------
 1     bf6e7884-3d8f-4464-85ff-0857403d8410 shut off
 2     85ff7569-14cb-4133-bf6e-676eeafdd37a running

[~] #
```

設定ファイルを修正します。

```
[~] # /share/CACHEDEV1_DATA/.qpkg/QKVM/usr/bin/virsh edit bf6e7884-3d8f-4464-85ff-0857403d8410
```

以下の部分の NIC の情報を　vmxnet3 に書き換えます。このコマンド一発ですね。

```
:%s/e1000/vmxnet3/g
````
`<qvs:nics>`と`<interface>`の部分が変更されます。
`<qvs:nics>`

```:変更前
      <qvs:nics>
        <qvs:nic bridge="qvs1" index="1" mac="00:0c:29:8b:58:3c" model="e1000"/>
        <qvs:nic bridge="qvs1" index="2" mac="00:0c:29:8b:58:3d" model="e1000"/>
      </qvs:nics>
```

```:変更後
      <qvs:nics>
        <qvs:nic bridge="qvs1" index="1" mac="00:0c:29:8b:58:3c" model="vmxnet3"/>
        <qvs:nic bridge="qvs1" index="2" mac="00:0c:29:8b:58:3d" model="vmxnet3"/>
      </qvs:nics>
```
`<interface>`

```:変更前
    <interface type='bridge'>
      <mac address='00:0c:29:8b:58:3c'/>
      <source bridge='qvs1'/>
      <model type='e1000'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
    </interface>
    <interface type='bridge'>
      <mac address='00:0c:29:8b:58:3d'/>
      <source bridge='qvs1'/>
      <model type='e1000'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/>
    </interface>
```

```:変更後
    <interface type='bridge'>
      <mac address='00:0c:29:8b:58:3c'/>
      <source bridge='qvs1'/>
      <model type='vmxnet3'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
    </interface>
    <interface type='bridge'>
      <mac address='00:0c:29:8b:58:3d'/>
      <source bridge='qvs1'/>
      <model type='vmxnet3'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/>
    </interface>
```
あと、Intel CPU では CPU 設定情報に < feature policy='require' name='vmx'/ > も追記してください。AMD CPU では < feature policy='require' name='svm'/ > です。 

```:変更前
  <cpu mode='host-passthrough' check='none'>
    <topology sockets='1' cores='4' threads='1'/>
  </cpu>
```

```:変更後
  <cpu mode='host-passthrough' check='partial'>
    <topology sockets='1' cores='4' threads='1'/>
    <feature policy='require' name='svm'/>
  </cpu>
```

これで仮想マシン側の設定変更は大丈夫だと思います。

# ESXi 7 のインストール
あとは Virtulization Station から仮想マシンを起動し、コンソール画面からインストールをしていけば OK です。通常通りインストールが進んでいきます。
![インストールの開始](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/541683/d81f1e35-ba3f-6959-456c-54c60075145a.png)
NIC が認識されるので、その先にも進めます。
![ディスクの選択](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/541683/a72adb4e-b36c-74ca-6d17-0077fe0eace2.png)
インストール完了後の再起動
![ログイン画面](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/541683/896fa7dd-2c50-9e06-9a08-93ae4c9a1812.png)
VMware Host Client ログイン後の画面
![VMわれ Host Client画面](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/541683/dcc53bd0-df96-f3b8-bff5-d744326e6645.png)
こんな感じでインストール後は普通に使えるようになります。

#注意点
最初にも書きましたが、QNAP の Virtualization Station では
1. nested が無効になっている
2. 仮想 NIC が限定されていて、e1000e や vmxnet3 が使えない
ため、ファームウエアや Virtualization Station のアップデートはもちろんのこと、仮想マシン側は Virtualization Station 使って仮想マシンの設定を触ってしまうと、仮想 NIC や CPU 設定が変更されてしまいます。そのため、これらの操作を行った場合には　ESXi 7 の仮想マシンを起動する前に、設定の復旧を忘れずに行う必要があります。ESXi 7 自体はインストールされていれば起動するので、万が一設定復旧を忘れても「ネットワークインターフェースが無い」というエラーになるだけなので特に問題ありません。以下のような画面が出たら、NIC の設定復旧を忘れていることになります。
![NICの設定忘れの場合](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/541683/afd056d6-6d7f-a6b5-59ec-9518a0a2f368.png)

# QNAP NAS に vSPhere ESXi 7 を動かすことのメリットとウイークポイント
まずは NAS と管理系の仮想マシンを一つの所にまとめることができます。また、今回使用した [QNAP TS-473](https://www.qnap.com/ja-jp/product/ts-473/specs/hardware) クラスだとメモリーを多く載せられるので、VMware HA や vMotion、vSAN のテストなどの簡単なクラスタを使った検証にはベストな選択かなと思います。
ただ、vSphere 7 の ESXi ではネストされた仮想マシンの動作はとても遅いので、vCenter Server をこの上で動かすなどしたい場合は、vSphere 6.7 までにしておくのが現実的かもしれません。このあたり、QNAP の Virtualization Station が良くなることを期待するか、それとも QNAP の NAS の中のもっと高性能の機種を使うかの選択が必要かもしれません。