NTTドコモR&Dの技術ブログです。

Nvidiaドライバをアップデートするとネットワークにつながらなくなる話

はじめに

こんにちは。サービスイノベーション部に所属しております。普段の業務では機械学習を用いたマーケティング効率化に取り組んでいます。 訴求効果の高いユーザを推定するためにTransformerを使った独自の機械学習モデルを使っています。 Transformerベースなのでエンコーダ学習とデコーダ学習の2回必要で、クラウドを使うとなると結構お金がかかるのでオンプレのGPUサーバを使っています。

GPUサーバを運用しているとNvidiaドライバなどのソフトウェアスタックをアップデートすることがありますが、罠にはまったのでその体験談(トラブルシューティング)をご紹介します。同じ罠にはまらないように参考になれば幸いです。

事象

sudo ubuntu-drivers autoinstallでNvidiaドライバを更新後、サーバを再起動するとサーバにSSH接続できなくなりました。(ネットワークにつながらない)

前提

  • オンプレのGPUサーバ(Ubuntu20.04)を利用しています。
  • サーバのキッティングはメーカ側で実施してもらったため、ハードウェア/ソフトウェア構成への知見がなかったです。

トラブルシューティング

サーバにSSH接続できないのでIPMIからサーバに接続して原因究明&復旧作業を実施しました。以下の作業はIPMIのVGAコンソールから実施しました。

ネットワーク設定確認

  1. IPアドレスの確認
    • ip a | grep 192.168.xxx.yyyでIPアドレス(固定IP)を確認したが表示されない。

    →何らかの問題でIPアドレスが付与されていない(ネットワークインターフェースが設定されていない)と判断しました。

  2. /etc/netplanの確認

    • Ubuntu20.04はnetplanでネットワーク設定を管理しているようなので/etc/netplan配下のファイルを確認しました。
    • /etc/netplan/01-netcfg.yamlを確認するとIPアドレス(192.168.xxx.yyy)が割り当てられたネットワークインターフェースens8f0np0が記載されているが、ip aコマンドではそのようなインターフェースが表示されなかったです。

    →何らかの問題でens8f0np0が認識されていないと判断しました。

  3. systemd-networkdの再起動

    • sudo systemctl restart systemd-networkdを実行してサービスを再起動しましたが変化はありませんでした。
  4. ip link setでのインターフェースの設定
    • ダメもとでsudo ip link set ens8f0np0 upを実行してみましたが変化はありませんでした。

    →ここまでの試行錯誤の結果、そもそもNICのドライバーが読み込まれていないのではと考えました。

NIC確認

  1. 接続されているNICの確認
    • lspci | grep Etherlspci | grep Networkといったコマンドを実行してサーバに接続されているNICを確認しました。
    • Intel Corporation I350 Gigabit Network ConnectionBroadcom Inc. and subsidiaries BCM57416 NetXtreme-E Dual-Media 10G RDMA Ethernet Controllerが表示されたのでIntelとBroadcomのNICが接続されています。
  2. 利用しているNICの確認

    ens8f0np0はPCI Expressスロット接続のものなのでBroadcomのNICを使っていたと判断しました。(eno1は認識されている&IntelのNICはオンボードで使われることが多いのでオンボード接続されている方がIntelのNICと判断)

Broadcom BCM5741ドライバ再インストール

ここまでの試行錯誤の結果、Nvidia driverアップデートを期にBroadcomのドライバが消えてしまったと推察されます。 手動でビルドしたドライバがカーネルアップデートによって読み込まれない状態になったと推察して再ビルトを試みましたが、ドライバを手動でビルドした形跡がありませんでした(ドライバのソースnetxtreme-bnxt_en-x.y.x.tar.gzが見当たらない&ビルドに必要なパッケージがインストールされていない)。そこでそもそも古いバージョンのカーネルはどうなっていたか確認しました。

  1. 古いバージョンのカーネルでのBroadcomドライバの確認

    • find /lib/modules -name "bnxt_en*"を実行すると古いバージョンのカーネル全てでbnxt_en.so(Broadcom BCM5741ドライバ)が見つかりました。

    →もともとUbuntu標準のパッケージでbnxt_en.soが提供されていたと判断しました。

  2. Ubuntuパッケージ検索でドライバが含まれるパッケージの検索

    • Ubuntuパッケージ検索で検索するとlinux-modules-extra-<kernel-version>-genericのパッケージにbnxt_en.soが含まれていることが分かりました。
  3. linux-modules-extra-<kernel-version>-genericのインストール状況確認

    • sudo apt list --installedを実行すると古いバージョンのカーネルに関しては対応するlinux-modules-extra-<kernel-version>-genericが見つかりますが、現在利用しているバージョンのカーネルに関しては見つからないです。

    →現在利用しているバージョンのカーネルに対応するlinux-modules-extra-<kernel-version>-genericをインストールすればよいと言えます。

  4. 古いバージョンのカーネルでの起動&ドライバ再インストール

    • 今のままではネットワークにつながらないので古いバージョンのカーネルで再起動して(ネットワークにつながる状態で)パッケージをインストールします。
    • サーバ起動時にはGRUBメニューが表示されないので以下の手順に従ってGRUBメニューを表示して、古いバージョンのカーネルで起動します。
      1. サーバ再起動中にESCキーを連打するとGRUBコンソール画面が表示される
      2. normalを入力してENTERキーを押下後すぐにESCキーを1回押すとGRUBメニューが表示される
      3. 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はすでに非推奨なので別の手段を利用した方がよいですね。