まだプログラマーですが何か?

プログラマーネタ中心。たまに作成したウェブサービス関連の話も https://twitter.com/dotnsf

2025/02

先日、このようなブログエントリを紹介しました:
VirtualBox の仮想マシン内で仮想マシンを使う2025020500


紹介した内容そのものは「VirtualBox のネステッド VT-x を有効化する」というものでした。

VirtualBox のゲスト OS として KVM を使う場合はこの設定だけでもいけそうだったのですが、ESXi を使おうとすると更にややこしいというか、実現難易度が少し高い気がしています。普通に ESXi を導入することもできない(途中で止まる)し、導入は最後まで進んでも起動すると、(悪名高い)PSOD( Purple Screen Of Death 下図参照) の画面になって止まってしまったり・・・
2025020806


この問題は結構メジャーなようで、現象をヒントにググると ESXi 起動時のオプション指定をすると回避できるとか、CPU が新しすぎたり古すぎたりすると NG とか・・・必ずしも自分の環境では解決に結びつかなかった情報もいくつか見つかりました。

正直な所、環境依存の問題もあると思っています(以下で紹介する方法も、インストールできる環境とできない環境に分かれます)。ただ少なくとも成功した実績のある方法、の紹介という意味で説明します。


【動作実績のある VirtualBox 内 ESXi 環境構築手順】
一言で簡単に言うと「古い Linux 環境を用意する」ことで自分の VirtualBox では ESXi を導入できました。例えば OS の種類は適当に選ぶのではなく「Linux 2.6/3.x/4.x/5.x」を選ぶ必要がありました:
2025020801


またメモリは 4GB 以上にする必要があります(これ以下だとエラーメッセージが出て止まります)。またチップセットは「ICH0」、ポインティングデバイスは「PS/2 マウス」を指定しました:
2025020802


最後に前回のブログエントリでも紹介した「ネステッド VT-x の有効化」も実施します:
2025020803


ここまで行った上で ESXi のインストール iso を DVD ドライブにセットして起動すると無事にインストールできました(上述の起動時オプション指定も不要でした)。なお ESXi のバージョンですが、7.x ではインストールできず、6.x ではインストールできました。5.x でもインストールできましたが、5.x は TLS 1.2 までしか使えず、今どきのブラウザは TLS 1.2 がサポート外のものが大半なので(インストールできてもブラウザから利用できないので)、実質的に 6.x だけの導入実績です(7 より上のバージョンは試していません):
2025020804


2025020805


個人利用目的で VMWare や ESXi を使うことはもうないと思ってますが、仕事ではお客様の環境でまだ多く使われているようで、仮想的に ESXi の動作確認環境が用意できるとなにかと便利なのでした。6.x 限定になっちゃうけど、この構築手順がどこかで誰かの役に立てばうれしいです。

 

今回紹介する VirtualBox の設定は「仮想マシン内で仮想マシンを使う」設定です。例えばゲスト OS を CentOS にして、そのゲスト OS 内に KVM などの仮想化基盤を導入するとか、あるいはゲスト VM として ESXi を使いたいといった、ゲスト OS 内で別の VM を動かす、といった用途で使う場合の設定です:
2025020500



といっても、そこまでややこしい設定ではありません。該当の VM 内でネステッド VT-x と呼ばれる機能を有効化することで実現できます。VirtualBox の場合は設定の システム - プロセッサー タブ内に「ネステッド VT-x/AMD-V を有効化」というラジオボタンがあります:
2025020501


ここにチェックを入れて有効化することでネステッド VT-x が有効になり、ゲスト OS 内の仮想化基盤で VM を動かすことが可能になります:
2025020502


少しややこしいのが、このネステッド VT-x の設定は上図のように手動で変更できる場合はいいのですが、稀に下図のようにグレイアウトされていて(GUI からは)変更できないことがある、ということです:
2025020503


