Help us understand the problem. What is going on with this article?

Ubuntu 18.04 で NIC(有線)が認識しない

Ubuntu 18.04 で NIC(有線)が認識しなかった

新しく買ったPC、OS には Ubuntu 18.04 を選択したのですが、OSインストール直後、NIC (有線LAN)がリンクせず。InetlのNICでよくあることのようなのですが、解決に手こずったのでここにまとめます。

環境

PC: デスクトップ、オンボードNIC
UEFI Secure boot: Enable
OS: Ubuntu 18.04.3 LTS (日本語Remixのisoを使用)
NIC: Intel Corporation Ethernet Connection (7) I219-V (rev 10)

事象

OSインストール後に、有線LANがリンクしていなかった。

対処

参考にしたサイト

https://qiita.com/hatt0519/items/06ac708f08d9570f2b93
https://blog.spiralray.net/archives/474
このサイトの情報でほぼほぼ解決できるのですが、2020年 3月版 8月版と捉えて頂ければと思います。加えて、自分の環境では Secure boot に邪魔されたりダウンロードしたドライバが古かったりしたので、その情報も付記しておきます。

対応:ドライバのダウンロードとビルド

  • 後で出てきますが、UEFI(BIOS) の Secure boot が有効になっていると、エラーで進めなくなります。差し支えなければ、無効にしておいてください。差し支えあって無効にできない人は、この記事の対応方法は使えないかもしれません。

  • Ubuntu 18.04 インストール直後の状態では、ビルドの環境がインストールされていませんでした。なので、インストール。

$ sudo apt install make
$ sudo apt install gcc
  • NICの種類を確認。ここで、Intel I219 であることが確認できます。
$ lspci | grep Ethernet
00:1f.6 Ethernet controller: Intel Corporation Ethernet Connection (7) I219-V (rev 10)
$ tar zxvf e1000e-3.8.4.tar.gz
$ cd e1000e-3.8.4/src/
  • ここで、大事なことのですが、このままビルドしても、Checksum エラーで引っかかります。ソースコード ./e1000e-3.8.4/src/nvm.c を一部修正しました。before / after で掲載します。

ビフォー:

s32 e1000e_validate_nvm_checksum_generic(struct e1000_hw *hw)
{
        s32 ret_val;
        u16 checksum = 0;
        u16 i, nvm_data;

        for (i = 0; i < (NVM_CHECKSUM_REG + 1); i++) {
                ret_val = e1000_read_nvm(hw, i, 1, &nvm_data);
                if (ret_val) {
                        e_dbg("NVM Read Error\n"); 
                        return ret_val;
                }       
                checksum += nvm_data;
        }       

        if (checksum != (u16)NVM_SUM) {
                e_dbg("NVM Checksum Invalid\n");
                return -E1000_ERR_NVM;
        }       

        return 0;
}

アフター:

s32 e1000e_validate_nvm_checksum_generic(struct e1000_hw *hw)
{
        return 0;
} 
  • ビルドします。
$ sudo make install
  • カーネルモジュール追加。うまくいっていれば、ここでNICがリンクするはずです。
$ sudo modprobe -r e1000e
$ sudo modprobe e1000e
  • ログを確認。
$ dmesg | grep -i e1000
[607632.855520] e1000e: Intel(R) PRO/1000 Network Driver - 3.8.4-NAPI
[607632.855521] e1000e: Copyright(c) 1999 - 2020 Intel Corporation.
[607632.855755] e1000e 0000:00:1f.6: Interrupt Throttling Rate (ints/sec) set to dynamic conservative mode
[607633.094032] e1000e 0000:00:1f.6 0000:00:1f.6 (uninitialized): registered PHC clock
[607633.177267] e1000e 0000:00:1f.6 eth0: (PCI Express:2.5GT/s:Width x1) a8:a1:59:06:1f:4b
[607633.177269] e1000e 0000:00:1f.6 eth0: Intel(R) PRO/1000 Network Connection
[607633.178692] e1000e 0000:00:1f.6 eth0: MAC: 13, PHY: 12, PBA No: FFFFFF-0FF
[607633.179250] e1000e 0000:00:1f.6 eno1: renamed from eth0
  • ただし、このままPCを再起動すると、古いドライバが読み込まれてしまうので、新しいドライバが読み込まれるように固定化します。
