Nutanix CE 2.0 のインストーラーが Intel 2.5GbE NICを認識しない場合の対処法

⏱この記事を読むのに必要な時間は約 10 分です。

先日、Nutanix社内Slackの #ce チャンネルを眺めていたら、海外の同僚が 「Intel 2.5GbE搭載のNUCを3台買って、CE 2.0をインストールしようとしたら、1台は成功したけれど、あとの2台でCE-Installer(Phoenix)がNICの認識に失敗した」という書き込みをしていました。

実はIntel 2.5GbE NICについては、私の手元の環境でもI225-VがCE-Installerで動作しない、という事象が起きていたので、これを機に調査してみました。

結論(超短縮まとめ版)

結論から言いますと解決に成功しました。IGCカーネルモジュールに修正を加えてビルドして、CE-Installerでロードすれば認識します。認識した後は、普通にインストールをするだけ。私がビルドしたものでよければ↓からダウンロード してお使い下さい。

igc-patched.ko for Nutanix CE 2.0
Size: 190104 bytes
MD5: f9c0cc0c223aafe5958c05305d3c7fc6

貴様がビルドしたカーネルモジュールなんぞ使えるかっ!と言う方は、以下に原因解説や手順を書いておきますので、セルフでビルドしていただければと。

詳細

以下に詳細を記します。

発生した事象

  • Nutanix CE 2.0のインストーラーにおいて、Intel 2.5GbE NIC(225-V)を認識しない場合がある
  • 同僚曰く、正常に認識した個体もあるらしいが、認識しない個体との差異は不明
  • オンボードでもPCI-Expressアドオンカードでも発生

自分の所有するI225-Vチップ搭載のアドオンカードでも事象が再現したので、dmesgコマンドで認識処理時のメッセージを確認。確かにエラーになって、NICが使用できない状態でした。

[root@phoenix ~]# dmesg
(省略)
[    4.290673] Intel(R) 2.5G Ethernet Linux Driver
[    4.290676] Copyright(c) 2018 Intel Corporation.
[    4.330985] igc: probe of 0000:05:00.0 failed with error -2
(省略)

類似事象・原因探し

PhoenixはLinux(CentOS)ベースなので、↑のエラーメッセージを元に検索してみました。

それらしいものとしては↓の各スレッド。

Linuxディストリビューションのフォーラムだと「新しいカーネルなら動いた」「新しいバージョンなら動いた」という結論に至っていました。kernel.orgは修正に向けたやり取り。カーネルモジュールのコードに修正を入れているので、このあたりを反映する必要がありそう。

解決策

CE-InstallerのファイルはSquashFSというリードオンリーの圧縮イメージから起動時に展開されていて、変更はメモリ上にしか保存されません。いわゆるLiveCDと同じ仕組み。そのため、新しいバージョンのカーネルを作成しても、再起動したら消えてしまいます。

そこで、今回はカーネルモジュール(=デバイスドライバー)のみを新しくして、CE-Installerでロードする、という方向で進めることにしました。

IGCカーネルモジュールは、Linuxカーネルのソースツリーに同梱されており、単体での配布はされていません。そこで、新しいバージョンのLinuxカーネルのソースツリーから、IGCカーネルモジュールに関連するファイルだけを取り出します。

Linuxのカーネルモジュールは、カーネルのバージョンに合わせてビルドすることが必要となりますので、CE-Installerのカーネル用にビルドします。CE-Installerのカーネルは、幸いにして独自のものではなく、kernel.org 公式のカーネル(5.10.2)をそのまま利用していことが分かったため、カーネルモジュールのビルドに必要なカーネル本体のソースも簡単に手に入りました。

なお仮に、新しいバージョンのカーネルに同梱されたカーネルモジュールが、新しいバージョンのLinuxカーネルに依存したコードを含んでいるとビルドの際に問題となる可能性がありますが、結論から言うと今回は問題なくビルドし、動作させることができました。(※表面化していない細かな問題もあるかもしれませんが、ビルドしたカーネルモジュールはインストール処理中にしか使わないので気にしない)

ビルド環境のセットアップ

Linuxカーネルビルド作業用の環境が整えられれば、UbuntuでもCentOSでも、その他何でもOKです。私は普段Windowsマシンを使うことが多いため、今回はWSL2-Ubuntuを使用しました。

1. 利用可能なパッケージのリストの更新
sudo apt-get update
2. ビルドに必要なパッケージのインストール
sudo apt install flex bison libssl-dev libelf-dev

ビルドに必要なファイルの準備

