blog.mahoroi.com

Ubuntu18が有線LANでインターネットに繋がらない

-

Ubuntu 18.04 で有線 LAN を使うとインターネットが使えない問題の解決策備忘録です。

症状

  • LAN ケーブルを LAN ポートに刺してもネットワークに繋がらない
  • USB <-> LAN 変換アダプタを使えばネットワークに繋がる

原因

  • ネットワーク ドライバ(e1000e) が使用している環境に対応していない

解決方法

まずは使用環境を調べます。

$ lspci | grep -i Ethernet
00:1f.6 Ethernet controller: Intel Corporation Ethernet Connection (7) I219-V (rev 10)
$ dmesg | grep -i Intel
[    0.000000]   Intel GenuineIntel
[    0.007263] ACPI: SSDT 0x000000008EA95480 002950 (v02 INTEL  xh_cfsd4 00000000 INTL 20160527)
[    0.007274] ACPI: SSDT 0x000000008EA9AF58 000144 (v02 Intel  ADebTabl 00001000 INTL 20160527)
[    0.007276] ACPI: DMAR 0x000000008EA9B0A0 000070 (v01 INTEL  EDK2     00000002      01000013)
[    0.114611] smpboot: CPU0: Intel(R) Core(TM) i7-9700K CPU @ 3.60GHz (family: 0x6, model: 0x9e, stepping: 0xc)
[    0.114712] Performance Events: PEBS fmt3+, Skylake events, 32-deep LBR, full-width counters, Intel PMU driver.
[    0.737807] intel_idle: MWAIT substates: 0x11142120
[    0.737807] intel_idle: v0.4.1 model 0x9E
[    0.738217] intel_idle: lapic_timer_reliable_states 0xffffffff
[    0.769170] intel_pstate: Intel P-state driver initializing
[    0.769674] intel_pstate: HWP enabled
[    0.790741] intel_pmc_core INT33A1:00:  initialized
[    0.879835] e1000e: Intel(R) PRO/1000 Network Driver - 3.2.6-k
[    0.879836] e1000e: Copyright(c) 1999 - 2015 Intel Corporation.
[   15.073659] snd_hda_intel 0000:00:1f.3: enabling device (0000 -> 0002)
[   15.073913] snd_hda_intel 0000:01:00.1: enabling device (0000 -> 0002)
[   15.073960] snd_hda_intel 0000:01:00.1: Disabling MSI
[   15.073962] snd_hda_intel 0000:01:00.1: Handle vga_switcheroo audio client
[   15.249758] input: HDA Intel PCH Front Mic as /devices/pci0000:00/0000:00:1f.3/sound/card0/input5
[   15.249780] input: HDA Intel PCH Rear Mic as /devices/pci0000:00/0000:00:1f.3/sound/card0/input6
[   15.249801] input: HDA Intel PCH Line as /devices/pci0000:00/0000:00:1f.3/sound/card0/input7
[   15.249820] input: HDA Intel PCH Line Out as /devices/pci0000:00/0000:00:1f.3/sound/card0/input8
[   15.249839] input: HDA Intel PCH Front Headphone as /devices/pci0000:00/0000:00:1f.3/sound/card0/input9
[   18.743721] intel_rapl_common: Found RAPL domain package
[   18.743722] intel_rapl_common: Found RAPL domain core
[   18.743723] intel_rapl_common: Found RAPL domain dram
$ modinfo -F version e1000e
3.2.6-k

Intele1000e というドライバが使われていることが分かりました。

つぎは繋がらない原因を調べます。

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

The NVM Checksum Is Not Valid:サムチェックが合っていないのが原因でした。

この場合はサムチェックを行わないようにドライバを修正することで解決できるそうです。

ドライバの修正・インストール

修正するための e1000e ドライバを Intel 公式ホームページから入手します。今回は 2020 年 11 月時点の最新バージョンである e1000e-3.8.4.tar.gz を Intel 公式ホームページからダウンロードします。

https://downloadcenter.intel.com/download/15817/Intel-Network-Adapter-Driver-for-PCIe-Intel-Gigabit-Ethernet-Network-Connections-Under-Linux-

このとき Ubuntu はインターネットに繋がっていないので、どうにかして(インターネット接続できる端末や USB-LAN 変換アダプタを使って)ダウンロードしたドライバを Ubuntu に持ってきます。

ダウンロードした e1000e-3.8.4.tar.gz を解凍して src に移動。

$ tar zxf e1000e-3.8.4.tar.gz
# README にインストール方法が書かれている
#$ cat e1000e-3.8.4/README
$ cd e1000e-3.8.4/src/

The NVM Checksum Is Not Valid が起きないように nvm.ce1000e_validate_nvm_checksum_generic 関数内の処理をコメントアウトします。

e1000e-3.8.4/src/nvm.c
/**
 *  e1000e_validate_nvm_checksum_generic - Validate EEPROM checksum
 *  @hw: pointer to the HW structure
 *
 *  Calculates the EEPROM checksum by reading/adding each word of the EEPROM
 *  and then verifies that the sum of the EEPROM is equal to 0xBABA.
 **/
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;
}

修正したドライバをインストールします。

# インストール
$ sudo make install
# 旧ドライバのアンロード
$ sudo modprobe -r e1000e
# 修正ドライバのロード
$ sudo modprobe e1000e

バージョンが更新されていることを確認。

$ modinfo -F version e1000e
3.8.4-NAPI

この時点でインターネットへ接続ができるようになります。

$ ping 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=118 time=2.48 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=118 time=2.38 ms

さいごに Ubuntu では修正ドライバをインストールしらた古いバージョンの e1000e を OS がロードしないようにします。

$ sudo update-initramfs -u
update-initramfs: Generating /boot/initrd.img-5.4.0-52-generic

参考