NutanixのCVMはLinux(CentOS)の仮想マシンベースでカスタマイズされている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領域を保存しています。
そこで、CVMは仮想マシンとして起動すると、BIOSがローカルディスクのMBRを読み込んでbootパーティションからgrubとかを読み込んでいるかと思っていたのですが、よく見ると/bootパーティションなくね?ということでちょっといろいろ調べてみました。
まず、ESXiでNutanixを導入した場合、CVMの仮想マシン設定は以下のようになっています。
このように、データストアの「ServiceVM_Centos.iso」というISOイメージファイルがCVMのCDドライブには常にマウントされています。
各ノードのsatadom(最近はM.2 SSDが主流)というESXiがインストールされているフラッシュデバイスの一部をvmfsデータストアとしてESXiが公開しており、「ServiceVM_Centos.iso」はこのデータストアに保存されているものです。
ESXiがsatadomの一部をvmfsデータストアとして公開↓
CVMへマウントされているデータストアのISO↓
このISOが何をしているかというと、CVMのブートデバイス(/boot)として毎回起動時に読み込まれているようです。
実際にCVMからマウントして中身を確認してみました。
CVMのCDドライブにしれっと接続されているこのISOです。
とりあえず適当なディレクトリにマウントして、中身を覗いてみると/boot配下にgrubやkernel、initrdがいますね。
ちなみにCVMのBIOS設定では、CDドライブから読み込むようにブートオーダーが設定されているので、BIOSはまずこのISOイメージファイルからブートローダーをメモリに読み込んでいるようです。
実際にこのISOに保存されているブートローダーの設定ファイル(/boot/grub/grub.cfg)は、以下のようになっています。
CVMはCentOS7なのでおそらくGRUB2でカスタマイズされていると思いますが、簡単に解説すると、独自に「menuentry」を作成して、「linux」コマンドで/boot/kernelをカーネルとして指定し(その際オプションでカーネルへ「init=/svmboot」というコマンドを渡している)、さらにinitrdコマンドで/boot/initrdを初期マウントするinitramfsとして指定しています。
ここで読み込まれたカーネルは、先ほど見せたISOイメージの中にある/boot/initrdからファイルシステムをはじめにマウントするわけです。
ちなみに実際に、CVMを起動すると、上記の「grub.cfg」の「menuentry」が表示されて実行されます。
また、先ほど確認したlinuxコマンドでカーネルへ渡しているinit=/svmbootですが、こちらも確認してみました。
まずは、ISOの中にあった「/boot/initrd」を適当な場所へコピーして、zcatとcpioで出力すると、以下のようになりました。「svmboot」がいますね。
このsvmbootはシェルスクリプトなのですが、中身まで解読する気がなくこれ以上深堀するのはやめておきますが、内容的には以下のようなことを実行しているようです。
- 「/svmboot_common.sh」や「/modules.sh」という補助スクリプトを実行
- CVMのソフトウェアRAIDのボリュームのスキャン
- ブロックデバイスのスキャンとbootするのに適切なパーティションの探索
これらの作業が上手くいくまで何度か繰り返すような感じでした。
このあたりは、Nutanix独自のカスタマイズがされているので、内部でCVM用の様々な処理が走っているのでしょうね。結果としてPCIパススルーで直接アクセスしているローカルディスクのパーティションをマウントするようです。
今回は、CVMの起動の仕組みを色々と調べてみましたが、結果として分かったことは
- ESXiがsatadom(M.2 SSD)の一部をvmfsデータストアとして公開
- CVMがそのデータストアのISOをCDドライブへ常時マウント」
- ISOには/bootパーティションが保管されている」
- CVMはこのISOからgrubとカーネル、initramfsを読み込んでOSを起動」
- 内部的には普通のCentOSが色々カスタマイズされて起動している感じ
ここから先は、カーネルやスクリプトを色々解読しないといけなくなるので、難易度が高そうですね。。
今回はこのへんで。