2017年10月 / 09月≪ 12345678910111213141516171819202122232425262728293031≫11月

インフォメーション

FC2ブログで画像等を一括アップロードするソフトを地味に配布してます。
FC2ブログ用ファイルアップロードの最新版はこちら
(ベクター)FC2ブログ用ファイルアップロード

--.--.-- (--)

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。


 |  --:--  |  スポンサー広告  |  Top↑

2010.01.21 (Thu)

FreeBSDでRealtekのRTL8168C/8111Cを認識させる

デスクトップPCでFreeBSD鯖構築の続き。

ドライバをインストールするには、カーネル再構築だかなんだかしなきゃいけないらしい。
正直カーネルって何?Makefileってなんだっけ?どう使うの?意味わからん状態。
いじってるうちに理解するだろうからやるだけやってみます。

↓また長くなりそうだから

【More・・・】

FreeBSDは無事起動するようになったので、次はネットにつなぎたいのだが、
FreeBSD6.3をインストールしただけでは認識してくれなかったので、手動でドライバを入れる。

ネットにつながってないのでファイル類は直接ダウンロードできない。
なのでドライバは別のPCでダウンロードしたものをUSBメモリで移すことにした。

Realtekのサイトからドライバをダウンロード。
LAN drivers - Realtek
↑ここの「FreeBSD 6.x and 7.x」ってやつ。
ファイル名は「rtl_bsd_drv_v179.tgz」になった。
8には対応してないのかな?8だとでふぉで認識できるのか?

rtl_bsd_drv_v179.tgzをUSBメモリに突っ込んでFreeBSDを入れたデスクトップPCに挿す。
さしたらなんか画面に
# umass0: USB 2.0 USB Flash Drive, rev 2.00/1.00, addr 2
da0 at umass-sim0 bus 0 target 0 lun 0
da0: Removable Direct Access SCSI-2 device
...

とかなんとか勝手に表示されたので、認識したんだと思う。

とりあえず/rootへ移動
# cd /root


# mount_msdosfs /dev/da0s1 /mnt

って打ったら、#ls /mnt でUSBメモリの中身が見られるようになった。
とりあえずローカルの適当な場所にコピーして、解凍する。

/rootフォルダにコピー
# cp /mnt/rtl_bsd_drv_v179.tgz /root


コピーできたか確認するならlsで。
# ls /root

rtl_bsd_drv_v179.tgzって表示されればOK。

解凍する。
# tar xvfz /root/rtl_bsd_drv_v179.tgz

↓こんな感じのが出てきたら解凍できてると思う。
x rtl_bsd_drv_v179/
x rtl_bsd_drv_v179/Makefile
x rtl_bsd_drv_v179/Readme.txt
x rtl_bsd_drv_v179/if_rl.c
x rtl_bsd_drv_v179/if_rlreg.h

/root/rtl_bsd_drv_v179フォルダができてるはず。
フォルダ内へ移動
# cd /root/rtl_bsd_drv_v179


ここからはrtl_bsd_drv_v179/Readme.txtを参考にすすめる。
if_rl.koがあれば「Method 1:」ができるのだが、入ってない。
「Method 2:」を進めていくことにする。

Readme.txt
1. keep the orginal driver source code:
# cd /usr/src/sys/pci
# cp if_rl.c if_rl.c.org
# cp if_rlreg.h if_rlreg.h.org

# cd /usr/src/sys/modules
# cp Makefile Makefile.org

# cd /usr/src/sys/modules/rl
# cp Makefile Makefile.org

# cd /usr/src/sys/i386/conf/
# cp GENERIC GENERIC.org

ここは既にあるファイルのバックアップなので、上から順次書いてあるとおり打ってく。

2. recompile your kernel (you must install your FreeBSD source code first !!)
# vim /usr/src/sys/i386/conf/GENERIC and delete rl and re
# vim /usr/src/sys/modules/Makefile and delete rl and re

書いてある通り打ったら
vim: Command not found.

って出た。vimがインストールされていないようだ。
やりたいことは各ファイルの rl と reを削除だと思うので、viでやることにする。

# vi /usr/src/sys/i386/conf/GENERIC

viでGENERICファイルを開いて、[/rl]と打ってrl部分を探す。次を探す場合は[n]前は[N]。
近くにreの記述もあるので一緒にコメントアウトする。
[x]で1文字削除 [i]で文字挿入開始 [Esc]で挿入とか終わり
devicere# RealTek 8139C+/8169/8169S/8110S
devicerl# RealTek 8129/8139

↓コメントアウトする
# devicere# RealTek 8139C+/8169/8169S/8110S
# devicerl# RealTek 8129/8139

:wq
で保存終了。

続いて同じようにMakefileも
# vi /usr/src/sys/modules/Makefile

viで開いて
rc4 \
re \
reiserfs \
rl \
rp \

