📄 0130internet_connect.htm
字号:
<hr /><a NAME="note_nic"></a><img src="../images/penguin-s.gif" alt="小标题的图示" height="23" width="16" align="middle" /><span class="text_h2">Linux 的网路卡</span><br />
<div class=block2>
在 Linux 里面的各项装置几乎都是以档案名称来取代的,例如 /dev/hda 代表 IDE1 介面的第一个 master 硬碟等等。
不过,<span class=text_import2>网路卡的代号 (Network Interface Card, NIC) 却是以模组对应装置名称来代替的,
而预设的网路卡代号为 eth0</span> ,第二张网路卡则为 eth1 ,以此类推。<br /><br />
我们知道网路卡其实是硬体,所以当然需要核心支援才能驱动他。
一般来说,目前新版的 Linux distributions 预设可以支援的网路卡晶片组数量已经很完备了,
包括大厂的 3COM, Intel 以及初阶的 RealTek, D-Link 等网路卡晶片都已经被支援,
所以使用者可以很轻易的设定好他们的网路卡。不过,万一您的网路卡晶片组开发商不愿意释出开放源
(Open Source) 的硬体驱动程式,或者是该网路卡太新了,使得 Linux 核心来不及支援时,
那么您就得要透过∶<br />
<ul><span class=text_import2>
<li><a href="http://linux.vbird.org/linux_basic/0540kernel.php">重新编译核心</a>
<li><a href="http://linux.vbird.org/linux_basic/0540kernel.php#module">编译网路卡的核心模组</a>
</span></ul>
好让核心可以支援网路卡这块硬体啦!但是,重编核心或编译网路卡核心模组都不是简单的工作,
而且有时原始码又可能无法在每部主机上面编译成功,所以万一您的网路卡真的不被预设的 Linux
网路晶片所支援,那么鸟哥真的建议直接换一块被 Linux 支援的网路卡吧,例如很便宜的螃蟹卡!
免得花了太多时间在硬体确认上面,划不来的! ^_^<br /><br />
如果您是照鸟哥推荐的,使用 RLT 8139 晶片 ( RealTek 8139 ) 的网路卡 ( 就是螃蟹卡 )
,那您应该在安装 Linux 的时候就已经捉到网路卡了,那真是恭喜您啦!
因为您的网路卡应该已经可以正常的工作棉!那如果在安装的时候并没有捉到网路卡呢?
该如何是好?那也不用担心,因为您也可以事后才安装网路卡的驱动程式呀!不过,因为
Linux 并不像 Windows 是那样的随插即用,所以需要动一些手术的! <br /><br />
另外,其实有的时候 Linux 的预设网路卡模组可能无法完全 100% 的发挥网路卡的功能的,
所以,有的时候您还是得必须要自行编译网路卡的模组才行喔!当然,
那个网路卡的模组就得要自行由网路卡开发商的官方网站下载了!不过,如果您的网路卡是自行编译安装的,
<span class=text_import2>那么每次重新安装其他版本的核心时,您都必须要自行重新手动编译过该模组</span>。
因为模组与核心是有相关性的啊!<br /><br />
好了,假设您的网路卡已经在主机上面,不论是内建的还是自行安插到 PCI 或 PCI-x 或 PCI-E 的介面上,
那么如何确认该网路卡有被核心捉到呢?很简单啊!就利用 dmesg 来查阅即可∶<br />
<table class="term"><tr><td class="term"><pre>
[root@linux ~]# <span class=term_command>dmesg | grep -in eth</span>
117:divert: not allocating divert_blk for non-ethernet device lo
<span class=term_write>171:divert: allocating divert_blk for eth0</span>
227:divert: not allocating divert_blk for non-ethernet device sit0
228:eth0: no IPv6 routers present
[root@linux ~]# <span class=term_command>dmesg | cat -n | less</span>
<span class=term_say>#...前面省略...</span>
169 3c59x: Donald Becker and others. www.scyld.com/network/vortex.html
170 0000:00:08.0: 3Com PCI 3c905C Tornado at 0xe800. Vers LK1.1.19
171 divert: allocating divert_blk for eth0
<span class=term_say>#...后面省略...</span>
</pre></td></tr></table>
透过这个 dmesg 可以发现系统在开机时确实有捉到网路卡,然后透过搜寻行号,就能够找到该网路卡的驱动模组;
当然,您也可以透过 lspci 来查阅网路卡的相关模组呐!
另外,您也可以透过这个 dmesg 了解到该张网路卡的代号喔!举例来说,鸟哥上面这个讯息就显示∶
<span class=text_import2>我的这张网路卡代号是 eth0 </span><br />
<table class="term"><tr><td class="term"><pre>
[root@linux ~]# <span class=term_command>lspci</span>
00:08.0 Ethernet controller: 3Com Corporation 3c905C-TX/TX-M [Tornado] (rev 74)
</pre></td></tr></table>
看到了吧?鸟哥的某一部主机就是使用 3Com 的网路卡啊!Linux 系统本身就内建了 3c905C 这个驱动程式,
所以鸟哥根本不需要自行安装驱动程式呐!真是高兴! ^_^
那么这个 3c905 的驱动程式放在哪里啊?就是核心模组啊!在这个地方∶<br />
<table class="term"><tr><td class="term"><pre>
[root@linux ~]# <span class=term_command>cd /lib/modules/`uname -r`/kernel/drivers/net</span>
[root@linux net]# <span class=term_command>modinfo 3c59x.ko</span>
filename: 3c59x.ko
author: Donald Becker <becker@scyld.com>
description: 3Com 3c59x/3c9xx ethernet driver LK1.1.19 10 Nov 2002
license: GPL
version: LK1.1.19 DBFD1C112761D573276AC45
parm: debug:3c59x debug level (0-6)
<span class=term_say>.....以下省略.....</span>
</pre></td></tr></table>
你可以先以 lsmod 查询各个相关的模组后,再到这个地方来检查,或者是直接以上面这个目录下的档案,
配合 lsmod 所显示出来的各个模组名称相对应,以取得各个网路卡的模组名称说!这样了解吗?
OK 那你如何知道你的网路卡卡号呢?很简单啊!不管有没有启动你的网路卡,都可以使用∶
『<span class=text_import2> ifconfig eth0 </span>』来查询你的网卡卡号。
如果网路卡已经安装好了,那么请前往<a href="#connect_fix_IP">固定 IP 上网方式</a>去设定
ifcfg-eth0 这个档案 (如果是新增的网卡,这个档案可能不会存在喔!,需要自己建立)。
好了,万一你的网路卡无法被驱动,不过好在官方有提供相关的原始码时,
您就可以自行编译啦!<br /><br />
</div>
<hr /><a NAME="note_compile"></a><img src="../images/penguin-s.gif" alt="小标题的图示" height="23" width="16" align="middle" /><span class="text_h2">编译网路卡驱动程式</span><br />
<div class=block2>
如果你买到的网路卡实在太新,导致 Linux 预设核心不支援,
或者您实在是很想要一些官方网站提供的驱动程式的新功能,
那实在就得要自行编译核心啦!
事实上,如果您要新添购硬体时,请先查阅一下硬体包装上面是否提及支援 Linux 的字样,
因为有些硬体厂商在推出新硬体时,常常会漏掉 Linux 驱动程式的撰写,
如果包装上面有提到支援的话,那么至少您会获得官方网站所提供的驱动程式原始码啊! ^_^<br /><br />
鸟哥以我们实验室内一部 P-4 内建 Gigabit 乙太网路卡的 CentOS Linux 系统来作介绍,
这部主机的内建乙太网路使用的是 <a href="http://www.marvell.com"
target="_blank">Marvell</a> 的 88E8001 晶片,鸟哥到他们网站上面找到了一个 2006/04
释出的最新驱动程式来安装,该原始的档案名称为 install-8_40.tar.bz2 ,看到 .tar.bz2
就应该知道他是属于原始码,虽然鸟哥这部主机已经正确的捉到网路卡了,
不过,我们还是来更新一下让这个模组成为最新的驱动程式吧! ^_^<br /><br />
另外,记得啊,要编译就得要有 gcc, make, kernel-devel 等套件才行喔!不要说你忘了!
赶紧回到<a href="../linux_basic/0520source_code_and_tarball.php">基础篇</a>里面看看先!
假设您已经∶
<ul><span class=text_import2><li>前往官方网站取得驱动程式的原始码了;</li>
<li>已经在您的系统上面安装了 gcc, make, kernel-devel 等套件;</li></span></ul>
那接下来的编译步骤是这样的∶<br />
<ol>
<li><span class=text_import1>解压缩与编译∶</span><br /><br />
假设您下载下来的档案放置在 /root 内的话,那么使用 root 的身份进行如下工作吧∶<br />
<table class="term"><tr><td class="term"><pre>
[root@linux ~]# <span class=term_command>cd /usr/src</span>
[root@linux src]# <span class=term_command>ln -s kernels/2.6.9-34.0.1.EL-smp-i686/ linux</span>
[root@linux src]# <span class=term_command>cd ~</span>
</pre></td></tr></table>
上面这个步骤很重要!因为驱动程式的模组都会需要找到核心的包含档案与相关函式库,
而一般来说, Linux kernel 2.6 以后的版本,则都会预设将核心原始码放在
<span class=text_import2>/usr/src/kernels/(version)</span> 这个目录内,但一般程式却是假设核心原始码在
<span class=text_import2>/usr/src/linux</span>,因此我们必须要先作个手术,将原始码与
/usr/src/linux 作个连结啊!请注意,那个原始码请依照您的核心版本与 Linux distribution 之公布为准。<br />
<table class="term"><tr><td class="term"><pre>
[root@linux ~]# <span class=term_command>tar -jxvf install-8_40.tar.bz2</span>
[root@linux ~]# <span class=term_command>cd DriverInstall</span>
<span class=term_say># 此时在该目录下有个 README 的档案,记得看一看,这个档案内会说明很多资讯,
# 包括如何编译,以及这个模组所支援的晶片组哩!</span>
[root@linux DriverInstall]# <span class=term_command>./install.sh</span>
</pre></td></tr></table>
这个模组写的比较人性化,因为他有给予一个可直接安装测试的 script,
所以我们可以直接执行这个指令即可,很单纯吧! ^_^ 。不过记得,
这些动作请在主机前进行。因为这个 script 会主动的重新启动网路卡喔!
所以如果你是在网路上连线到此主机上面动作的话,嘿嘿!那可是会失败的!
这个指令会有很多的选项在里面,请依序选择∶
<ul><li>1) installation<li>y(install)</ul>
然后这个 script 便会主动的进行编译、模组卸除以及模组安装到
<span class=text_import2>/lib/modules/`uname -r`/kernel/drivers/net</span> 这个目录中,
并且尝试载入这个模组,以及启动网路卡喔!如果一切无误,您就会看到如下画面∶<br />
<table class="term"><tr><td class="term"><pre>
eth0: network connection up using port A
speed: 1000
autonegotiation: yes
duplex mode: full
flowctrl: symmetric
role: slave
irq moderation: disabled
scatter-gather: enabled
tx-checksum: enabled
rx-checksum: enabled
rx-polling: enabled
</pre></td></tr></table>
这样就算安装妥当棉!很简单吧! ^_^<br /><br /></li>
<li><span class=text_import1>模组之测试与处理</span><br /><br />
事实上,刚刚我们那个模组其实已经主动的载入到我们的系统当中了,
不过,如果您所取得的原始码并没有附上这么一支人性化的 script 的话,那么您就得要自行进行底下的动作了。<br />
<table class="term"><tr><td class="term"><pre>
[root@linux ~]# <span class=term_command>ls -l</span>
drwxr-xr-x 2 root root 4096 Jul 20 11:57 sk98lin
[root@linux ~]# <span class=term_command>ls -l sk98lin</span>
-rw-r--r-- 1 root root 2666344 Jul 20 11:57 sk98lin.ko
<span class=term_say># 上面那个目录假设是我编译出来的模组,里面还会有一个档案喔!那个档案就是
# sk98lin.ko ,要注意,新的 2.6 版的核心模组副档名都变成 .ko 的格式了!</span>
[root@linux ~]# <span class=term_command>cp -a sk98lin /lib/modules/`uname -r`/kernel/drivers/net</span>
<span class=term_say># 注意啊!整个网路卡驱动模组就是放在上面的目录中,不要写错了。</span>
[root@linux ~]# <span class=term_command>depmod -a</span>
<span class=term_say># 将所有的模组进行重新分析的工作!建立关连档案</span>
[root@linux ~]# <span class=term_command>lsmod | grep 'sk98lin'</span>
<span class=term_say># 先确认『sk98lin』这个模组不存在,然后就可以开始测试∶</span>
[root@linux ~]# <span class=term_command>modprobe sk98lin</span>
[root@linux ~]# <span class=term_command>lsmod | grep 'sk98lin'</span>
<span class=term_say># 如果有相关的字样跑出来时,就表示这个模组可以顺利的被载入啦!</span>
</pre></td></tr></table>
如果可以顺利载入的话,恭喜您,您所自行编译的驱动程式已经搞定啦!
不过,当有新版本的核心释出时,您也安装了新版的核心,那么上面的动作您就得要再进行一次,
为什么呢?想一想,刚刚您将编译出来的驱动程式模组放在哪里?
然后编译的时候参考的核心原始码又是在哪里?那您就会晓得『为什么』了! ^_^<br /><br /></li>
<li><span class=text_import1>设定开机自动启动网路卡模组</span><br /><br />
我们前面提到,Linux 的网路卡其实仅是一个代号,并不是类似硬碟的装置档案,所以,
我们必须要指定这个代号与模组的对应才行,在 CentOS (Red Hat 系统) 的对应是使用 /etc/modprobe.conf
,至于旧版的 2.4 核心中,则使用的是 /etc/modules.conf ,注意一下您的核心版本。
鸟哥的 CentOS 4.3 使用的是 /etc/modprobe.conf ,所以我就得这么做∶<br />
<table class="term"><tr><td class="term"><pre>
[root@linux ~]# <span class=term_command>vi /etc/modprobe.conf</span>
<span class=term_say># 修改或增加底下这一行吧!</span>
<span class=term_write>alias eth0 sk98lin</span>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -