Xen 4.4.2(SLES 11によるNested Xen環境構築編)


一般に言われる「Nested Virtualization」とは仮想マシンの中でハイパバイザ(Hypervisor)を実行可能とする機能を指します。
Nested VirtualizationをサポートするプラットフォームとしてはVMware ESX(i), Xen, Microsoft Hyper-Vがあります。
※個別には、Nested ESXi, Nested Xen, Nested Hyper-Vとも呼ばれます。

「Nested Virtualization」の環境では最低限3個のレイヤが連携して動くことが必要となります。

Nested Xenで最もシンプルなものはL0,L1,L2すべてが同じOSのXenを使用することです。
Nested XenはXen 4.4からサポートされています。
SLES 11(SUSE Linux Enterprise Server) SP4ではXen 4.4.2を搭載しており今回はSLES 11 SP4だけでNested Xen環境を構築する例をご紹介致します。
L0は「実際のハードウェア上で動作するHypervisor」とされていますが今回はESXi 6.0上の仮想マシン(OS:SLES 11 SP4)をL0として利用します。
実際にはこれは仮想L0なのですがここではESXiは透過扱いとして仮想L0を通常のL0とみなすことにします。
尚、ESXiをネストさせた環境でもSLES 11 SP4を仮想的なL0,L1,L2にできます。

今回使用したPCのハードウェア/ソフトウェア構成は以下の通りです。
■ ESXi環境でのL0の構築
これはオープンギャラリー:Xen 4.4.2(ESXi 6.0/SLES 11利用による完全仮想化対応「仮想Xenホスト」の構築編)で構築済みのvssles11xsという仮想マシンを使用します。
vssles11xsへのゲストOSインストールでは「サーバベースシナリオ:[Xen仮想化ホスト(デフォルトで設定されないローカルX11)]」指定でXen 4.4.2を導入しています。


