网卡是
Linux
服务器中最重要网络设备。据统计,
Linux
网络故障有
35
%在物理层、
25
%在数据链路层、
10
%在网络层、
10
%在传输层、
10
%在对话、
7
%在表示层、
3
%在应用层。由此可以看出,网络故障通常发生在网络七层模型的下三层,即物理层、链路层和网络层。对应于实际网络也就是使用的网络线缆、网卡、交换机、路由器等设备故障。
Linux
的网络实现是模仿
FreeBSD
的,它支持
FreeBSD
的带有扩展的
Sockets
(套接字)和
TCP/IP
协议。它支持两个主机间的网络连接和
Sockets
通讯模型,实现了两种类型的
Sockets
:
BSD Sockets
和
INET Sockets
。它为不同的通信模型和服务质量提供了两种传输协议,即不可靠的、基于消息的
UDP
传输协议和可靠的、基于流的传输协议
TCP
,并且都是在
IP
网络协议上实现的。
INET sockets
是在以上两个协议及
IP
协议之上实现的。
由于交换机、路由器通常独立于
Linux
或者其他操作系统。网卡设置故障是造成
Linux
服务器故障最主要原因。可能因为硬件的质量或性能、磨损老化、人为误操作、不正确的网络设置、管理问题、
Linux
软件的
BUG
、系统受到黑客攻击和
Linux
病毒等原因造成。
Linux
服务器网卡故障排除的思路是:应当遵循先硬件后软件的方法。因为硬件如果出现物理损坏那么如何设定网卡都不能解决故障。解决问题的方法可以从自身
Linux
计算机的网卡查起,如果确定硬件没有问题了,再来考虑软件的设定。
1.
网卡的选择
一般来说,
2.4
版本以后的
Linux
可以支持的网卡芯片组数量已经很完备了,包括著名厂商如:
Intel
以及使用广泛的
RealTek, Via
等网卡芯片都已经被支持,所以使用者可以很轻易的设定好他们的网络卡。但是由于
Linux
发行版本众多(目前超过
188
个),使用前最好查看
Linux
发行版本的文档。以
Redhat Linux 9.0
为例,这个设备列表在
Ethernet- HOWTO
文档中。另外最直接的方法是查看一个目录:
/lib/modules/release/kernel/drivers/net,
其中
release
是内核版本,可以使用命令:“
uname -r
”获得。对于
Redhat Linux 9.0
是
2.4.20
-8
。
#ls /lib/modules/ 2.4.20 -8/kernel/drivers/net/
3c
501.o atp.o eth16i.o ni52.o smc-ultra.o
3c
503.o bonding.o ethertap.o ni65.o starfire.o
3c
505.o cs89x0.o ewrk3.o ns83820.o strip.o
3c
507.o de4x5.o fc pcmcia sundance.o
3c
509.o de600.o fealnx.o pcnet32.o sungem.o
3c
515.o de620.o hamachi.o plip.o sunhme.o
3c
59x.o defxx.o hamradio ppp_async.o tc35815.o
8139cp.o depca.o hp100.o ppp_deflate.o tg3.o
8139too.o dgrs.o hp.o ppp_generic.o tlan.o
82596.o dl2k.o hp-plus.o ppp_synctty.o tokenring
8390.o dmfe.o irda r8169.o tulip
ac3200.o dummy.o lance.o rcpci.o tulip_old
acenic.o e100 lne390.o sb1000.o tun.o
aironet4500_card.o e1000 lp486e.o shaper.o via-rhine.o
aironet4500_core.o e2100.o mii.o sis900.o wan
aironet4500_proc.o eepro100.o natsemi.o sk98lin wavelan.o
amd8111e.o eepro.o ne2k-pci.o skfp wd.o
appletalk eexpress.o ne3210.o slhc.o winbond-840.o
arlan.o epic100.o ne.o slip.o wireless
arlan-proc.o eql.o netconsole.o smc9194.o wireless_old
at1700.o es3210.o ni5010.o smc-ultra32.o yellowfin.o
可以看到这个目录列出所有
Linux
内核支持的网络设备驱动程序。其中大部分是以太网卡(
8139
、
3COM
、
Intel
)。也有一些是其他类型设备。对于初学者应当尽量选择目录中已经列出的网卡。注意以
.o
后缀结束的文件就是驱动程序。而没有后缀的是驱动程序目录(红色)。
2.
检查网卡是否加载:
驱动硬件是操作系统最基本的功能,操作系统通过各种驱动程序来驾驭硬件设备,和
Windows
系统不同
Linux
内核目前采用可加载的模块化设计(
LKMs Loadable Kernel Modules
),就是将最基本的核心代码编译在内核中,网卡驱动程序是作为内核模块动态加载的。可以使用命令“
lsmod
”查看加载情况:
## lsmod
Module Size Used by
dm_mod 54741 0
button 6481 0
battery 8901 0
ac 4805 0
md5 4033 1
joydev 10241 0
uhci_hcd 31065 0
ehci_hcd 30917 0
snd_via82xx 26437 0
snd_ac97_codec 63889 1 snd_via82xx
snd_pcm_oss 49017 0
soundcore 9889 1 snd
tulip 45025 1
via_rhine 23113 2
mii 4673 1 via_rhine
ext3 116809 2
jbd 71257 1 ext3
对每行而言,第一列是模块名称;第二列是模块大小;第三列是调用数。调用数后面的信息对每个模块而言都有所不同。如果
(unused)
被列在某模块的那行中,该模块当前就没在使用。如果
(autoclean)
被列在某模块的那行中,该模块可以被
rmmod -a
命令自动清洗。当这个命令被执行后,所有自从上次被自动清洗后未被使用的被标记了“
autoclean
”的模块都会被卸载。丛以上红色粗体字符可以看到笔者
Linux
计算机中两块网卡模块:
tulip
和
via_rhine
已经加载。对应的网卡商业型号分别是:
tulip
:
Lite-On Communications Inc LNE100TX [Linksys EtherFast 10/100]
via_rhine
:
Via VT6102[Rhine-II]
常见主板集成网卡。
如果没有检测到硬件,用硬件检测程序
kuduz
检测网卡,它和
Windows
中添加新硬件差不多。
kudzu
程序是通过查看
/usr/share/hwdata/
目录下的文件识别各种硬件设备的。如果核心支持该硬件,并且有该驱动程序就可自动装载。首先说明的是
Linux
下对网卡的支持往往是只对芯片的
,
所以对某些不是很著名的网卡
,
往往需要知道它的芯片型号以配置
Linux.
比如我的
Top link
网卡
,
就不存在
Linux
的驱动
,
但是因为它是
NE2000
兼容
,
所以把它当
NE2000
就可以在
Linux
下用了
.
所以当你有一块网卡不能用
,
在找
Linux
的驱动程序之前一定搞清楚这个网卡用的什么芯片
,
跟谁兼容
,
比如
3c
509,ne2000
等。这样的型号一般都在网卡上最大的一快芯片上印着
,
抄下来就是了。对于
ISA
接口的
NE2000
卡
,
先要作的一件事情
,
是将网卡设定为
Jumpless
模式
.
很多现在的网卡缺省
都是
PnP
模式
,
这在
Windows
下的确能减少很多麻烦
,
但是
Linux
不支持
,
所以
Linux
下必须是
Jumpless
模式
.
一般所有网卡都有带的驱动盘和
DOS
下可执行的一个设定程序
,
用该程序将网卡设为
Jumpless
。对于
PCI
网卡,可以使用命令来查看:
lspci
。在显示的列表中找到“
Ethernet Controller
”,记下厂商和型号。然后使用
modprobe
尝试加载正确的模块,比如
modprobe 3c 509
。如果出现错误,说明该模块不存在。这时候你应该找到正确的模块并且重新编译。问题一般即可解决。
如果很不幸的,您使用的是比较罕见的一些网卡,或者是
Linux
核心支持不够的网卡,以致于在安装
Linux
时,并无法检测到网卡,那也不用担心,我们可以使用较为简单的核心模块编译来支持这张网卡。下面以笔者的
3Com
的
3CR990-TX-97
网卡为例(一款具有安全特性网卡)看看如何进行模块编译。首先在其网站
[url]http://www.3com.com/infodeli/tools/nic/linuxdownload.htm[/url]
下载合适你使用内核版本的相关驱动程序,这里以
2.4
内核为例。
#wegt [url]http://www.3com.com/infodeli/tools/nic/3c990-1.0.0a.tar.gz[/url]
另外在开始编译核心模块之前,因为驱动程序需要配合核心来编译,所以会使用到
kernel source
或者是
kernel header
的数据,此外,也需要编译器
( compiler )
的帮助,因此,先确定您的
Linux
系统当中已经下列软件的存在
:
kernel-source
、
kernel
、
gcc
、
make
。
#tar zxvf 3c 990- 1. 0.0a .tar.gz
#make
此时会产生
3c
990.o
驱动模块。然后使用命令拷贝到相应地方然后查看加载是否正常。
#modprobe 3c 990
#cp 3c 990.o /lib/modules/ 2.4.20 -8/kernel/drivers/net
# depmod -a
然后使用
lsmod
命令检查加载情况,如果一切正常的话。可以让系统启动时自动加载该模块:
#echo
“
alias eth0 3c 990 ” >;>; /etc/modules.conf
3.
为新网卡设定
IP
地址
在
Linux
网络设备在配置时被赋予别名,该别名由一个描述性的缩略词和一个编号组成。某种类型的第一个设备的编号为
0
,其他设备依次被编号为
1
、
2
、
3
,等。但是网卡并不是最为裸设备出现在
/dev
目录下,而是存在内存中。
eth0, eth1
是以太网卡接口。它们用于大多数的以太网卡,包括许多并行端口以太网卡。本文主要讨论这类网卡。
为
Linux
以太网卡设定
IP
地址的方式非常灵活,你可以选择适合你工作情况的方法:
(
1
)
使用
ip
或
ifconfig
命令
ifconfig
命令是最重要的
Linux
网络命令,最主要的用途是设定、修改网卡的
IP
地址,修改网卡
ip
地址:
#ifconfig eth0 192.168.0.2 netmask 255.255.255.0
默认情况下,
ifconfig
显示活动的网络设备。给这个命令添加一个
-a
开关就能看到所有设备。但是
ifconfig
命令设置网络设备的
ip
地址系统重新启动后设置会自动失效。所以它主要用于网卡状态调试。假设您要建立一个临时的网络配置以供测试。您可以使用发行版本中的工具来编辑配置,但是需要注意在完成测试之后,将所有设置恢复回去。通过使用
ifconfig
,我们无需影响已保存的设置,就能够快速地配置网卡。
Ip
命令是
iproute2
软件包里面的一个强大的网络配置工具,它能够替代一些传统的网络管理工具。例如:
ifconfig
、
route
等。
现在,绝大多数
Linux
发行版和绝大多数
UNIX
都使用古老的
arp, ifconfig
和
route
命令。虽然这些工具能够工作,但它们在
Linux2.2
和更高版本的内核上显得有一些落伍。使用
iproute2
前你应该确认已经安装了这个工具。这个包的名字在
RedHat Linux 9.0
叫作“
iproute2
”,也可以在:
[url]ftp://ftp.inr.ac.ru/ip-routing/[/url]
下载源代码安装。
如果希望在以太网接口
eth0
上增加一个地址
10.0.0
.1
,掩码长度为
24
位,标准广播地址,标签为
eth0:Alias
:
#ip addr add 10.0.0 .1/24 brd + dev eth0 label eth0:Alias
netconfig
命令可以设置网络设备的
ip
地址,
netconfig
命令可以永久保存设置。
使用方法是:“
netconfig ethX
”。使用命令“
netconfig eth 0 ” 后会在命令行下弹出一个对话框,这时即可进行设定。
设定结束后用“
tab
”键选择“
OK
”即可保存设置并且退出。然后使用命令:“
service network restart
“激活即可生效。
使用
neat
命令需要配置好
X window
系统,在命令行下运行“
neat
”命令后添加
IP
地址和其他相关参数后保存设置,从新启动网络和网络服务或计算机。
另外
neat
命令还有一个同价命令:“
redhat
-
config
-
network
”,二者完全相同。
Neat
和
redhat
-
config
-
config
命令可以永久保存设置。
除非另行指定,
Red Hat Linux
系统中大多数配置文件都在
/etc
目录中。网卡相关的
TCP/IP
网络配置文件是:
/etc/sysconfig/network-scripts/ifcfg-ethx
。其中
x
从
0
开始,第一个以太网配置文件即:
/etc/sysconfig/network-scripts/ifcfg-eth0
。使用
vi
编辑器修改这个文件,也可以修改网卡
IP
地址。
#vi /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
#
设定网卡的名称,要跟文件名称对应
#
ONBOOT=yes
#
是否在开机的的时候启动网卡
#
BOOTPROTO=static
#
启动的时候的
IP
取得的协议,这里是固定的,
如果是动态主机的话,要改成
dhcp
才行
#
IPADDR=192.168.1.2
#IP
地址
#
NETMASK=255.255.255.0
#
子网掩吗
#
NETWORK=192.168.1.0
#
该网段的第一个
IP#
BROADCAST=192.168.1.255
#
最后一个同网段的广播地址
#
GATEWAY=192.168.1.2
#
网关地址
#
#GATEWAYDEV=eth0
存盘后使用命令:“
service network restart
“激活即可生效。这个方法同样可以永久保存设置。
(
5
)
为网卡添加
IPV6
地址
和
Windows
系统相比
Linux
对
Ipv6
的支持更好,最早的支持
Ipv6
的
Linux
内核是
2.2.xxx
。
一般
Linux
基于
2.4
内核的
Linux
发行版本都可以直接使用
Ipv6
,使用前要看系统
IPv6
模块是否被加载,如果没有的话可以使用命令手工加载,这需要超级用户的权限。然后使用命令检测,如果显示
IPv6
地址
(inet6 addr
:
fe80::200:e8ff:fea0:2586/64)
证明
IPv6
已经加载。
# modprobe IPv6
;#
ifconfig -a
如果希望
Linux
系统启动时自动加载
Ipv6
模块,可以在配置文件:
/etc/modules.conf
中加入一行:
alias net?pf?10 ipv6 # automatically load IPv6 module on demand
4.
调整网卡工作模式
现在的网卡大多是自适应工作模式,在配置网卡参数时我们很少考虑它的工作模式,有时发现一些网卡模块已经加载,但是在某些模式工作不稳定。如笔者使用的一块
XXX
品牌的杂牌
RTL -8139C
芯片
10/100
自适应网卡在
100
兆全双工状态下极其不稳定(在
Qcheck
的
TCP
和
UDP
的测试过程中,数据包遗失率
9.12
%。)。在
Linux
环境下,我们可以使用系统自带的工具
mii-tool
命令来配置网卡工作模式。显示
Linux
服务器网卡支持的所有以太网卡类型,使用命令:
# mii-tool
-
v
eth0: negotiated 100baseTx-FD, link ok
product info: vendor 00:00:00, model 0 rev 0
basic mode: autonegotiation enabled
basic status: autonegotiation complete, link ok
capabilities: 100baseTx-FD 100baseTx-HD 10baseT-FD 10baseT-HD
advertising: 100baseTx-FD 100baseTx-HD 10baseT-FD 10baseT-HD
link partner: 100baseTx-FD 100baseTx-HD 10baseT-FD 10baseT-HD
从以上信息中可以看出,这块网卡工作在
100
全双工自适应模式下,“
100aseTx-FD
”意为
100M
Full Duplex
。这里可以强制网卡工作在
100M
半工模式下,输入命令:
#
mii-tool
�C
F 100baseTx-HD eth0
以后恢复网卡的自适应工作模式,输入命令:
#
mii-tool
�C
r eth0
另外路由器、交换机、代理服务器等通信量比较大的关键设备上,应该为它指定正确的工作模式,这样可以提高通信效率。
5.DHCP
客户端网卡设定
如果希望使用
DHCP
是动态主机配置协议,这个协议用于向计算机自动提供
IP
地址
,
子网掩码和路由信息。当设备接入这个局域网时,它们会向
DHCP
服务器请求一个
IP
地址。然后
DHCP
服务器为每个请求的设备分配一个地址,直到分配完该范围内的所有
IP
地址为止。已经分配的
IP
地址必须定时地延长借用期。这个延期的过程称作
leasing
,确保了当客户机设备在正常地释放
IP
地址之前突然从网络断开时被分配的地址可以归还给服务器。
Linux
下配置
DHCP
客户端有两种方法:图形界面和手工配置。使用图形界面可以使用
neat
命令界面。选中“自动获得
IP
地址设置使用
DHCP
”即可。
通常笔者更喜欢使用选择手工配置
DHCP
客户,需要修改
/etc/sysconfig/network
文件来启用联网;并修改
/etc/sysconfig/network-scripts
目录中每个网络设备的配置文件。在该目录中,每个设备都有一个叫做
ifcfg-ethX
的配置文件,
ethX
是网络设备的名称。
如
eth0
等。如果你想在引导时启动联网,
NETWORKING
变量必须
被设为
yes
。
除了此处之外
/etc/sysconfig/network
文件应该包含以下行:
NETWORKING=yes
DEVICE=eth0
BOOTPROTO=dhcp
ONBOOT=yes