Linux で Intel の 有線 LANが認識しない問題の解決方法(The NVM Checksum Is Not Valid)

# Linux で Intel の 有線 LANが認識しない問題の解決方法 (`The NVM Checksum Is Not Valid` の解決方法)

Intel の 有線 LAN を搭載した PC で Linux を使用しようとした場合以下のように `The NVM Checksum Is Not Valid` のエラーが出て、認識しない場合の解消方法を説明します。

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


## 関連リンク

https://superuser.com/questions/1104537/how-to-repair-the-checksum-of-the-non-volatile-memory-nvm-of-intel-ethernet-co
http://faq3.dospara.co.jp/faq/show/6289?site_domain=default
https://downloadcenter.intel.com/ja/download/29137/

## 解決方法

https://downloadcenter.intel.com/ja/download/29137 の `Preboot.tar.gz` に入っている `bootutil64e` を使用して Ethernet Controller の NVM を初期化する。

## 必要なもの

* `Preboot.tar.gz` をダウンロードできる環境
* USB メモリ 2つ(Linux の Live USB と `Preboot.tar.gz` を入れるための USB メモリ)

## 処理の流れ

1. BIOS で `Secure Boot` を OFF にする。(step 4 の実行に必要)
2. Linux の Live USB のメディアから起動する
3. `Preboot.tar.gz` を解凍する
4. 専用のドライバをインストールする
5. `bootutil64e` を実行して NVM をデフォルト設定に戻す **← すべてはこれを実行するための準備と後処理**
6. PC の電源を切る
7. Live USB のメディアを抜き差しする
8. `Secure Boot` を ON に戻す
9. Linux の Live USB のメディアから起動する
10. Ethernet を認識していることを確認する

### 備考

* NIC のドライバに patch を充てるのではなく、有線 LAN の NVM を再設定するので、一度実行すると OS に関係なく有効です。
* Linux の Live USB のメディアから起動して作業するのは、一時的に署名なしドライバを使用後に署名なしドライバが残らないようにするためです。

## 1. BIOS で Secure Boot を OFF にする

手順はマザーボードに依存します。

## ASRock の場合

1. 電源投入直後に F2 キーをポンポンと押す。
2. `Advanced` を押す。
3. `Security` を押す。
4. `Secure Boot` を押す。
5. `Disabled` に変更する。
6. `Exit` を押す。
7. `Save Change and Exit` を押す。

参考:
https://www.asrock.com/support/index.jp.asp?cat=FindBIOS

## 2. Linux の Live USB のメディアから起動する

手順はマザーボードに依存する。

## ASRock の場合

1. 電源投入直後に F11 キーをポンポンと押す。
2. Live USB のメディアを選択します。
3. `Try Ubuntu without installing` を選んで ENTER を押す

## 3. Preboot.tar.gz を解凍する

USBメモリ に入れた Preboot.tar.gz をコピーして解凍する。

```
ubuntu@ubuntu:~$ tar xvfz Preboot.tar.gz 
APPS/
APPS/BootUtil/
APPS/BootUtil/BootIMG.FLB
APPS/BootUtil/Docs/
APPS/BootUtil/Docs/bootutil.txt
APPS/BootUtil/iv.txt
APPS/BootUtil/Linux32/
APPS/BootUtil/Linux32/bootutil32
APPS/BootUtil/Linux32/DRIVER/
APPS/BootUtil/Linux32/DRIVER/install
APPS/BootUtil/Linux32/DRIVER/iqvlinux-1.2.0.13-0.noarch.rpm
APPS/BootUtil/Linux32/DRIVER/iqvlinux.tar.gz
APPS/BootUtil/Linux32/DRIVER/license_gpl.txt
APPS/BootUtil/Linux_x64/
APPS/BootUtil/Linux_x64/bootutil64e
APPS/BootUtil/Linux_x64/DRIVER/
APPS/BootUtil/Linux_x64/DRIVER/install
APPS/BootUtil/Linux_x64/DRIVER/iqvlinux-1.2.0.13-0.noarch.rpm
APPS/BootUtil/Linux_x64/DRIVER/iqvlinux.tar.gz
APPS/BootUtil/Linux_x64/DRIVER/license_gpl.txt
        以降略
```


