/var/log/pabotesu.log

日々の記録

ESXi on KVMを実装していきたい

Introduction - ESXi on KVMを実装していきたい

あけましておめでとうございます!ひさびさすぎる更新となりました...

2020年の後半はいろいろ資格を取っていたり、技術的な部分のインプットに時間を充ててました...

(それ以外だとiPad Airを 買ったり、キーボードが届いてテンションが上がったり...)

とまぁ、私事になりますが現在業務でVMwareを扱う機会が多く、今月中にもVCPを取得する予定でもあります。

できれば、身近な環境でVMwareのvShpereを実装してみたいと思いました。

ですので、今回は普段遣いしているLinux環境のKVM上でESXiを動かしたい!という試みです。

結論から申し上げますと、実装はできたけど「まだまだ試す部分が多い」という所感です。

この部分は今後の記事のネタにできればと思います。

Environment - 実装環境

#OSとカーネル
$ uname -a
Linux Arch-Machine 5.9.14-zen1-1-zen #1 ZEN SMP PREEMPT Sat, 12 Dec 2020 14:36:44 +0000 x86_64 GNU/Linux

#実装するマシンのホスト名
$ uname -n
Arch-Machine

#ハードウェア
$ lscpu | grep "Architecture\|Thread(s) per core\|Core(s) per socket\|Model name\|Frequency boost\|CPU MHz"
Architecture:                    x86_64
Thread(s) per core:              2
Core(s) per socket:              6
Model name:                      AMD Ryzen 5 3600 6-Core Processor
Frequency boost:                 enabled
CPU MHz:                         2317.892

$ free
              total        used        free      shared  buff/cache   available
Mem:       32873960     1634276    29700216      410256     1539468    30441708
Swap:      33554428           0    33554428

$ lsblk | grep nvme
nvme0n1     259:0    0 465.8G  0 disk 
├─nvme0n1p1 259:1    0   512M  0 part /boot
├─nvme0n1p2 259:2    0    32G  0 part [SWAP]
├─nvme0n1p3 259:3    0    64G  0 part /
└─nvme0n1p4 259:4    0 369.3G  0 part /home

#ネットワーク周り
$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: enp4s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 50:3e:aa:14:33:c1 brd ff:ff:ff:ff:ff:ff
    inet 192.168.10.22/24 brd 192.168.10.255 scope global dynamic noprefixroute enp4s0
       valid_lft 34242sec preferred_lft 28842sec
    inet6 fe80::e894:cfe7:c06f:33e5/64 scope link 
       valid_lft forever preferred_lft forever
3: enp5s0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc fq_codel state DOWN group default qlen 1000
    link/ether a8:a1:59:16:44:03 brd ff:ff:ff:ff:ff:ff
4: virbr0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default qlen 1000
    link/ether 52:54:00:d3:55:88 brd ff:ff:ff:ff:ff:ff
    inet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0
       valid_lft forever preferred_lft forever
5: virbr0-nic: <BROADCAST,MULTICAST> mtu 1500 qdisc fq_codel master virbr0 state DOWN group default qlen 1000
    link/ether 52:54:00:d3:55:88 brd ff:ff:ff:ff:ff:ff

Concept - 構想

+Arch Machine----------------+-------+----------+
|(192.168.10.22)             |enp4s0 |          |
|                            +--+----+          |
|                               |               |
|  +----------------------------+--+---------+  |
|  |                            |            |  |
|  |          +virbr0 ----------+--+         |  |
|  |          |(192.168.122.1)     |         |  |
|  |          +---------+----------+         |  |
|  |                    |                    |  |
|  |   +-ESXi Host------+---------------+    |  |
|  |   |    (192.168.122.252(DHCP))     |    |  |
|  |   +--------------------------------+    |  |
|  |                                         |  |
|  +Virtual Network--------------------------+  |
|   (192.168.122.0/24)                          |
+-----------------------------------------------+

上の図のように、ホストマシン(Arch-Machine)の中にLinuxの標準スイッチを設定して、

その下に、VMとしてESXiホストを実装しております。

実装環境にて、NICが複数ありますが、実はマシンを新調したばかりでしてNICを遊ばせてしまっています..

今回はenp4s0のみが登場します。

Preparation - 前準備

まずは、自分の環境でKVNによる仮想化を実行できるかを調査しましょう。

$ LC_ALL=C lscpu | grep Virtualization

または、

$ grep -E --color=auto 'vmx|svm|0xc0f' /proc/cpuinfo

各々、環境にもよりますが下記のように、仮想化を行える旨で回答が来ればヨシっ!

$ LC_ALL=C lscpu | grep Virtualization
Virtualization:                  AMD-V
#AMDなら"AMD-V",Intelなら"VT-x"

$ grep -E --color=auto 'vmx|svm|0xc0f' /proc/cpuinfo
#AMDなら"svm" Intelなら"vmx"が出力されます。
#今回は長いので省略

次に、必要なパッケージのインストール

$ pacman -S qemu virt-manager
#qemu -> KVMで仮想マシンを動かす上でハードウェアをエミュレートしてくれる
#virt-manager -> KVMのGUIフロントエンド(Linuxのデスクトップ環境なので便利)

ESXiでVMを起動するための設定、いわゆる「VM on VM」を実現する設定もここで、

$ vim /etc/modprobe.d/kvm.conf
options kvm_amd nested=1
#options kvm_intel nested=1  ---> intelならこっち
#↑今回はAMDなので...

機能が有効になっているかを確認。

$ systool -m kvm_amd -v | grep nested #intelなら"systool -m kvm_intel -v | grep nested"
    nested              = "1"
    #nested                = "Y"でもOK

Run - 実行

実際に動かす際は、ESXiのインストールファイルを公式から持ってきて、"virt-install"を下記のように実行。

※あくまで、一例です。

$ virt-install \
--name esxi70 \
--ram 8000 \
--disk path=/var/lib/libvirt/images/esxi70.img,size=20,bus=sata \
--cpu host-passthrough \
--vcpus=4 \
--os-type linux \
--os-variant=virtio26 \
--network bridge=virbr0,model=e1000e \
--graphics spice,listen=0.0.0.0,password=password \
--video qxl \
--cdrom /var/lib/libvirt/images/VMware-VMvisor-Installer-7.0b-16324942.x86_64.iso \
--features kvm_hidden=on \
--machine q35

NICの問題で、"e1000"で実行していましたが、それではESXiのインストール画面でひたすらエラーが出るので、

"e1000e"に変更!、同じintel-NICなのになぜ...?

root以外のユーザが実行するか否かの設定等もありましたが今回は割愛。

Result - 結果

esxi_on_kvm
esxi on kvm

できたわね!

After Word

以上です!

今回は、そりゃそうだみたいな感じの実装でしたが、これをもう少しNW周りをゴリゴリにして、

ESXi on KVMでガチLAB環境を作りたいものです。

APIとかも作るかも...

それでは、サラダバー!!

Reference - 参考

QEMU - ArchWiki

KVM - ArchWiki

KVM とは - Linux 仮想化の仕組み | Red Hat