Material Book of Statistics

統計、機械学習、プログラミングなどで実験的な試みを書いていきます。

Linuxカーネル4.15.0-48-genericでe1000eが認識できなくなる問題に対処した

要約

  1. Linuxカーネル4.15.0-48-genericにアップグレードしたらNICドライバe1000eを認識しなくなった
  2. 4.15.0-48-genericのままでe1000eをsudo make installで入れ直そうとするとgccがエラーを吐いて止まる
  3. カーネル4.15.0-48-genericから4.15.0-47-genericにダウングレードしたらe1000eを正常に再インストールできた

はじめに

メインで使っているUbuntu18.04でapt upgradeした後に再起動したら、NICが認識しなくなりました。
NICのドライバが書き換わったと考えて、りゅーたさんの記事「Ubuntu 18.04 で通信が使えない問題の対応」を参考にしてsudo make installしたところ

You are building kernel with non-retpoline compiler, please update your compiler..

なるエラーが出て失敗しました。
なので、gccのバージョンの問題を疑って、ダウングレードしたものの、全然直らない。
/var/log/apt/history.logを確認したところ、gccもアップグレードされていましたが、linuxカーネルも一緒にアップグレードされていたことに気付きました。
そこで、Linuxカーネルを4.15.0-48から4.15.0-47にダウングレードしたところe1000eをインストールすることができました。
今回は上記の問題を対処した方法について紹介します。

作業手順

カーネルのダウングレード方法はkumquat512さんのubuntu18.04でカーネルのダウングレードにある手順をそのまま実行しました。
そのため、以下で紹介する手順のほとんどを上記ブログから引用していますが、次の3点は私が変更を加えています。

ubuntu18.04でカーネルのダウングレードからの変更点

  1. カーネルのバージョンを今回ダウングレードするバージョンに変更
  2. 5番の「grub-customizerでインストールした「4.15.0-23-generic」を設定」が分かりづらかったので、私が行った設定を記載した
  3. 最後にe1000eのビルド手順を追加

カーネルをダウングレードする手順

  1. 現在のカーネルバージョンを確認
$ uname -r
4.15.0-48-generic
  1. ダウングレードするカーネルを検索
sudo apt-cache search linux-image | grep "4.15.0-47"
sudo apt-cache search linux-headers | grep "4.15.0-47"
sudo apt-cache search linux-modules-extra | grep "4.15.0-47"
  1. カーネルをインストール
sudo apt install linux-image-4.15.0-47-generic linux-headers-4.15.0-47 linux-modules-extra-4.15.0-47
  1. grub-customizerをインストール
sudo add-apt-repository ppa:danielrichter2007/grub-customizer
sudo apt-get update
sudo apt-get install grub-customizer
  1. ターミナルでgrub-customizerを実行して4.15.0-47-genericを起動OS選択画面の一番上に持ってくる

  2. /etc/apt/preferences.d/linux-kernelを設定
    勝手にカーネルがアップデートされないようにするため

Package: linux-generic
Pin: version 4.15.0-47*
Pin-Priority: 1001

Package: linux-headers-generic
Pin: version 4.15.0-47*
Pin-Priority: 1001

Package: linux-image-generic
Pin: version 4.15.0-47*
Pin-Priority: 1001
  1. 再起動 sudo reboot

  2. カーネルを確認して4.15.0-47-genericになっていることを確認

$ uname -r
4.15.0-47-generic
  1. e1000eをビルドする
cd ~/e1000e-3.4.2.1/src
sudo modprobe -r e1000e
sudo make install
sudo modprobe e1000e
sudo update-initramfs -u -k $(uname -r)

終わりに

gccの問題ではないという事に気付くまでに時間が掛かりました。
これが同じ問題で困っている方の助けになれば幸いです。