## 4. 専用のドライバをインストールする

```
ubuntu@ubuntu:~$ cd APPS/BootUtil/Linux_x64/DRIVER
ubuntu@ubuntu:~/APPS/BootUtil/Linux_x64/DRIVER$ sudo ./install 
Extracting archive..OK!
Compiling the driver...OK!
Skipping removing QV driver - it does not exist...
Copying iqvlinux.ko driver file to /lib/modules directory...OK!
Driver installation verification...Installed!
```

### `Secure Boot` を OFF にしていない場合

`Secure Boot` を OFF にしていない場合以下のエラーになる。

```
ubuntu@ubuntu:~/APPS/BootUtil/Linux_x64/DRIVER$ sudo ./install 
Extracting archive..OK!
Compiling the driver...OK!
Skipping removing QV driver - it does not exist...
Copying iqvlinux.ko driver file to /lib/modules directory...OK!
Driver installation verification...modprobe: ERROR: could not insert 'iqvlinux': Operation not permitted
rmmod: ERROR: Module iqvlinux is not currently loaded
Installed!
```

## 5. bootutil64e を実行して NVM をデフォルト設定に戻す

### bootutil64e に実行権限をつける

```
ubuntu@ubuntu:~/APPS/BootUtil/Linux_x64$ ls -l
total 3460
drwxr-xr-x 3 ubuntu ubuntu     140 Apr 18 13:05 DRIVER
-rw-r--r-- 1 ubuntu ubuntu 3541720 Nov 22 14:42 bootutil64e
ubuntu@ubuntu:~/APPS/BootUtil/Linux_x64$ chmod +x bootutil64e 
ubuntu@ubuntu:~/APPS/BootUtil/Linux_x64$ ls -l
total 3460
drwxr-xr-x 3 ubuntu ubuntu     140 Apr 18 13:05 DRIVER
-rwxr-xr-x 1 ubuntu ubuntu 3541720 Nov 22 14:42 bootutil64e
```

### bootutil64e を引数なしで実行して状態を確認

```
ubuntu@ubuntu:~/APPS/BootUtil/Linux_x64$ sudo ./bootutil64e 

Intel(R) Ethernet Flash Firmware Utility
BootUtil version 1.7.10.10
Copyright (C) 2003-2019 Intel Corporation

Type BootUtil -? for help

Port Network Address Location Series  WOL Flash Firmware                Version
==== =============== ======== ======= === ============================= =======
  1   xxxxxxxxxxxx     0:31.6 Gigabit N/A FLASH Not Present
```

### bootutil64e を実行して NVM をデフォルト状態に設定 (これが核心)


```
ubuntu@ubuntu:~/APPS/BootUtil/Linux_x64$ sudo ./bootutil64e -NIC=1 -DEFAULTCONFIG

Intel(R) Ethernet Flash Firmware Utility
BootUtil version 1.7.10.10
Copyright (C) 2003-2019 Intel Corporation

Setting PXE EEPROM words back to defaults on NIC 1...done

Port Network Address Location Series  WOL Flash Firmware                Version
==== =============== ======== ======= === ============================= =======
  1   xxxxxxxxxxxx     0:31.6 Gigabit N/A FLASH Not Present
```

## 6. PC の電源を切る

いったん PC の電源を切る

## 7. Live USB のメディアを抜き差しする

抜き差ししないと、次に起動したときに認識しないみたいので、抜き差しする。

## 8. Secure Boot を ON に戻す

`1. BIOS で Secure Boot を OFF にする` の手順と同様にして `Secure Boot` を `ON` に戻す

## 9. Linux の Live USB のメディアから起動する

`2. Linux の Live USB のメディアから起動する` と同様にして、Live USB のメディアから起動する

## 10. Ethernet を認識していることを確認する

```
ubuntu@ubuntu:~$ dmesg | grep e1000
[    0.809135] e1000e: Intel(R) PRO/1000 Network Driver - 3.2.6-k
[    0.809135] e1000e: Copyright(c) 1999 - 2015 Intel Corporation.
                     中略
[   21.479526] e1000e: eno1 NIC Link is Up 1000 Mbps Full Duplex, Flow Control: Rx/Tx
```

`ip a` コマンドでも認識できるのを確認できる。ネットワークにも接続できる。