Ubuntu 18.04 で通信が使えない問題の対応
新しく購入した作業用 PC に Ubuntu 18.04 LTS をインストールしたところ、通信が使えなくて非常に苦労しました。
どうにか通信ができるようになるところまで持っていけたので、備忘録として行ったことを残しておきます。
この記事で書いているのは、有線 LAN での接続ができない問題の対応となります。
一応、わたしはこの手順で通信できるようになっていて何も問題は発生していませんが、ドライバのソースをいじったりするので自己責任でお願いしますね。
環境
- OS: Ubuntu 18.04
- Kernel: 4.15.0-22-generic
症状
通信が一切できない。
- 有線 LAN で接続
- LAN の差し込み口のランプは点灯している(ハード的には接続できている)状態
- ドライバのロードに失敗している模様。
dmesg
でNIC のドライバのロードに失敗したかのようなメッセージが確認できる
$ dmesg | grep e1000e
...
e1000e .... The NVM checksum is Not Valid
対処
チェックサムのチェック処理を無効化したドライバをビルドし、インストールする。
上記の通り、チェックサムの不一致でエラーとして弾かれてNIC のドライバがロードできないようでした。
調べてみると、これは Ubuntu 含め Linux では割とよくあることのようで、他の記事でもチェックサムを無効化したドライバのコンパイル、インストールの方法などが記載されています。
ただ、Ubuntu 18.04 になって Linux Kernel が 4.15 に上がったことで 2018年6月3日現在の最新のドライバのコードそのままだとビルド時にエラーが出ます。
—– 2018/09/01 追記 —–
コメントにて情報提供いただきました。2018/08/26 に公開されたドライバ e1000e-3.4.2.1 だと、gcc の古いバージョンを使ったり、コードにパッチを適用したりしなくてもビルドが通るようになりました!
下記手順の 3 の一部と 4 の手順が不要になり、かなり楽になりました。
———————————–
以下に、私が行った手順を具体的に記載しておきます。
手順
- 一時的に通信が使える環境を準備
- ドライバのソースのダウンロード
- make、gcc 4.9 のインストール
- ドライバソースにパッチを適用
- チェックサムのチェック処理を無効化
- ドライバのインストール
1. 一時的に通信が使える環境を準備
上記の通り、これからドライバのソースを少しいじってからビルドするという手順を行うわけですが、通信が使えない状態だとソースコードやコンパイラをダウンロードするといったことさえできません。
というわけで、まずは代替の通信手段を確保します。
ドライバがロードできる Wi-Fi アダプタがあればそれを使うこともできますが、オススメは スマホの USBテザリング です。
スマホと PC を USBで接続し、スマホの設定で USB テザリングを有効にするだけで使えます。これ超便利。
わたしの Android 端末では、「設定」→「無線とネットワーク」→「テザリングとポータブルアクセス…」→「USBテザリング」で設定できました。USBテザリングの機能を持つ端末であれば同じような場所で設定できるかと思います。
2. ドライバのソースのダウンロード
通信が使えるようになったところで、ドライバのソースをダウンロードします。
Intel のドライバのページ からダウンロードしてきます。
わたしがダウンロードしたのは執筆時点で最新の 3.4.0.2 になります。
ダウンロードしたらファイルを適当な場所で解凍しておきます。
1 2 |
$ tar xvzf e1000e-3.4.0.2.tar.gz |
—– 2018/09/01 追記 —–
2018/09/01 時点の最新は e1000e-3.4.2.1 です。このバージョンを使う方が手順が少なくて済みます。
———————————–
3. make、gcc 4.9 のインストール
すでに make が入っていれば問題ありませんが、make コマンドが使えない状態であれば make をインストールします。
1 2 |
$ sudo apt-get install make |
次に、コンパイルするために gcc をインストールするのですが、ここでは gcc 4.9 を使います。
—– 2018/09/01 追記 —–
e1000e-3.4.2.1 を使う場合、apt-get で普通にインストールできる gcc 7.3.0 でもエラーなくビルドできますので、下記手順は不要です。
———————————–
gcc 5 以上でビルドすると、下記のようなエラーが出てしまいます。
1 2 |
Makefile:199: *** *** Aborting the build. *** This driver is not supported on kernel versions older than 2.4.0. 中止. |
Ubuntu 18.04 で sudo apt-get install gcc
でインストールされるのは gcc 7.3.0 だったので、わたしも最初このエラーに悩まされました。
エラーの内容をそのまま解釈すると、Kernel のバージョンが低すぎるということになるのですが、Ubuntu 18.04 で使っている Linux Kernel は 4.15 です。
どうも gcc 5 以上でビルドすると Kernel のバージョンが正しく取得できずにこのエラーが出てしまうそうです。
というわけで、gcc 5 より下のバージョンをインストールするのですが、Makefile で 4.9 から採用されているオプションを使っているので、ここではピンポイントで gcc-4.9 をインストールしてきます。
方法は こちらの投稿 に記載がありました。
1. /etc/apt/sources.list に下記 2行を追記
1 2 3 |
deb http://dk.archive.ubuntu.com/ubuntu/ xenial main deb http://dk.archive.ubuntu.com/ubuntu/ xenial universe |
2. g++-4.9 を指定してインストール
1 2 3 |
$ sudo apt-get update $ sudo apt-get install g++-4.9 |
これで gcc 4.9 はインストールされた状態になりますが、この状態ではまだ gcc コマンドでは標準でインストールした gcc 7.3.0 が使われている状態ですので、
1 2 3 |
$ gcc --version gcc (Ubuntu 7.3.0-16ubuntu3) 7.3.0 |
update-alternatives を使って、gcc 4.9 を gcc コマンドとして使える状態にします。
1 2 3 4 |
$ sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.9 49 $ gcc --version gcc (Ubuntu 4.9.3-13ubuntu2) 4.9.3 |
とりあえずこれでコンパイラの方の準備は OK です。
試しにビルドしてみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
$ cd e1000e-3.4.0.2/src $ sudo make make -C /lib/modules/4.15.0-22-generic/build CC=gcc SUBDIRS=/home/taizo/Downloads/e1000e-3.4.0.2/src modules make[1]: ディレクトリ '/usr/src/linux-headers-4.15.0-22-generic' に入ります CC [M] /home/taizo/Downloads/e1000e-3.4.0.2/src/netdev.o /home/taizo/Downloads/e1000e-3.4.0.2/src/netdev.c: In function ‘e1000_probe’: /home/taizo/Downloads/e1000e-3.4.0.2/src/netdev.c:8344:2: error: implicit declaration of function ‘init_timer’ [-Werror=implicit-function-declaration] init_timer(&adapter->watchdog_timer); ^ /home/taizo/Downloads/e1000e-3.4.0.2/src/netdev.c:8345:35: warning: assignment from incompatible pointer type adapter->watchdog_timer.function = e1000_watchdog; ^ /home/taizo/Downloads/e1000e-3.4.0.2/src/netdev.c:8346:25: error: ‘struct timer_list’ has no member named ‘data’ adapter->watchdog_timer.data = (unsigned long)adapter; ^ /home/taizo/Downloads/e1000e-3.4.0.2/src/netdev.c:8349:35: warning: assignment from incompatible pointer type adapter->phy_info_timer.function = e1000_update_phy_info; ^ /home/taizo/Downloads/e1000e-3.4.0.2/src/netdev.c:8350:25: error: ‘struct timer_list’ has no member named ‘data’ adapter->phy_info_timer.data = (unsigned long)adapter; ^ cc1: some warnings being treated as errors scripts/Makefile.build:332: recipe for target '/home/taizo/Downloads/e1000e-3.4.0.2/src/netdev.o' failed make[2]: *** [/home/taizo/Downloads/e1000e-3.4.0.2/src/netdev.o] Error 1 Makefile:1552: recipe for target '_module_/home/taizo/Downloads/e1000e-3.4.0.2/src' failed make[1]: *** [_module_/home/taizo/Downloads/e1000e-3.4.0.2/src] Error 2 make[1]: ディレクトリ '/usr/src/linux-headers-4.15.0-22-generic' から出ます Makefile:273: recipe for target 'default' failed make: *** [default] Error 2 |
はい、コンパイルエラーになりました。次の手順に進みます。
4. ドライバソースにパッチを適用
—– 2018/09/01 追記 —–
e1000e-3.4.2.1 を使う場合、この手順は不要です。
———————————–
先程のコンパイルエラーですが、調べてみると Linux Kernel が 4.14 から 4.15 に上がったときのタイマ関連の API 変更によるもののようです。
つまり、このドライバのソースはまだ Linux Kernel の 4.15 に対応してなかったみたいでした。
ありがたいことにこの変更に追随したパッチを作成された方がいましたので、そのパッチを適用します。
パッチは こちら の投稿のコメントに添付されています。
ダウンロードした patch ファイルを下記のように e1000e-3.4.0.2 と同じディレクトリに配置し、patch コマンドで適用します。
1 2 3 4 5 6 7 |
$ ls e1000e-3.4.0.2 e1000e-3.4.0.2-timer-updates.patch $ patch -p0 -i e1000e-3.4.0.2-timer-updates.patch patching file e1000e-3.4.0.2/src/ethtool.c patching file e1000e-3.4.0.2/src/netdev.c |
一旦 e1000e-3.4.0.2/src
で make を行い、ビルドができることを確認しておきます。
5. チェックサムのチェック処理を無効化
やっとこさ本題の、チェックサムの無効化処理を適用できます。
e1000e-3.4.0.2/src/nvm.c を gedit などで開き、e1000e_validate_nvm_checksum_generic
関数を return 0;
以外コメントアウトします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
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; } |
6. ドライバのインストール
最後に、ドライバをビルドし、適用します。
下記手順でコマンドを実行し、一旦現在のドライバを無効化、今ビルドしたドライバを使うようにしてみます。
1 2 3 4 |
$ sudo modprobe -r e1000e $ sudo make install $ sudo modprobe e1000e |
USB テザリングを外し、通信ができるか確認してみましょう!
これで通信できるようになっていれば、次回起動時に今ビルドしたドライバ使われるよう、下記コマンドを実行します。
1 2 |
$ sudo update-initramfs -u |
これで完了です!
さいごに
Ubuntu 18.04 がリリースされてから1ヶ月ちょっとなので、少しイキりすぎましたね。
だいぶ情報がなくて苦労しました。
個人的には Ubuntu でも USB テザリングがすごく簡単にできるということが一番発見だったかもしれない。
最後まで読んでいただきありがとうございます。 このブログを「いいな」と感じていただけましたら、Twiter にてフォローいただけるとうれしいです。ブログ更新情報などもお届けします。
Follow @ryuta461
この記事をシェアする
はじめまして、10年前のTX/67DBBをwin7とubuntuで使ってます。
最近、18.04を入れネット接続が出来なく仕方なく Duup StretchをUSB起動して使ってます。
eo100Mなので有線接続ですが無線接続できれば、問題解決できるんですね参考にさせて頂きます。
Ubuntu 16.04 でも同様のコンパイルエラーで悩んでいましたが,
パッチを適用することで無事解決しました.
本当に助かりました.
コメントありがとうございます!
本質的には Ubuntu のバージョンというより使ってるLinux Kernel のバージョンに依存する問題なので、16.04 使っていても Kernel 更新していたら同じ問題にあたりそうですね〜。
とにかく無事解決できたようで良かったです!
Ubuntu 18.04をインストールしたので、こちらを参考にしてNICを使えるようにしました。
ありがとうございます!
私はe1000e-3.4.2.1を使いましたが(9/1現在の最新バージョン)、このバージョンではパッチを当てなくてもビルドできました。
これからUbuntuをインストールする方の参考になりましたら幸いです。
試しにわたしのPCでもe1000e-3.4.2.1 をビルドしてみましたが、このバージョンだと確かにパッチ当てなくてもビルドできますね!
情報ありがとうございます!記事の方にも追記しておきます。
私もubuntu18.04で無線接続できない問題があり、手順通り進めさせていただいたのですが、「sudo make install」の際に「make: *** ターゲット ‘install’ を make するルールがありません. 中止.」というエラーが出ます。
どのような原因がかんがえられるでしょうか・・
Makefile が存在しないディレクトリで make コマンドを実行しようとした時に出るエラーですね。
cd e1000e-3.4.0.2/src で src ディレクトリに移動できているか確認できますでしょうか?
初歩的な質問に答えてくださりありがとうございます。
ご指摘の通り作業しているディレクトリが違ったために起こっていたエラーでした。
しかしながら、無線ネットワークが「ネットワークを探しています」の状態でフリーズ状態となっていたり、ネットワークを選択しても接続できなかったり、何度か再起動すると何事もなく接続できたり、、ご機嫌斜めなようです。
引き続き原因究明をしていきます。
その際に、スマホでのusbテザリングのアイデアを活用させていただいています。
非常に参考になりました。ありがとうございます。
あなたは神です。本当に助かりました。
ubuntuが初めてのlinuxでした。
初心者向けらしいからすぐに使えるようになるんだろうと思っていましたが甘かったです。
usbテザリングを使わずにネット使える他のpcからmakeなんかを揃えようとしましたが結局挫折しました。
結局usbテザリング使ってこちらの手順そのままやったらできました。
記録を残してくれてありがとうございます。「他者への思いやり」を感じることができました。
本当にありがとうございました。
コメントありがとうございます!
お役に立てたようで、良かったです。記事を書いたかいがありました。
ubuntu18.03を入れたのですが有線が出来ず困っています、~/e1000e-3.4.2.1/src$ sudo make install を実行してもMakefile:100: *** Compiler not found. Stop.と出てしまいます。何か解決策はありますでしょうか。
“Compiler not found” とのことなので、gcc がインストールされていないのではないかと思います。
もし gcc コマンドを実行をしても command not found のようなエラーが出るのでしたら、記事中に書いてある “sudo apt-get install gcc” を実行して gcc をインストールして試してみてはいかがでしょうか。