↓re と rlの行を削除する。行削除は[dd]
rc4 \
reiserfs \
rp \

:wq

はい次
# cd /usr/src/sys/i386/conf
# /usr/sbin/config GENERIC

そのまま打ったら
Kernel build directory is ../compile/GENERIC
Don't forget to do ``make cleandepend; make depend''

って出た。../compile/GENERICに移動してmake cleandepend;make dependをしろってことかな。

(for FreeBSD 5.x/6.x/7.x)
# cd ../compile/GENERIC
(for FreeBSD 4.x)
# cd ../../compile/GENERIC

FreeBSD 6.3なので
# cd ../compile/GENERIC
# make depend
# make
# make install
# reboot

makeする。そのまま打っていって、Errorが出なきゃおk。
結構時間かかるのでのんびり待つ。
特に#makeが時間かかった。30分くらいかかった。
Errorが出ず終わればOK。
Errorが出たらエラーメッセージから原因を探るなり.orgからコピーしなおしてやりなおすなりする。
再起動できたら

3. update the driver source code:
Copy the dirver source code( if_rl.c and if_rlreg.h) into /usr/src/sys/pci
Copy the Makefile into /usr/src/sys/modules/rl

各場所のソースを最初に解凍した「rtl_bsd_drv_v179.tgz」の中のソースに置き換える。
# cd /root/rtl_bsd_drv_v179
# cp if_rl.c /usr/src/sys/pci
# cp if_rlreg.h /usr/src/sys/pci
# cp Makefile /usr/src/sys/modules/rl

4. build the driver:
# cd /usr/src/sys/modules/rl
# make clean
# make

makeしてif_rl.koを生成する。そのまま打ってけば良い。
# cd /usr/src/sys/modules/rl
# make clean
# make

/usr/src/sys/modules/rlにif_rl.koができてればOK。

5. install the driver
# cd /usr/src/sys/modules/rl
# kldload ./if_rl.ko

今作ったif_rl.koをロードする。そのまま打ってけば良い。
# cd /usr/src/sys/modules/rl
# kldload ./if_rl.ko

rl0がどうとか表示が出るはず。
# ifconfig

で「rl0:」の表示があればたぶん成功。

あとはこの辺を参考にネットワークの設定をする。
6. configurate the static IP address
# ifconfig rl0 xxx.xxx.xxx.xxx

7. configurate the IP address by DHCP
# /sbin/dhclient rl0

うちはDHCPを使ってるので後者を実行。

これでネットワークが使えるようになった。
pingでほかのパソコン等にpingを打って確認したら繋がった。

しかしこの状態だと、再起動したらまたkldload でif_rl.koをロードしないとネットワークが使えない。
起動時に自動でロードして常時使えるようにしたい。


そこでやっとReadme.txtの「Method 1:」の出番です。
Method 1:をやることで起動時に自動でロードされる設定になるみたい。なのでやる。
Method 1:
1.Copy if_rl.ko in "modules" directory to "/modules" directory and overwrite
the existing file.
2.Modify the file "/boot/defaults/loader.conf" and set "if_rl_load" in "Network
drivers" section to "Yes"
3.Reboot.

1.さっき作ったif_rl.koを/boot/modulesにコピー
# cp /usr/src/sys/modules/rl/if_rl.ko /boot/modules

2./boot/defaults/loader.conf内のif_rl_loadをYesにする。
# vi /boot/defaults/loader.conf

if_rl_load="NO"

if_rl_load="Yes"

ReadOnlyだから保存できないみたいなメッセージが出たので
:wq!
で強制保存。

3.再起動
# reboot

これでif_rl.koが自動的にロードされてるはず・・・!

あれ?されてない。なんでだろう。
# kldload /boot/modules/if_rl.ko

手動でロードすればちゃんと動くんだけどな。

原因が良くわからないのでもいっかい
2. recompile your kernel (you must install your FreeBSD source code first !!)
からやり直すことにした。

