というわけで、この時についていたPCIのLANカードを外して、AtomマザーにのっているLANチップ側を使うようにしてみました。
と言うのも理由があったからなのですが・・・。
telnet-serverへの接続時に文字表示が乱れる
そもそもの起こりがこれです。LAN内部なのでWindows側からTeraTermにてTelnet接続で操作するのが私のやり方なのですが、
さすがにまともに表示されないのでは使いようがないわけですね。この現象を解決できた人がいましたら是非連絡を。
結局は解決できなかったのですが、これの原因のような現象としてLANドライバの更新を行いました。
というのも、正しいはずのR8169側もなぜかFrameDroppedが
Atomマザーに実装されているLANチップはR8168であることはあらかじめ分かっていたので使わないようにして
PCIスロットにR8169で正常に動くはずのチップを積んだLANカードを挿して使っていました。
チップ自体はPCI+GbEの時代に低価格品でよく使われていた(と思われる)RTL8169S-32というものです。
手元には3枚のPCI GbEカードがあるのですが、すべて同じチップでした。
まあ、それはさておき。
そのチップで気になったのでifconfigから状態を見てみると
RX側にFrameDroppedが記録されていて・・・いやな予感がしたので何とかしてみることにしました。
元となる資料を再検索
前に同じようなことをやったわけですが、前回はkernelの更新を行うとドライバが自動更新されない、と言う状態だったので
自動更新まで行うように設定するようにしました。
参考にしたのは
CentOSにNICを手動インストールした人は、正しいドライバが入っているかチェックしたほうがよさげ – akiyan.com
カーネル・アップデート後も r8168 ドライバを使うには-2 – metastable blog
です。この二つを元にFedora18用の動作を書き加えます。
まずはドライバをダウンロード
Realtekのドライバのページから最新のドライバをダウンロードします。
今回使ったのは8.035.00です。新しくなっている分だけ作業が違いますので注意です。
対象は「LINUX driver for kernel 3.x and 2.6.x and 2.4.x」ですね。
R8169を無効化する
ここからはネットワークが基本的に使えない物として行います。コンソールから頑張ってください。
まずはR8169がロードされているか調べます。
# lsmod | grep r8169
引っかかったらロードされていますので削除します。
# rmmod r8169 # updatedb
以降ロードされないように/etc/modprobe.d/blacklist.confに追記を行います。
たぶんrmmodがなくてもこのリストに記述するだけでロードされなくなるような気はしますが・・・。
# Disable r8169 driver blacklist r8169
最後に再起動です。
# reboot
R8168をとりあえずインストール
ドライバファイルを解凍し、インストールします。(以降ドライバのバージョンを8.035.00とします。違うときは読み替えてください。)
# tar -xjf r8168-8.035.00.tar.bz2 # cd r8168-8.035.00 # make clean modules # make install # depmod -a # insmod ./src/r8168.ko
インストールを確認します。
# lsmod | grep r8168
表記があれば成功です。そしてLANのインターフェイスを回復させます。(LANデバイスをp21p1とします)
# ifconfig p21p1 up
うまく構築できていればこれで通信が出来るようになります。
なお、元からデバイスを設定していないときは
# vi /etc/sysconfig/network-scripts/ifcfg-p21p1
あたりで設定をし直すなりしてください。
ドライバの自動インストールを設定
このままだとyumなどでkernelを入れ替えるとドライバがない状態となり、updateのたびにドライバのインストールが必要になります。
それを自動で行うようにします。そのときに使われるのがDKMSと呼ばれるサービスです。
kernelの更新時にドライバを自動的に作成してくれるサービスです。
まずはインストールから。
# yum install dkms
インストールが完了した後はドライバを作成するときに使ったファイルを/usr/srcにセットします。
上からの続きなので、カレントディレクトリはドライバファイルのディレクトリのはずですね。
# mv src /usr/src/r8168-8.035.00 # cd /usr/src/r8168-8.035.00 # make clean
ソースコードがあるディレクトリにdkms.confを用意します。
PACKAGE_NAME="r8168" PACKAGE_VERSION="8.035.00" MAKE[0]="make modules" CLEAN[0]="make clean" BUILT_MODULE_NAME[0]="r8168" DEST_MODULE_LOCATION[0]="/kernel/drivers/net" AUTOINSTALL="YES"
面倒なのが、ここでMakefileにも手を入れる必要があります。
ドライバのMake時に構築対象となるkernelのバージョンが渡されますが、それを受け取ってbuildしなければならないのですが、
どうもそのときの定義がかなりまずいらしく、そのままdkmsに読ませるとbuildが出来ません。
上記の設定だとdkmsからはソースコードのディレクトリで
make KERNELRELEASE=[更新対象のkernelバージョン文字列(プラットフォーム名を含む)] modules
と、自動的にKERNELRELEASEの定義が追加されますので、それを受けます。
Makefileの中央部はたぶんこうすればいいかな。
CONFIG_DOWN_SPEED_100 = n CONFIG_ASPM = y obj-m := r8168.o r8168-objs := r8168_n.o r8168_asf.o rtl_eeprom.o rtltool.o EXTRA_CFLAGS += -DCONFIG_R8168_NAPI EXTRA_CFLAGS += -DCONFIG_R8168_VLAN ifeq ($(CONFIG_DOWN_SPEED_100), y) EXTRA_CFLAGS += -DCONFIG_DOWN_SPEED_100 endif ifeq ($(CONFIG_ASPM), y) EXTRA_CFLAGS += -DCONFIG_ASPM endif ifeq ($(KERNELRELEASE),) BASEDIR := /lib/modules/$(shell uname -r) else BASEDIR := /lib/modules/$(KERNELRELEASE) endif KERNELDIR ?= $(BASEDIR)/build PWD :=$(shell pwd) DRIVERDIR := $(shell find $(BASEDIR)/kernel/drivers/net -name realtek -type d) ifeq ($(DRIVERDIR),) DRIVERDIR := $(BASEDIR)/kernel/drivers/net endif RTKDIR := $(subst $(BASEDIR)/,,$(DRIVERDIR)) .PHONY: all all: clean modules install .PHONY:modules modules: $(MAKE) -C $(KERNELDIR) SUBDIRS=$(PWD) modules .PHONY:clean clean: $(MAKE) -C $(KERNELDIR) SUBDIRS=$(PWD) clean .PHONY:install install: $(MAKE) -C $(KERNELDIR) SUBDIRS=$(PWD) INSTALL_MOD_DIR=$(RTKDIR) modules_install
KERNELRELEASEを与えられたときに下にあるビルドルールが読まれないようになっていたのでそれを補正した物です。
コンパイルフラグを変更したい場合はご自由に。
最後にdkmsに登録を行います。
# dkms add -m r8168 -v 8.035.00 # dkms build -m r8168 -v 8.035.00 # dkms install -m r8168 -v 8.035.00
手順を書き記しておかないと後で分からなくなりそう
と言うことでその手順を書いておきました。
ちなみに、これによりAtomマザー側のLANチップを使うようにしたおかげでWOLが有効になる、と言う副次効果がありちょっとうれしいです。
でもやっぱりtelnet-serverの動作不良は良くならない・・・。