⏱この記事を読むのに必要な時間は約 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)ベースなので、↑のエラーメッセージを元に検索してみました。
それらしいものとしては↓の各スレッド。
- kernel.org – [5.10,1/2] commit 1d71eb53e451 (“Revert “PCI: Make pci_enable_ptm() private””)
- CentOS – cannot use network interface card intel I225-V
- AlmaLinux – 0000198: Intel(R) 2.5G Ethernet Linux Driver (IGC) will not load properly
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が利用可能となるはずです。
以上です。