首页 百科知识 网络故障诊断

网络故障诊断

时间:2022-10-05 百科知识 版权反馈
【摘要】:本任务主要介绍Linux系统中可能出现的一些网络问题, 如网卡硬件问题、 网络配置问题、驱动程序问题, 并介绍了一些解决故障的方法和手段。如果lspci命令能看到网卡的存在, 一般表明该网卡已经被Linux承认, 硬件方面是没有什么问题了。如果在系统中找不到驱动模块, 则或者是Linux内核不支持所安装的网卡类型, 需要手动安装, 或者是由于某种原因, 当系统启动时没有自动装载网卡驱动模块。

【任务描述】

由于实现网络服务的层次结构非常多, 因此当网络出现故障时, 解决起来将比较复杂。本任务主要介绍Linux系统中可能出现的一些网络问题, 如网卡硬件问题、 网络配置问题、驱动程序问题, 并介绍了一些解决故障的方法和手段。

【任务分析】

本任务会对常见的几种Linux网络故障进行分析和排除。

【任务实施】

1. 诊断网卡故障

大部分的计算机都是通过以太网接入网络的, 或者直接通过网卡与其他主机通信, 或者在网卡的基础上通过ADSL等拨号连接方式与其他主机通信。 因此, 如果网卡出问题, 计算机将无法与其他主机通信, 也就无法使用网络了。

网卡的故障可以分为硬件故障和软件故障两类。 可能的硬件故障是网卡上的电子元器件损坏, 一般用户是无法对这种硬件故障进行检测的, 判断的方法只能是把该网卡插到其他机子上使用, 如果多台机子上都不能正常使用, 应该是属于元器件损坏了。 这种故障用户自己一般无法修理。

还有一类常见的硬件故障是由于接触不好, 或者是网卡与主板上的总线插槽接触不牢,或者是双绞线上的水晶头与网卡的RJ45插口接触不牢。 一般情况下, 如果网卡本身正常,网卡与主板是否连接正常可以通过观察PC机自检时的提示信息进行判断。 如果提示检测到了Ethernet之类的设备, 一般表明网卡与主板的连接是正常的。

一般网卡上都有一个连接指示灯, 当网卡与交换机等对端设备的线路连接正常时, 该指示灯会亮起来。 因此, 可以根据该指示灯的指示来判断网卡的RJ45端口与水晶头有没有接触不良的问题。 当然, 如果指示灯不亮, 也有可能是对端设备, 如交换机等的问题或者是线路的故障, 需要排除其他故障后再进行判断。

实际情况下, 大部分的网卡出现的故障都是属于软件故障。 软件故障分为两类: 一类是设置故障, 即由于某种原因, 该网卡所使用的计算机资源与其他设备发生了冲突, 导致它无法工作; 另一类是驱动程序故障, 即网卡的驱动程序被破坏或未正确安装, 导致操作系统无法与网卡进行通信。 在Linux系统中, 可以通过dmesg命令显示系统引导时的提示信息, 其中包括了有关网卡的内容:

[root@localhost~]#dmesg |grep eht

eth0:registered as PCnet/PCI II 79C970A

eth0:link up

eth0: no IPv6 routers present

[root@localhost~]#

以上命令列出了引导信息中包含eth字符串的行, 如果出现了类似于 “eth0: linkup”的提示, 表示Linux已经检测到了网卡, 并处于正常工作状态。 还有一条lspci命令可以列出Linux系统检测到的所有PCI设备, 如果所用的网卡是PCI总线的, 应该能够看到这块网卡的信息:

[root@localhost~]#lspci

.

.

.

02:00.0 USB Controller: Intel Corporation 82371AB/EB/MB PIIX4 USB

02:02.0 Multimedia audio controller:Ensoniq ES1371 [Audio PCI-97] (rev02)

02:05.0 Ethernet controller: Advanced Micro Devices [AMD] 79c90 [PCnet32LANCE] (rev 10)

[root@localhost~]#

可以看到, lspci命令列出了很多PIC设备。 其中, 最后一行表示的是以太控制卡, 列出的信息还包括网卡的类型。 如果lspci命令能看到网卡的存在, 一般表明该网卡已经被Linux承认, 硬件方面是没有什么问题了。 最后, 可以用ethtool查看以太网的链路连接是否正常:

#ethtool eth0

Settings for eth0:

Current message level: 0x00000007 (7)

Link detected: yes

如果看到 “Linkdetected: yes” 一行, 表明网卡与对方的网络线路连接是正常的。

2. 网卡驱动程序

