はじめに
こんにちは。サービスイノベーション部に所属しております。普段の業務では機械学習を用いたマーケティング効率化に取り組んでいます。 訴求効果の高いユーザを推定するために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"