その場合は CUI(Windows であればコマンドプロンプト)から VBoxManage.exe を使い、以下のように実行してネステッド VT-x を有効化してください。なお VBoxManage.exe は VirtualBox をインストールしたディレクトリ(Windows のデフォルトであれば "C:\Program Files\Oracle\VirtualBox")内に存在しています。必要に応じてフォルダを移動してから実行するか、パスを通してから実行してください:
> VBoxManage modifyvm '(VM名)' --nested-hw-virt on

これで VirtualBox の VM 内で別の VM を起動させることも可能になりました:
2025020504

2025020500



VirtualBox で作成したゲスト OS は VirtualBox のインターフェースを通して GUI 画面を直接操作することができます。ゲスト OS が Windows などである場合は、まあ GUI で操作するのが普通というか一般的なので、この操作方法に違和感を感じることはあまりないと思っています。

一方、ゲスト OS が Linux 系の OS だったりすると、GUI のデスクトップで操作できたとしても実際にはサーバー機能でしか使わないことがあったりするなど、事実上 CUI でしか操作しない、というケースも珍しくないはずです。仮にデスクトップ機能が導入された Linux を CUI で操作しようとすると、デスクトップにログインして、ターミナルを開き、その小さな画面のターミナルの中で CUI 操作することになります。いちいちデスクトップ GUI を経由するのが面倒だし、環境によってはネットワーク遅延の影響を受けることもあるんですよね。。

というわけで、私は多くのケースでホスト OS からゲスト OS に ssh 接続して使っています。操作するアプリがホスト側にあるのでネットワーク遅延もほぼ気にならないし、例えば teraterm を使ってアクセスすれば teraterm 側の便利な機能(マクロとか、操作記録ログとか)も使えて便利です。このようにホスト OS からゲスト OS に ssh 接続するためのゲスト OS の設定方法を紹介します:
2025020301



【VirtualBox のホストオンリーアダプターを使う】
VirtualBox でホスト OS からゲスト OS に ssh 接続するには、ゲスト OS 側に「ホストオンリーアダプター」が用意されている必要があります。

SSH 接続したい VM を選び、設定のネットワークからアダプターのタブを見て、まだ有効化されていないアダプターを見つけます:
2025020203


使っていなかったアダプター(図ではアダプター3)を有効化して、割り当ての種類を「ホストオンリーアダプター」に設定します。この状態でゲスト OS を起動します:
2025020204


この状態で VM を起動し、OS 側でもこのアダプターを有効にします。仮にこのアダプターが eth1 だった場合はこのような感じ:
# nmcli con add ifname eth1 con-name eth1 type ethernet

# nmcli con mod eth1 connection.autoconnect yes

# nmcli con mod eth1 ipv4.addresses 192.168.56.100/24

# nmcli con up eth1

これでホスト PC の teraterm(SSH クライアント)から 192.168.56.100 に対して ssh 接続できるようになります。使い慣れた ssh クライアントで操作できるようになって便利で、基本的な作業は VirtualBox を経由することなく、実施できるようになりました。これに慣れちゃうと、もう元の環境には戻れないです:
2025020301





【前回の復習と今回の目的】
前回のブログエントリで VirtualBox 内の閉域ネットワーク上に VM (下図の VM1)を作る手順を紹介しました:
2025020101

今回は下図の VM0 に相当するような、インターネット接続ルータとなるサーバーを VirtualBox 内に作る手順を紹介します。閉域ネットワークだけなら構築は簡単ですが、インターネット接続ができないので OS やアプリケーションの導入がかなり面倒になります。一方、これができると VPC っぽい感じの便利な(というか不便でない)環境が使えるようになり、VM0 や VM1 だけでなく、この内部ネットワークに繋がる全てのサーバーのアウトバウンド・インターネット接続が可能になります:
2025020102


というわけで、今回のブログエントリでは上図の VM0 に相当するようなルーターを VirtualBox で作る手順を紹介します。


【VirtualBox でルータを作る】
上手の VM0 に相当するルータを作ろうとすると、少なくとも2つの NIC (内部ネットワークに接続されるものと、インターネットに繋がる回線に接続されるもの)が必要になり、これらの間でルーティングを実装する必要があります。