网卡能够被Linux检测到, 并不意味着它已经能够正常工作了, 因为任何硬件能够正常工作的前提是需要有相应的驱动程序。 驱动程序是内核与外部硬件设备之间通信时的中介,对于网卡的通用接口, 是不针对任何具体网卡的。 网卡从网络收到数据后, 需要通过网卡通用接口把数据交给内核, 也要通过网卡通用接口从内核接收数据, 再发送到网络。 每一种类型的网卡从内核接收数据到交给硬件芯片, 或者数据从硬件芯片送给内核的过程都是不一样的, 这个过程需要网卡的制造商自己编写程序来实现, 这就是网卡驱动程序。

在Linux系统中, 网卡驱动程序是以模块的形式实现的, 一些知名公司生产的或市场上常见的网卡, 在Linux的发行版中一般都已经为其提供了驱动程序模块。 所有的网卡驱动程序模块都可以在/lib/module目录中找到, 该目录包含了一个与Linux内核版本有关的目录名称,如2.6.32-279.e16.i686,然后下面还有Kerne1/driver/net目录, 所有的网卡驱动程序都在这个目录中, 可以查看这个目录的内容:

#Is/lib/modules/2.6.32-279.e16.i686/kernel/drivers/net

3c59x.kodummy.ko netconsole.ko r8169.ko

tg3.ko

8189cp.ko e1000 ns83820.ko

s2io.kotlan.ko

8189too.ko e100.kopcmcia sis190.ko

tokenring

8390.ko epic100.ko panet32.ko

sis900.ko tulip

.

.

.

Chelsio natsemi.ko pppox.ko

sungem_phy.ko

D12k.ko ne2k-pci.koppp_synctty.ko sunhme.ko

以上文件中, 所有以.ko结尾的文件都是驱动模块, 还有一些子目录中包含了更多的驱动模块。 如果某一种网卡Linux内核不支持, 需要从另外的途径得到该网卡的驱动模块文件, 并把它复制到该目录中, 为了查看系统当前使用的网卡驱动模块, 或者要手动设置使用某以太网卡驱动模块, 在RHEL6中, 需要先查看或设置/etc/modprobe.conf文件, 该文件包含了有关模块的安装和别名信息。 下面是该文件的例子内容:

# more /etc/modprobe.conf

aliasscsi_hostadapter mptbase

alias scsi_hostadapter1 mptspi

alias snd-card-0 snd-ens1371

options snd-card-0 index=0

options snd-ens1371 index=0

remove snd-ens1371{/usr/sbin/alsactl store 0 >/dev/null 2>&1

|| : ; };

/sbin/m

odprobe -r --ignore-remove snd-ens1371

alias eth0 pcnet32

以上显示中, 最后一行 “aliaseth0pcnet32” 表示pcnet32模块定义了一个别名eth0。 也就是说, 目前使用的以太网卡接口eth0对应的模块是pcnet32。 此时, 肯定可以在前面的模块目录找到pcnet32.ko文件。 可以用以下命令查看当前系统装载的模块中是否有pcnet32模块:

[root@localhost 2.6.18-8.e15]#Ismod |grep pcnet32

pcnet32 35269 0

mii 9409 1 pcnet32

[root@localhost 2.6.18-8.e15]#

可以发现, pcnet32模块已经安装。 因此, 如果网卡已经被Linux检测到, 但执行 “if⁃config-a” 命令时却看不到eth0接口,可以按以上方法把网卡的驱动程序模块找到, 再看看这个模块是否已经装载。 如果在系统中找不到驱动模块, 则或者是Linux内核不支持所安装的网卡类型, 需要手动安装, 或者是由于某种原因, 当系统启动时没有自动装载网卡驱动模块。 下面在介绍系统自动装载网卡驱动模块的过程, 首先用一下命令查看pcnet32.ko模块的信息:

#mdoinfo /lib/modules/2.6.32-279.e16.i686/kernel/deivers/net/pc⁃net32.ko

filename: pcnet32.ko

license: GPL

description: Driver for PCnet32 and PCnet PCI based ether⁃cards

author: Thomas Bogendoerfer

srcversion: F81443556AAE169CBF80F55

alias: pci:v00001023d00002000sv∗sd∗bc02sc00i∗

alias: pci:v00001022d00002000sv∗sd∗bc∗sc∗i∗

alias: pci:v00001022d00002001sv∗sd∗bc∗sc∗i∗

depends: mii

cermagic: 2.6.18-8.e15 SMP mod_unload 686 REGPARM 4KSTACKS gcc-4.1

