実はネタそのものはこことほとんど変わっていませんが手順によっていろいろと大変なことが分かったので書いてみたいと思います。ちなみに今現在使用しているFedoraのサーバーではLANのアダプタがr8168ではないのですがそれはそれ、これはこれ。一応最小限のFedora23が入っている状態を仮定して始めていきます。
手順そのものは「難しくない」
あくまで「はまらなければ」という条件付きで。Kernel4.2系であればこの記事を書いている段階での最新ドライバ(8.041.00)でdkmsを使わなければコードを変更することなくコンパイルできますので。ただいくつか手順をミスすると混乱するよな~と言うところです。一応以下のコマンドはすべてrootかもしくはsudoで管理者権限により発行されるものとします。
まずはドライバをビルドするための開発環境のインストールから
そういえばこの部分を書いていなかったな~と言うところから。ドライバを作成するためには開発環境が必要になります。それのインストールの話から。r8168の場合はほとんどの場合誤っているドライバとしてr8169がインストールされているので通信はできるはずです。なのでdnf経由でインストールします。私の場合は個別インストールで必要なものを追加していくのですが、面倒な場合は
# dnf group install "C Development Tools and Libraries" "Development Tools"
で一括インストールできます。注意点としてはこれでインストールするとkernelの開発環境がなぜかデバッグバージョンで入ってしまう(kernel-debug-develが入る)のでこれだけだとドライバをビルドすることができません。そのため、これをインストールした後で
# dnf erase kernel-debug-devel # dnf install kernel-devel
としてデバッグ版の開発環境を削除しておくのが安全でしょう。なお、ここではいるkernel-develは最新のkernelのものなのでインストール直後などkernelの更新が行われていない場合は現行のバージョンとは異なるものがインストールされます。そのため、ビルドを行う前にkernelを最新のものに入れ替えて再起動をするのが良いと思います。でないとunameでkernelを参照する部分でバージョン違いとなって面倒なことになります。
r8168のドライバをダウンロード
これはrealtekのページから最新のドライバをダウンロードして入れておきます。サーバー側でwgetやw3m経由でできなくもないですが難しいようならブラウザがついている別のマシンでダウンロードしてUSBメモリで受け渡すのもありだと思います。まあ、USBメモリの場合は認識チェック(dmesg)とマウント処理(mount)があるのでそちらも面倒と言えば面倒。最後に来るのはサーバーにデスクトップ環境をいれてブラウザ経由で、ですか。
ダウンロードしたドライバファイルはいったん/usr/local/srcなど適当な場所におくのがいいとおもいます。なお、本当に最小限のインストールにした場合ドライバを解凍するためのbzip2すら入っていないらしく、こちらもdnf経由でインストールしておかないとまずいです。というわけで、
# dnf install bzip2
をしておきましょう。あとはtarコマンドでアーカイブを展開してOKと。
ドライバをビルドしてみる
やっとドライバのビルドです。解凍するとr8168-8.041.00のようなディレクトリができますのでその中で作業をします。ビルドの方法はいくつかありますがいきなりautorun.shを起動させるのはやめた方がいいと思います。理由はもしr8168がビルドできない場合インストール処理の前にr8169ドライバを(一度)無効にする処理をやってしまうため通信ができなくなってしまうためです。そうなるとdnfは使えないので再起動する羽目に・・・。
で、インストールですが、普通に
# make clean # make
としてドライバがビルドできることを確認します。普通ならエラー無くinsmodやdepmodまで行くはずです。管理者権限がない場合はdepmod等が失敗しますので気をつけて。で、この後に通常ならmake installをするのですが、どうせなのでautorun.shを使ってあげます。ビルドが成功することが分かれば
# ./autorun.sh
でドライバを入れてみて下さい。うまくいけば通信のアダプタは存在する状態でlsmodで応答するドライバがr8169からr8168に変化しているはずです。一応ping等で通信ができることも確認しておけばさらに安心。
最後にr8169をblacklistに送り込む
これが最終作業。上記のインストールだけだと再起動時にr8168とr8169が同時に読み込まれてしまうのでr8169側を無効化する必要があります。これにはblacklistを用いてドライバを無効にするのがいいと思います。ちなみにこれとこれに書いてあるものを引っ張ってきているだけです。がとりあえず書いてみます。
blacklist.confの作成
対象は/etc/modprobe.d/blacklist.confです。初期状態ではディレクトリまではあってもファイルはないはずなのでviなどでさくっと作っちゃいましょう。内容は
# Disable r8169 driver blacklist r8169
とすればOKかな。confファイルでは#はコメントを意味するので実効はblacklistの指示だけです。
grubのブートオプションの変更
こちらにも手を入れておきます。手順を再度この記事で書いておくと
- rootへ昇格 or 以降のコマンドをsudoで実行
- /etc/sysconfig/grubをエディタで開く(vi /etc/sysconfig/grub)
- “GRUB_CMDLINE_LINUX=”となっている行を探して、”rd.driver.blacklist=r8169″というコマンドライン引数を「追加」する
- grub2-mkconfig -o /boot/grub2/grub.cfg でgrubを更新
ですね。これをやって初めてr8168だけが認識されるようになります。
後はdkmsによるkernel更新時の自動更新の設定ですが・・・
こちらは面倒なので(え?)こちらやこちらを参考に頑張ってみて下さい。8.041.00でもやはり(その部分の)Makefileの書き換えは必要なので。Makefileがどういう構造になっているかを比べれば修正方法は見えてくると思います。あとは無理矢理kernelのアップデートを避け続ける、という方法もないわけではないですがそれが許されるのはテストサーバーだけでしょうしdnfを使っているとたいていうっかりと更新して再起動してしまい有線が動かない、という現象を起こすとおもいますので。