■ L1の構築手順
今回は最低限L1のXenカーネルだけでもブート可能とさせるための強引な方法で作成しました。
SLES 11 SP4用DVDイメージファイルをデータストアに格納してL0仮想マシン(vssles11xs)に接続しておきます。
  1. L1の差し替え用menu.lstの準備
    L0仮想マシン(vssles11xs)内の/boot/grubmenu.lstをどこかのFTPサーバにputしておきます。
    これはL1の差し替え用menu.lstとして使用します。

  2. L1の仮想マシン定義
    L1はL0 Xen HypervisorのHVMドメインで動作するHVM仮想マシンであり以下のように「仮想マシンの作成」で構成定義しました。
    「仮想マシンの作成」ウィザードの起動はL0デスクトップの[コンピュータ]-[YaST]-[仮想化]-[仮想マシンの作成]で行ないます。
    または「vm-install &」でも「仮想マシンの作成」ウィザードを起動できます。

  3. 仮想ディスクと構成ファイルの作成
    「仮想マシンの作成」ウィザードでの「概要」画面で<OK>を押下すると仮想マシンの作成とゲストOSのインストールが開始されます。
    仮想マシンマネジャにxensles11xstestが表示されたらゲストOSのインストールは適当なところで中止してOKです。
    但し、中止するタイミングによっては中止後に「disk0.raw」が自動削除される場合があります(構成ファイルは自動削除されません)。
    SLES 11の場合で言うと[F2 - Language]のあるメニュー画面が表示された時点で以下のコマンドを実行してdisk0.rawを別ファイル(例:disk0.raw)としてコピー保存しておきます。
    インストーラを中止(キャンセル)してdisk0.rawが自動削除されていればdisk0.raw.saveからdisk0.rawにリネームしておけばOKです。
    (a)cp /var/lib/xen/images/xensles11xstest/disk0.raw /var/lib/xen/images/xensles11xstest/disk0.raw.save
    (b)インストーラの中止
    (c)mv /var/lib/xen/images/xensles11xstest/disk0.raw.save /var/lib/xen/images/xensles11xstest/disk0.raw

    「概要」画面で<OK>を押下することで以下のファイルが作成されます。
    (1)仮想ディスク
    ・/var/lib/xen/images/xensles11xstest/disk0.raw
    (2)仮想マシン構成ファイル
    ・XML構成ファイル:/etc/xen/vm/xensles11xstest.xml ※仮想マシンマネジャから仮想マシンを実行させる時に利用される構成ファイルです
    ・フラット構成ファイル:/etc/xen/vm/xensles11xstest ※xm createコマンドで仮想マシンを実行させる時に利用する構成ファイルです
    ※フラット構成ファイルは手動で作成してもいいのですがXenのバージョンに応じて自動生成されたものを利用するのがベターかと思います。

  4. フラット構成ファイル(/etc/xen/vm/xensles11xstest)の変更
    フラット構成ファイル(/etc/xen/vm/xensles11xstest)に以下の2行を追加します。
    ※仮想CPUに対してハードウェアアシスト仮想化機能特性を与える設定情報です(今回の場合はcpuid情報の指定は不要です)。
    hap=1
    nestedhvm=1

    尚、以下の行は別途変更しますがこの時点では変更しません。
    vif=[ 'mac=00:16:3e:1e:73:af,bridge=br0,model=e1000,type=netfront', ]

  5. ゲストOSのインストールとL1化の準備
    (1)以下のコマンドでゲストOSのインストールを改めて開始します。
    xm create /etc/xen/vm/xensles11xstest boot=d ※DVDからのブート
    次に仮想マシンマネジャのxensles11xstestの[開く]でグラフィカルコンソールが表示されてインストール画面を操作できるようになります。
    (2)メニュー画面操作;
    ・F2 - Language:[日本]を選択
    ・F3 - ビデオモード:[1024x768]の選択
    ・実行項目として[インストール]を選択
    (3)ようこそ:言語設定
    (4)メディアチェック
    (5)インストールモード:[新規にインストール]
    (6)時計とタイムゾーン
    (7)サーバベースシナリオ:[物理マシン(完全仮想化ゲスト向けも)]を選択
    (8)インストールの設定
    まず「ソフトウェア」で以下を選択します(必須)。
    ・[Xen仮想マシンホストサーバ]
    更に今回は「ソフトウェア」で以下のものも追加しました。
    ・ファイルサーバ
    ・WebおよびLAMPサーバ
    ・C/C++コンパイラとツール
    ここで<インストール>を押下するとパッケージがインストールされます。
    パッケージのインストールが完了すると自動再起動のところで仮想マシンが停止します。
    そこで以下のコマンドでゲストOSのインストールを続行させます。
    xm create /etc/xen/vm/xensles11xstest boot=c ※仮想ディスクからのブート
    ※フラット構成ファイル(/etc/xen/vm/xensles11xstest)中でboot="c"の設定があればboot=c指定は不要
    (9)システム管理者「root」のパスワード
    (10)ホストおよびドメイン
    ・ホスト名:xensles11
    ・ドメイン名:mydomain.net
    (11)ネットワーク設定
    ネットワーク設定の[ネットワークインタフェース]では以下のように表示されます。
    ※もし82540EMネットワークアダプタが表示された場合は無視します。
    ・Virtual Ethernet Card 0
      DHCPで設定済み
    [ネットワークインタフェース]をクリックして開いてeth0に対する<編集>を押下してネットワークカードの設定を行います。
    ここでは実機のESXiホストのネットワーク体系での固定IPアドレスを必ず指定します。
    ※本環境ではDomainUの仮想マシンでのDHCPは機能しないようです。
    またホスト名、DNS、デフォルトゲートウェイも指定します。
    (12)インターネットへの接続のテスト
    (13)ネットワークサービス設定
    ここではデフォルトで作成するCAと証明書の内容を確認するだけでOKです。
    (14)ユーザ認証方法
    (15)新規のローカルユーザ
    (16)リリースノート表示
    (17)ハードウェア設定
    (18)インストールの完了
    (19)ログイン画面の自動表示(通常カーネルが使用されています)
    rootでログインします。
    (20)L1化の準備
    上記のインストールで自動生成された/boot/grub/menu.lstを使用したGRUBメニューからのXenカーネルブートはできません。
    (「Could not find /dev/hda2」エラーとなります)
    そこで以下の強引な方法での対策を実施します。
    ※この時点でL1にするxensles11xstestを通常カーネルでブートすることは考えていません。

  6. フラット構成ファイル(/etc/xen/vm/xensles11xstest)の変更
    L0側にあるフラット構成ファイル(/etc/xen/vm/xensles11xstest)を変更します。
    これはvif行にnetfront指定があるとXenカーネルブートでのネットワーク利用が不可となるためです。
    [変更前]
    vif=[ 'mac=00:16:3e:1e:73:af,bridge=br0,model=e1000,type=netfront', ]
    [変更後]
    vif=[ 'mac=00:16:3e:1e:73:af,bridge=br0,model=e1000', ]

  7. L1の起動
    (1)下記のコマンドでL1を起動します。
    xm create /etc/xen/vm/xensles11xstest boot=c ※仮想ディスクからのブート
    ※フラット構成ファイル(/etc/xen/vm/xensles11xstest)中でboot="c"の設定があればboot=c指定は不要

    (2)L1のHypervisor起動
    GRUBメニューの[Xen -- SUSE Linux Enterprise Server 11 SP4 - 3.0.101-630]を選択してブートします。
    (3)rootでのログイン
    あまりスマートな方法ではありませんがこれでL2仮想マシンの作成準備が整いました。