parm: debug:pcnet32 debug leve1 (int)

.

.

.

parm: homepna:pcnet32 mode for 79C978 cards (1 for

Home PNA, 0 for Ethernet,default Ethernet (array of int)

其中, alias参数指明了该网卡驱动模块对应的厂商ID、 设备ID及其他一些信息。 例如, 以上显示中第一个alias参数的值是 “pci: v00001023d00002000sv∗sd∗bc02sc00i∗”,表示厂商ID是00001023, 设备ID是00002000, 其他的一些内容是设备的子型号, “∗” 代表所有字符。这些表示方法和PCI规范相关。 此外, 再看/lib/modules/2.6.18-8.e15/mod⁃ules.alias文件的内容:

# more/lib/modules/2.6.18-8.e15/modules.alias |grep pcnet32

alias pci:v00001023d00002000sv∗sd∗bc02sc00i∗pcnet32

alias pci:v00001023d00002000sv∗sd∗bc∗sc∗pcnet32

alias pci:v00001023d00002001sv∗sd∗bc∗sc∗pcnet32

modules.alias文件的内容定义了系统所检测到的PCI设备使用哪些模块。 以上显示中,第一行表示Linux检测到 “aliaspci: v00001023d00002000sv∗sd∗bc02sc00i” 这样的设备时, 将装入并使用pcnet32模块, 这和前面看到的pcnet32.ko模块的信息是相对应的。

注意: 相对于Windows系统, Linux系统支持的网卡类型要少得多, 因此为Linux系统配备网卡时, 需要确定Linux发行版是否支持该网卡, 或者网卡是否提供了支持Linux的驱动程序。

3. 诊断网络层问题

网卡驱动模块装载后, 只要网络设置正确, 网卡接口一般就能激活, 网络接口层就能正常工作了, 接下来就应该诊断网络层是否有问题。 判断网络层工作是否正常最常用的工具是ping, 如果ping外网的某一个域名或IP能正常连通, 则说明网络层没有问题。

如果ping不通, 则需要确定是否对方有问题或对方的网络设置不对ping进行响应, 此时可以ping多个IP, 或者ping平常能通的IP。 如果还不通, 则可能会是自己的计算机有问题。

注意: 为了避免DNS解析故障对ping造成影响, 执行ping命令时, 尽量使用远程主机的IP地址, 而不要使用域名。

引起ping不通的原因很多, 可能会是网络线路、 网络设置、 路由和ARP等问题。 为了找到故障的原因, 可以先ping一下网关, 看是否能通。 因为网关肯定是位于本地子网的,本机与网关的通信是直接的, 不需要路由转发。 如果与网关能通, 一般就表明网络线路、 自己机子的网络设置和ARP都没有问题。 在Linux中, 可以通过route命令显示路由表, 然后得到网关的地址, 格式如下:

#route -n

Kernel IP routing table

Destination Gateway Genmask Flags Metric Ref Use

Iface

10.10.1.0 0.0.0.0 255.255.255.0 U 0 0

0 eth0

168.254.0.0 0.0.0.0 255.255.0.0 U 0 0

0 eth0

0.0.0.0 10.10.1.1 0.0.0.0 UG 0

00 eth0

在以上路由表中, 最后一行是默认路由, 所有与前面路由不匹配的数据包都将通过这条路由转发到默认网关, 网关地址是10.10.1.1。 如果路由表显示还有其他路由, 也可以ping一下该路由的网关看是否能通。 如果路由表中没有设置默认网关, 则表明是路由设置有问题, 此时需要通过route命令或在图形中设置默认网关。

如果路由设置没有问题, 而ping默认网关却不通, 在排除网络线路故障后, 需要检查本机的网络设置是否正确, 特别是IP地址。 如果网络接口设置成自动获取IP地址的, 需要确定IP和掩码是否已经正常获取, 方法是通过ifconfig命令查看各个接口当前的IP地址和掩码, 如果是静态设置IP的, 需要跟管理员确定地址的设置是否正确。 还有, 如果是通过拨号上网的, 有时虽然地址已经正常得到, 也可能会是拨号服务器有问题, 可以断开连接后重新拨号试一下。

与网关ping不通还有一种可能的原因是ARP问题。 有时, 局域网内存在ARP攻击或其他原因, 使本机ARP缓存中的网关IP的MAC地址是错误的, 也会造成与网关ping不通。此时,可以使用“arp-d<网关IP>” 命令删除网关的ARP条目,或者如果知道网关MAC地址,通过 “arp-a<网关IP><网关MAC>” 的形式设置静态ARP条目。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