そしたらGENERICのmakeでエラーが出てしまった。
# make 
cc -c -O -pipe -Wall -Wredundant-decls -Wnested-externs -Wstrict-prototypes -Wmissing-prototypes -Wpointer-arith -Winline -Wcast-qual -fformat-extensions -std=c99 -g -nostdinc -I- -I. -I../../.. -I../../../contrib/altq -I../../../contrib/ipfilter -I../../../contrib/pf -I../../../dev/ath -I../../../contrib/ngatm -I../../../dev/twa -I../../../dev/em -D_KERNEL -DHAVE_KERNEL_OPTION_HEADERS -include opt_global.h -fno-common -finline-limit=8000 --param inline-unit-growth=100 --param large-function-growth=1000 -mno-align-long-strings -mpreferred-stack-boundary=2 -mno-mmx -mno-3dnow -mno-sse -mno-sse2 -ffreestanding -Werror ../../../dev/mii/rgephy.c
../../../dev/mii/rgephy.c: In function `rgephy_service':
../../../dev/mii/rgephy.c:309: error: `RL_GMEDIASTAT' undeclared (first use in this function)
../../../dev/mii/rgephy.c:309: error: (Each undeclared identifier is reported only once
../../../dev/mii/rgephy.c:309: error: for each function it appears in.)
../../../dev/mii/rgephy.c:310: error: `RL_GMEDIASTAT_LINK' undeclared (first use in this function)
../../../dev/mii/rgephy.c: In function `rgephy_status':
../../../dev/mii/rgephy.c:363: error: `RL_GMEDIASTAT' undeclared (first use in this function)
../../../dev/mii/rgephy.c:364: error: `RL_GMEDIASTAT_LINK' undeclared (first use in this function)
../../../dev/mii/rgephy.c:406: error: `RL_GMEDIASTAT_1000MBPS' undeclared (first use in this function)
../../../dev/mii/rgephy.c:408: error: `RL_GMEDIASTAT_100MBPS' undeclared (first use in this function)
../../../dev/mii/rgephy.c:410: error: `RL_GMEDIASTAT_10MBPS' undeclared (first use in this function)
../../../dev/mii/rgephy.c:414: error: `RL_GMEDIASTAT_FDX' undeclared (first use in this function)
*** Error code 1

Stop in /usr/src/sys/i386/compile/GENERIC.

理由はよくわからないけど、「RL_GMEDIASTAT」とかその辺の定義が見つからないってことなのかな。
探してみたらif_rlreg.h.orgにはその辺の定義があり、if_rlreg.hには定義が無かったので
if_rlreg.h.orgにあった下記の部分をif_rlreg.hに追加してみた。
#define RL_GMEDIASTAT 0x006C /* 8 bits */

/*
* Gigabit media status (8169 only)
*/
#define RL_GMEDIASTAT_FDX 0x01 /* full duplex */
#define RL_GMEDIASTAT_LINK 0x02 /* link up */
#define RL_GMEDIASTAT_10MBPS 0x04 /* 10mps link */
#define RL_GMEDIASTAT_100MBPS 0x08 /* 100mbps link */
#define RL_GMEDIASTAT_1000MBPS 0x10 /* gigE link */
#define RL_GMEDIASTAT_RXFLOW 0x20 /* RX flow control on */
#define RL_GMEDIASTAT_TXFLOW 0x40 /* TX flow control on */
#define RL_GMEDIASTAT_TBI 0x80 /* TBI enabled */

そしてもいっかい/usr/src/sys/i386/compile/GENERICでmakeしてみたところ、
エラーが出なくなってちゃんとコンパイルできた。
その後/usr/src/sys/modules/rlでmakeして、if_rl.koを/boot/modulesにコピーしなおして再起動。

やっぱりだめだ。なんでだろう?
ネットワークの設定が足りないのかな?と思って/etc/rc.confに設定を追加。
# vi /etc/rc.conf

ifconfig_rl0="DHCP"

を追加。
再起動。

うーんやっぱりだめだ。おかしいなあ。

ふと、まさかと思って/boot/defaults/loader.conf
if_rl_load="Yes"

if_rl_load="YES"

にしてみて再起動。

ちゃんとうごいたー!!!
起動時にrl0が認識されるようになったよ!
YESじゃないとだめだったのかよ!!

ここで大文字小文字とは・・・orz
間抜けだ。
まあでも良かった。
次はSSHを公開鍵でも作るか。
バージョンアップはどうしよう。



メモ。
・絶対パスは頭に/をつけ、相対パスは/がつかない(/root/tmp<-絶対 root/tmp<-相対)
・ファイル一覧はls -aで隠しファイルも表示 -lで詳細表示。個人的にはls -alをよく使う。
・大文字小文字は区別するので正しく打つ。ファイル名も大文字小文字区別あり。
・ファイル内容を見るだけならcat [ファイル名]。
・lsとかcatの結果等を特定の文字で抽出したい場合、「| grep [抽出文字]」で抽出できる。(# ls /boot/kernel | grep if_r)

 |  12:21  |  サーバー  |  トラックバック(0)  |  コメント(2)  |  Top↑

Comment

素晴らしいです。

つくづく、無職にしておくのは勿体無い。
いけいけ |  2010.01.22(金) 15:56 |  URL |  【コメント編集】

●Re: タイトルなし

ほんとすみませんありがとうございます。
ほんのり仕事探してはいるんですけどね・・・
まだ預金に余裕があるせいかだらだらしてしまってます。
上野メモ |  2010.01.23(土) 15:53 |  URL |  【コメント編集】

コメントを投稿する

URL
コメント
パス  編集・削除するのに必要
非公開  管理者だけにコメントを表示
 

Trackback

この記事のトラックバックURL

この記事へのトラックバック

 | BLOGTOP | 
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。