NutaNice Xperience

主にNutanix製品を検証したり触ったりした結果をつづっています。※このブログの内容は個人の見識や見解をもとに作成しています。参考にされる場合は自己責任でご活用ください。実際に製品を使用される場合は、メーカードキュメントの手順に従い実施してください。

NutanixのCVMが起動するところを調べてみる

NutanixのCVMはLinuxCentOS)の仮想マシンベースでカスタマイズされているVMですが、最近資料を作っていてCVMの起動の仕組みが気になったのでわかる範囲で調べてみました。

今回は以下の環境のCVMを例にします。

プラットフォーム: NX-1465-G5
AOS: 5.20.1.1
ハイパーバイザー: ESXi 7.0.2 build-17867351

ディスクの構成はノード毎にSSD1本とHDD2本、Satadom(最近はM.2 SSDが主流)1枚です。

CVMは仮想ディスクを持たず、PCIパススルーデバイスとして接続しているノードのローカルディスクへ直接アクセスしており、ローカルのSSDの一部へOS領域を保存しています。

f:id:tomomartin:20220212000551p:plain

そこで、CVMは仮想マシンとして起動すると、BIOSがローカルディスクのMBRを読み込んでbootパーティションからgrubとかを読み込んでいるかと思っていたのですが、よく見ると/bootパーティションなくね?ということでちょっといろいろ調べてみました。

まず、ESXiでNutanixを導入した場合、CVMの仮想マシン設定は以下のようになっています。

f:id:tomomartin:20220212001405p:plain

このように、データストアの「ServiceVM_Centos.iso」というISOイメージファイルがCVMのCDドライブには常にマウントされています。

各ノードのsatadom(最近はM.2 SSDが主流)というESXiがインストールされているフラッシュデバイスの一部をvmfsデータストアとしてESXiが公開しており、「ServiceVM_Centos.iso」はこのデータストアに保存されているものです。

ESXiがsatadomの一部をvmfsデータストアとして公開↓
f:id:tomomartin:20220212003635p:plain

CVMへマウントされているデータストアのISO↓
f:id:tomomartin:20220212003923p:plain

このISOが何をしているかというと、CVMのブートデバイス(/boot)として毎回起動時に読み込まれているようです。

実際にCVMからマウントして中身を確認してみました。

CVMのCDドライブにしれっと接続されているこのISOです。
f:id:tomomartin:20220212004725p:plain

とりあえず適当なディレクトリにマウントして、中身を覗いてみると/boot配下にgrubやkernel、initrdがいますね。
f:id:tomomartin:20220212005308p:plain

ちなみにCVMのBIOS設定では、CDドライブから読み込むようにブートオーダーが設定されているので、BIOSはまずこのISOイメージファイルからブートローダーをメモリに読み込んでいるようです。
f:id:tomomartin:20220212005820p:plain

実際にこのISOに保存されているブートローダーの設定ファイル(/boot/grub/grub.cfg)は、以下のようになっています。

f:id:tomomartin:20220212010336p:plain

CVMはCentOS7なのでおそらくGRUB2でカスタマイズされていると思いますが、簡単に解説すると、独自に「menuentry」を作成して、「linux」コマンドで/boot/kernelをカーネルとして指定し(その際オプションでカーネルへ「init=/svmboot」というコマンドを渡している)、さらにinitrdコマンドで/boot/initrdを初期マウントするinitramfsとして指定しています。

ここで読み込まれたカーネルは、先ほど見せたISOイメージの中にある/boot/initrdからファイルシステムをはじめにマウントするわけです。

ちなみに実際に、CVMを起動すると、上記の「grub.cfg」の「menuentry」が表示されて実行されます。
f:id:tomomartin:20220212011630p:plain

また、先ほど確認したlinuxコマンドでカーネルへ渡しているinit=/svmbootですが、こちらも確認してみました。

まずは、ISOの中にあった「/boot/initrd」を適当な場所へコピーして、zcatとcpioで出力すると、以下のようになりました。「svmboot」がいますね。

f:id:tomomartin:20220212012814p:plain

このsvmbootはシェルスクリプトなのですが、中身まで解読する気がなくこれ以上深堀するのはやめておきますが、内容的には以下のようなことを実行しているようです。

これらの作業が上手くいくまで何度か繰り返すような感じでした。

このあたりは、Nutanix独自のカスタマイズがされているので、内部でCVM用の様々な処理が走っているのでしょうね。結果としてPCIパススルーで直接アクセスしているローカルディスクのパーティションをマウントするようです。

今回は、CVMの起動の仕組みを色々と調べてみましたが、結果として分かったことは

  • ESXiがsatadom(M.2 SSD)の一部をvmfsデータストアとして公開
  • CVMがそのデータストアのISOをCDドライブへ常時マウント」
  • ISOには/bootパーティションが保管されている」
  • CVMはこのISOからgrubカーネル、initramfsを読み込んでOSを起動」
  • 内部的には普通のCentOSが色々カスタマイズされて起動している感じ

ここから先は、カーネルスクリプトを色々解読しないといけなくなるので、難易度が高そうですね。。

今回はこのへんで。