3. Linuxカーネルソースのダウンロード
mkdir /usr/src/kernels
cd /usr/src/kernels
wget --no-check-certificate https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.10.2.tar.gz
wget --no-check-certificate https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.10.139.tar.gz
(※5.10.2はCE-Installerのカーネルバージョン、5.10.139はAHVと同じカーネルバージョンです。AHVではIGCが正常動作していたのでこのバージョンにしてみた、というだけです。)
4. ダウンロードしたファイルを展開
tar zxvf linux-5.10.2.tar.gz
tar zxvf linux-5.10.139.tar.gz
※このように各カーネルツリーのディレクトリが配置されます。
/usr/src/kernels
┣linux-5.10.139
┗linux-5.10.2
5. カーネル設定ファイルの入手
カーネルやカーネルモジュールをビルドする際には、どのような設定(詳細な機能のオン/オフなど)でビルドするかを定義した設定ファイル(.configファイル)を
ソースツリーのトップレベルに配置すると、ビルドのためのコマンド(make)を実行した際に読み込まれます。
.configファイルは自分で作成するのではなく、CE-Installerで使用されている設定をコピーしてきましょう。
具体的には、CE-Installerを何らかの環境で起動して、そこから持ってきます。「起動」と書きましたが、インストーラーメニューまでたどり着かなくても大丈夫です。Shellが立ち上がればいいので、起動する環境は物理マシンでも、Hyper-VやVirtualBox、その他の仮想マシンでも構いませんし、CPU・メモリ・ディスク等はCEの稼働要件を満たしていなくても大丈夫です。
USBメモリ経由でもSCPでもSFTPでも構いませんので、とにかく /proc/config.gz をコピーして、ビルド環境に持ってきてください。
6. カーネル設定ファイルの展開と配置
config.gzファイルはGZIP形式で圧縮されていますので展開します。
展開後のファイル名は config となっていますので、".config"(あたまにドットを付ける)にリネームし、/usr/src/linux-5.10.2 ディレクトリにコピーします。
gunzip config.gz
mv config .config
cp .config /usr/src/kernels/linux-5.10.2/

バックポート

7. 新しいバージョンのIGCカーネルモジュールのバックポート
バックポートとはいっても、今回は新バージョンのソースツリーから、旧バージョンのソースツリーへ、単純にファイルコピーするだけです。
まず、既存のファイルをバックアップ&待避します。
cd /usr/src/kernels/linux-5.10.2
mv drivers/net/ethernet/intel/igc drivers/net/ethernet/intel/igc.bk
mv drivers/pci/pci.h drivers/pci/pci.h.bk
mv include/linux/pci.h include/linux/pci.h.bk

次に、新バージョンのソースツリーからファイルをコピーします。
cp -a ../linux-5.10.139/drivers/net/ethernet/intel/igc drivers/net/ethernet/intel/igc
cp ../linux-5.10.139/drivers/pci/pci.h drivers/pci/pci.h
cp ../linux-5.10.139/include/linux/pci.h include/linux/pci.h

カーネルモジュールのビルド

いよいよ、カーネルモジュールをビルドします。
今回は、カーネル全体は必要ありませんので、IGCカーネルモジュールのみをビルドしましょう。

8.IGCカーネルモジュールのビルド
カーネルモジュールのみをビルドする準備をします。
make modules_prepare

指定したディレクトリのカーネルモジュールのみをビルドします。警告は出ますがigc.koのビルドさえ成功すれば無視してOK。↓の画像参照。
make M=drivers/net/ethernet/intel/igc

ビルドされたカーネルモジュールはソースと同じディレクトリに置かれますので、作成されたかどうか確認します。
ls -l drivers/net/ethernet/intel/igc/igc.ko

ビルドしたカーネルモジュールのロード

9. igc.ko のコピー
igc.koをUSBメモリ経由で、インストーラーが途中で止まってしまったCE-Installerに持ってきましょう。USBメモリのマウントやファイルコピーの操作は省略します。

★以下はCE-Installer(Pheonix)上での操作です。

10. 既存の正常動作していないigcカーネルモジュールのアンロード
rmmod igc

11.新しいigc.koのロード(引数は実際のigc.koのパスを指定)
insmod igc.ko

dmesg コマンドや ip a コマンドでNICが認識されたかどうかを確認しましょう。

インストーラーの再実行

12.USBメモリのアンマウント
igc.koファイルのコピーに使用したUSBメモリは必ずアンマウントしましょう。
umount <デバイスファイル or マウントポイント>

13. インストーラーの再実行(UI起動の再試行)
./ce_installer && screen -r

インストールさえ終わってしまえば、あとは通常どおりにCE 2.0が利用可能となるはずです。

以上です。

Nutanix or ヤギ のことををつぶやきます。