■ 準仮想化L2の作成・実行例
L1のHypervisor環境の「仮想マシンの作成」ウィザードで準仮想化L2の作成を行ってみます。

■ 完全仮想化L2の作成・実行例
L1のHypervisor環境の「仮想マシンの作成」ウィザードで完全仮想化L2の作成を行ってみます。

これでhttp://wiki.xenproject.org/wiki/Nested_Virtualization_in_Xen (Nested Virtualization in Xen)で公開されている組み合わせ結果に以下のものが追加できるかと思います。
L1/L2SLES 11 SP4
(準仮想化)
SLES 11 SP4
(完全仮想化)
Xen - SLES 11 SP4
VV



■ Xen Hypervisorの実行用L2仮想マシン(XenホストL2)の構築例
上述した「■ L1の構築手順」と同様の手順でXen Hypervisorの実行用L2仮想マシンを作成できます。
Xen Hypervisorの実行用L2仮想マシンのことをここでは「XenホストL2」と呼ぶことにします。
今回はこのXenホストL2のネットワークアドレスはデフォルトのDHCP利用としてみましたが問題なく実ネットワークに接続できました。
下記はXenホストL2の構築手順例です。
(「■ L1の構築手順」と全く同じ部分は説明を省略致します)
  1. XenホストL2の差し替え用menu.lstの準備
    L0仮想マシン(vssles11xs)内の/boot/grubmenu.lstをこのXenホストL2の差し替え用menu.lstとしても使用します。

  2. XenホストL2の仮想マシン定義
    ■ L1の構築手順」との相違点は以下の通りです。
    (1)仮想マシン名:l2xensles11xs
    (2)メモリ
    ・初期メモリ:2048MB
    ・最大メモリ:2048MB
    (3)ディスク
    ・ソース:file:/var/lib/xen/images/l2xensles11xs/disk0.raw(デフォルトのまま)
    ・プロトコル:file
    ・8GBを12GBに変更

  3. 仮想ディスクと構成ファイルの作成
    「仮想マシンの作成」ウィザードでの「概要」画面で<OK>を押下すると仮想マシンの作成とゲストOSのインストールが開始されます。
    仮想マシンマネジャにl2xensles11xsが表示されたらゲストOSのインストールは適当なところで中止してOKです。
    「概要」画面で<OK>を押下することで以下のファイルが作成されます。
    (1)仮想ディスク
    ・/var/lib/xen/images/l2xensles11xs/disk0.raw
    (2)仮想マシン構成ファイル
    ・XML構成ファイル:/etc/xen/vm/l2xensles11xs.xml ※仮想マシンマネジャから仮想マシンを実行させる時に利用される構成ファイルです
    ・フラット構成ファイル:/etc/xen/vm/l2xensles11xs ※xm createコマンドで仮想マシンを実行させる時に利用する構成ファイルです

  4. フラット構成ファイル(/etc/xen/vm/l2xensles11xs)の変更
    フラット構成ファイル(/etc/xen/vm/l2xensles11xs)に以下の2行を追加します。
    hap=1
    nestedhvm=1

    尚、今回はvifの行にはtype=netfrontの指定はありませんでした。

  5. ゲストOSのインストールとXenホストL2化の準備
    (1)以下のコマンドでゲストOSのインストールを改めて開始します。
    xm create /etc/xen/vm/l2xensles11xs boot=d ※DVDからのブート
    次に仮想マシンマネジャのl2xensles11xsの[開く]でグラフィカルコンソールが表示されてインストール画面を操作できるようになります。

    (2)インストールの設定
    ・/dev/sda1(swap)パーティションサイズは0.5GBとし、/dev/sda2(/)は11.5GBとしました。
    ・今回は仮想ディスクの容量節約のために「ソフトウェア」での[C/C++コンパイラとツール]は選択しませんでした。

    (3)パッケージのインストールが完了すると自動再起動のところで仮想マシンが停止します。
    そこで以下のコマンドでゲストOSのインストールを続行させます。
    xm create /etc/xen/vm/l2xensles11xs boot=c ※仮想ディスクからのブート
    ※フラット構成ファイル(/etc/xen/vm/l2xensles11xs)中でboot="c"の設定があればboot=c指定は不要

    (4)ホストおよびドメイン
    ・ホスト名:l2xensles11xs
    ・ドメイン名:mydomain.net

    (5)ネットワーク設定
    ネットワーク設定の[ネットワークインタフェース]では以下のように表示されます。
    ※もし82540EMネットワークアダプタが表示された場合は無視します。
    ・Virtual Ethernet Card 0
      DHCPで設定済み
    今回はDHCPのままとしました。

    (6)インストールの完了とログイン
    インストールの完了直後にログイン画面が表示されますがこの時は通常カーネルが使用されています。

    (7)ネットワーク接続確認

    (8)XenホストL2化の準備

  6. XenホストL2の起動
    (1)下記のコマンドでXenホストL2を起動します。
    xm create /etc/xen/vm/l2xensles11xs boot=c ※仮想ディスクからのブート
    ※フラット構成ファイル(/etc/xen/vm/l2xensles11xs)中でboot="c"の設定があればboot=c指定は不要

    (2)XenホストL2のHypervisor起動
    GRUBメニューの[Xen -- SUSE Linux Enterprise Server 11 SP4 - 3.0.101-630]を選択してブートします。

    (3)rootでのログイン
    Xenブートした場合でもDHCPでのネットワーク利用が可能です。
    下記はXenホストL2の中からESXiサーバのトップページにWebアクセスしている様子です。



    ・実寸画像はこちらです。



■ XenホストL2上の準仮想化L3の作成・実行例
上述した「■ 準仮想化L2の作成・実行例」と同様の手順でXenホストL2上の準仮想化L3を作成・実行できます。


■ ご参考1:Nested ESXi上のNested Xen
上記ではネストされていないESXi上でのNested Xen実行例を示しました。
このNested Xen環境をネストされたESXi上にコピー(クローン作成)して「Nested ESXi上のNested Xen」も試してみました。
※DataCenter1側のvssles11xs仮想マシンをDataCenter3L2側のネストされたvsesxi6test上にvssles11xsclnl2という仮想マシンでクローン作成しました(ホスト名変更なし)。
クローン作成先のvsesxi6testについては「オープンギャラリー:Xen 4.4.2(ESXi 6.0-SLES 11利用による完全仮想化対応「仮想Xenホスト」の構築編)」の「■ Nested ESXi環境での完全仮想化対応「仮想Xenホスト(Xen HVM domU)」の作成(ネストされた仮想ESXiホストの構築)」をご参照下さい。
L0, L1, L2, ...というレイヤ区分ごとの仮想マシン名を下表に示します。
Lx仮想マシン名OS備考
L0
-
(実機上のOS)
ESXi 6.0ESXi Hypervisor
L1
vsesxi6testESXi 6.0ESXi Hypervisor
L2
vssles11xsclnl2SLES 11 SP4Xen Hypervisor
L3
xensles11xstestSLES 11 SP4Xen Hypervisor
L4
l2pvsles11SLES 11 SP4
末端仮想マシンのl2pvsles11(準仮想化)でもネットワーク接続は問題なく行えます。
尚、l2fvsles11(完全仮想化)はGRUBブートメニューで停止したままで全く反応しなくなりました。



・実寸画像はこちらです。


■ ご参考2:KVM上のNested Xen
KVM上のNested Xenについてはオープンギャラリー:CentOS 7によるNested KVM環境の構築KVM上のNested Xenをご参照下さい。