Ubuntu 18.04 で NIC（有線）が認識しない

# 注意）現在 22.04 では違う方法で対処しました
2022-12-18 追記
この記事の方法だと、Kernelが更新される度に対応が必要です。22.04 でも同じ事象が発生していましたが他の方法で対処しました。恒久的な対処なので、そちらの方がオススメです。⇩こちらの記事を参考にさせて頂きました。
https://daimaohsx.dip.jp/wordpress/2022/09/02/when-wired-lan-is-not-recognized-in-ubuntu-22-04/#i-3

# 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)
```

- 以下のサイトからドライバをダウンロード。（WiFiを使うか、他のPCを使ってください）
https://downloadcenter.intel.com/download/15817/Intel-Network-Adapter-Driver-for-PCIe-Intel-Gigabit-Ethernet-Network-Connections-Under-Linux-

```
$ 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 バージョンが上がると、また繋がらなくなるようです。同じ作業を繰り返し、無事つながるようになりました。

### 注意事項２
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
```

以上です。