$ sudo update-initramfs -u

注意事項

$ sudo apt upgrade して kernel バージョンが上がると、また繋がらなくなるようです。同じ作業を繰り返し、無事つながるようになりました。

注意事項2

Kernel バージョンが 5.4.0-42 に上がった際、以下のエラーでインストールが失敗するようになりました。NICドライバーのバージョンを、3.6.0 から 3.8.4 に変更することで解決しました。(記事修正済み)

/home/mitsuo/scripts/install-nic-driver/e1000e-3.6.0/src/kcompat.h:2799:10: fatal error: linux/pci-aspm.h: そのようなファイルやディレクトリはありません
 #include <linux/pci-aspm.h>
          ^~~~~~~~~~~~~~~~~~

エラー、失敗集

うまくいった人、ここから先は読まなくていいと思います。

古いドライバをダウンロードして失敗

あるサイトの記事に記載されていたリンクを辿ってそのままドライバをダウンロードしたらバージョンが古くてこんなエラーに見舞われました。カーネルが新しくてドライバが古いのでダメよ、と。

$ sudo make install
[sudo] mitsuo のパスワード: 
cc1: error: code model kernel does not support PIC mode
/bin/sh: 1: [: -ge: unexpected operator
Makefile:199: *** *** Aborting the build. *** This driver is not supported on kernel versions older than 2.4.0.  中止.

Secure boot に邪魔をされる

これがEnable だと、$ sudo modprobe の段階でエラーになります。

$ sudo modprobe -r e1000e
$ sudo modprobe e1000e
modprobe: ERROR: could not insert 'e1000e': Operation not permitted
$ dmesg | grep -i secure
[    0.000000] secureboot: Secure boot enabled
[    0.000000] Kernel is locked down from EFI secure boot; see man kernel_lockdown.7
[    1.601384] sdhci: Secure Digital Host Controller Interface driver

Checksumで引っかかる

本文にも書いたとおり、Checksum をバイパスするように修正しないと、エラーになります。その時のログを掲載。

$ dmesg | grep e1000
[  842.476238] e1000e: loading out-of-tree module taints kernel.
[  842.476348] e1000e: module verification failed: signature and/or required key missing - tainting kernel
[  842.477102] e1000e: Intel(R) PRO/1000 Network Driver - 3.6.0-NAPI
[  842.477102] e1000e: Copyright(c) 1999 - 2019 Intel Corporation.
[  842.477336] e1000e 0000:00:1f.6: Interrupt Throttling Rate (ints/sec) set to dynamic conservative mode
[  842.727548] e1000e 0000:00:1f.6: The NVM Checksum Is Not Valid
[  842.776744] e1000e: probe of 0000:00:1f.6 failed with error -5

PC再起動で、古いドライバが読み込まれる。

3.6.0 をインストールしたはずなのに、3.2.6 が読み込まれてしまっています。 $ sudo update-initramfs -u これをやっていないとこうなります。

$ dmesg | grep e1000
[    1.619844] e1000e: Intel(R) PRO/1000 Network Driver - 3.2.6-k
[    1.619844] e1000e: Copyright(c) 1999 - 2015 Intel Corporation.
[    1.620309] e1000e 0000:00:1f.6: Interrupt Throttling Rate (ints/sec) set to dynamic conservative mode
[    1.828256] e1000e 0000:00:1f.6: The NVM Checksum Is Not Valid
[    1.873620] e1000e: probe of 0000:00:1f.6 failed with error -5

以上です。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away