はじめに
こんにちは。サービスイノベーション部に所属しております。普段の業務では機械学習を用いたマーケティング効率化に取り組んでいます。 訴求効果の高いユーザを推定するためにTransformerを使った独自の機械学習モデルを使っています。 Transformerベースなのでエンコーダ学習とデコーダ学習の2回必要で、クラウドを使うとなると結構お金がかかるのでオンプレのGPUサーバを使っています。
GPUサーバを運用しているとNvidiaドライバなどのソフトウェアスタックをアップデートすることがありますが、罠にはまったのでその体験談(トラブルシューティング)をご紹介します。同じ罠にはまらないように参考になれば幸いです。
事象
sudo ubuntu-drivers autoinstallでNvidiaドライバを更新後、サーバを再起動するとサーバにSSH接続できなくなりました。(ネットワークにつながらない)
前提
- オンプレのGPUサーバ(Ubuntu20.04)を利用しています。
- サーバのキッティングはメーカ側で実施してもらったため、ハードウェア/ソフトウェア構成への知見がなかったです。
トラブルシューティング
サーバにSSH接続できないのでIPMIからサーバに接続して原因究明&復旧作業を実施しました。以下の作業はIPMIのVGAコンソールから実施しました。
ネットワーク設定確認
- IPアドレスの確認
ip a | grep 192.168.xxx.yyyでIPアドレス(固定IP)を確認したが表示されない。
→何らかの問題でIPアドレスが付与されていない(ネットワークインターフェースが設定されていない)と判断しました。
/etc/netplanの確認- Ubuntu20.04はnetplanでネットワーク設定を管理しているようなので
/etc/netplan配下のファイルを確認しました。 /etc/netplan/01-netcfg.yamlを確認するとIPアドレス(192.168.xxx.yyy)が割り当てられたネットワークインターフェースens8f0np0が記載されているが、ip aコマンドではそのようなインターフェースが表示されなかったです。
→何らかの問題で
ens8f0np0が認識されていないと判断しました。- Ubuntu20.04はnetplanでネットワーク設定を管理しているようなので
systemd-networkdの再起動sudo systemctl restart systemd-networkdを実行してサービスを再起動しましたが変化はありませんでした。
ip link setでのインターフェースの設定- ダメもとで
sudo ip link set ens8f0np0 upを実行してみましたが変化はありませんでした。
→ここまでの試行錯誤の結果、そもそもNICのドライバーが読み込まれていないのではと考えました。
- ダメもとで
NIC確認
- 接続されているNICの確認
lspci | grep Etherやlspci | grep Networkといったコマンドを実行してサーバに接続されているNICを確認しました。Intel Corporation I350 Gigabit Network ConnectionとBroadcom Inc. and subsidiaries BCM57416 NetXtreme-E Dual-Media 10G RDMA Ethernet Controllerが表示されたのでIntelとBroadcomのNICが接続されています。
- 利用しているNICの確認
- IntelとBroadcomのNICのどれに
192.168.xxx.yyyが割り振られていたか確認しました。(普通に考えると10GEのBroadcomの方になるが念のため。。) eno1やens8f0np0といったインターフェース名はPredictable Network Interface Namesに従っていて、enoはオンボード、ensで始まるものはPCI Expressスロットに接続するものとなっているようです。
→
ens8f0np0はPCI Expressスロット接続のものなのでBroadcomのNICを使っていたと判断しました。(eno1は認識されている&IntelのNICはオンボードで使われることが多いのでオンボード接続されている方がIntelのNICと判断) - IntelとBroadcomのNICのどれに
Broadcom BCM5741ドライバ再インストール
ここまでの試行錯誤の結果、Nvidia driverアップデートを期にBroadcomのドライバが消えてしまったと推察されます。
手動でビルドしたドライバがカーネルアップデートによって読み込まれない状態になったと推察して再ビルトを試みましたが、ドライバを手動でビルドした形跡がありませんでした(ドライバのソースnetxtreme-bnxt_en-x.y.x.tar.gzが見当たらない&ビルドに必要なパッケージがインストールされていない)。そこでそもそも古いバージョンのカーネルはどうなっていたか確認しました。
古いバージョンのカーネルでのBroadcomドライバの確認
find /lib/modules -name "bnxt_en*"を実行すると古いバージョンのカーネル全てでbnxt_en.so(Broadcom BCM5741ドライバ)が見つかりました。
→もともとUbuntu標準のパッケージで
bnxt_en.soが提供されていたと判断しました。Ubuntuパッケージ検索でドライバが含まれるパッケージの検索
- Ubuntuパッケージ検索で検索すると
linux-modules-extra-<kernel-version>-genericのパッケージにbnxt_en.soが含まれていることが分かりました。
- Ubuntuパッケージ検索で検索すると
linux-modules-extra-<kernel-version>-genericのインストール状況確認sudo apt list --installedを実行すると古いバージョンのカーネルに関しては対応するlinux-modules-extra-<kernel-version>-genericが見つかりますが、現在利用しているバージョンのカーネルに関しては見つからないです。
→現在利用しているバージョンのカーネルに対応する
linux-modules-extra-<kernel-version>-genericをインストールすればよいと言えます。古いバージョンのカーネルでの起動&ドライバ再インストール
- 今のままではネットワークにつながらないので古いバージョンのカーネルで再起動して(ネットワークにつながる状態で)パッケージをインストールします。
- サーバ起動時にはGRUBメニューが表示されないので以下の手順に従ってGRUBメニューを表示して、古いバージョンのカーネルで起動します。
- サーバ再起動中にESCキーを連打するとGRUBコンソール画面が表示される
normalを入力してENTERキーを押下後すぐにESCキーを1回押すとGRUBメニューが表示される- GRUBメニューのadvanced optionsを選択してENTERを押し、表示されたカーネルの中から任意の古いバージョンのカーネルを選択する
sudo apt install linux-modules-extra-5.4.0-193-genericで最新のカーネルに対応するlinux-modules-extra-<kernel-version>-genericをインストールして再起動します(今回は5.4.0-193が該当)
→再起動後、最新のカーネルで無事にネットワークに接続できました
linux-modules-extra-<kernel-version>-genericがインストールされない原因の調査
そもそもなぜlinux-modules-extra-<kernel-version>-genericがインストールされていない状態になっていたのか調べました。
/var/log/apt/以下のaptのログを確認するとsudo ubuntu-drivers autoinstallに相当するログの部分でNvidiaドライバのインストールとともに最新のカーネルをインストールしようとしていますが、対応するlinux-modules-extra-<kernel-version>-genericはインストールされないようです。
(なぜそのような動作になるのかは不明。。)
まとめ
sudo ubuntu-drivers autoinstallによってカーネルは最新化されるが対応するlinux-modules-extra-<kernel-version>-genericはインストールされないので、再起動するとNICのドライバが読み込まれない状態になりネットワーク不通となりました。
色々と調べてみるとsudo ubuntu-drivers autoinstallはもはや非推奨なようで
ubuntu-drivers autoinstall --helpを実行するとDeprecated, please use "install" insteadと表示されます。
アップデート手順は日々更新されていくので最新状況をキャッチアップするようにしたいですし、 トラブルが起きた時に慌てず対応できるように手順を整理したいと思いました。
類似事例
sudo ubuntu-drivers autoinstallを起因としてドライバが読み込まれない状態になった事例は他でもあるので注意が必要です。autoinstallはすでに非推奨なので別の手段を利用した方がよいですね。
- Linux mint の有線Lanが認識しなくなった(スタンドアローンなPCにRealtek RTL8125 2.5GbEのドライバをダウンロードした話)
- スタンドアローン状態のUbuntuにネットワークドライバをインストールする方法
- Ubuntu22.04 + RTX3060環境 にNvidia ドライバをインストールしたときのメモ
- Network adapter stopped working because of purge nvidia + ubuntu-drivers install
- Ethernet and sound gone after running "ubuntu-drivers autoinstall"