というわけで、VirtualBox の VM でも2つの NIC を有効にする必要があります。VM 作成時に(作成してシャットダウン後でも構いません)、ネットワークのアダプター設定を変更します。まずアダプター1(上図での eth0)は普通に intnet の内部ネットワークに接続する設定にします:
2025020201


その上でアダプター2(上図での eth1)も有効化し、割り当て種類をインターネットに接続できるものにします。「NAT」か「ブリッジアダプター」になりますが、今回は設定がより簡単な「NAT」にしました:
2025020202


そして VM を起動し、NIC のアダプター名を確認します。仮にアダプター1が eth0 、アダプター2が eth1 であったと仮定します:
# nmcli device
DEVICE  TYPE      STATE      CONNECTION
eth0    ethernet  connected  eth0
eth1    ethernet  connected  eth1
  :


まず eth0 の設定は IP アドレス(10.10.0.1)以外は前回と同様です。内部ネットワークである intnet(10.10.0.0/24)に接続して動くような設定を行います:
# nmcli con add ifname eth0 con-name eth0 type ethernet eth0 をインターフェースとして追加

# nmcli con mod eth0 connection.autoconnect yes OS起動時に自動接続

# nmcli con mod eth0 ipv4.addresses 10.10.0.1/24 IPv4アドレスとネットマスク

# nmcli con mod eth0 ipv4.method manual 手動設定であることを明示

# nmcli con mod eth0 ipv4.dns 10.10.0.10 DNSサーバー

# nmcli con up eth0 ここまでの設定を有効化

ここからが今回の肝になる部分です。インターネットに NAT で接続する側である eth1 の設定を以下のようにします:
# nmcli con add ifname eth1 con-name eth1 type ethernet eth1 をインターフェースとして追加

# nmcli con mod eth1 connection.autoconnect yes OS起動時に自動接続

# nmcli con up eth1 ここまでの設定を有効化


これで2つのネットワークアダプターそれぞれの設定を行いました。最後にこの2つのアダプター間で IP フォワーディングと IP マスカレードによるルーティングを行うための設定を追加します:
(/etc/sysctl.conf に "net.ipv4_forward=1" を追加)

# sysctl -p

# iptables-save 現在の iptables 設定を確認(何も表示されないことを確認)

# iptables -A FORWARD -j ACCEPT ポートフォワーディングを有効化

# iptables -t nat -s 10.10.0.0/24 -A POSTROUTING -j MASQUERADE NAT による IP マスカレードを有効化

これで閉域ネットワークだった intnet 内からインターネットを使えるようにするためのルータ VM0 が準備できました。

ここまでできたら、後は intnet 内の VM(例えば VM1)のデフォルトゲートウェイを VM0 に指定し、インターネット用の DNS を追加設定するだけです。VM1 で以下を実行してデフォルトゲートウェイを VM0 に設定します:
# nmcli con mod eth0 ipv4.gateway 10.10.0.1 デフォルトゲートウェイを VM0 に指定

# nmcli con up eth0 ここまでの設定を有効化

最後に VM1 から DNS 含めてインターネットに接続できることを確認します。下の例では "www.ibm.com" というインターネット上のホスト名を指定して、IP アドレス解決ができ、ping も通ることを確認しています:
# ping www.ibm.com

PING e7817.dscx.akamaiedge.net (23.35.121.153) 56(84) bytes of data.
64 bytes from a23-35-121-153.deploy.static.akamaitechnologies.com (23.35.121.153): icmp_seq=1 ttl=54 time=11.6 ms
64 bytes from a23-35-121-153.deploy.static.akamaitechnologies.com (23.35.121.153): icmp_seq=2 ttl=54 time=24.6 ms
  :

閉域ネットワーク内に作った VM1 がインターネットルータとなる VM0 を経由して外部に接続できるようになったことが確認できました。





このページのトップヘ