11.5. 设定网络界面卡

Contributed by Marc Fonvieille.

对FreeBSD管理者来说加入与设定网络界面卡(Network Interface Card,NIC)会是一件常见的工作。

11.5.1. 找到正确的驱动程序

首先,要先确定NIC的型号及其使用的芯片。FreeBSD支持各种NIC,可检查该FreeBSD发布版本的硬件兼容性清单来查看是否有支持该NIC

若有支持该NIC,接着要确定该NIC所要需要的FreeBSD驱动程序名称。请参考/usr/src/sys/conf/NOTES/usr/src/sys/arch/conf/NOTES来取得NIC驱动程序清单及其支持的晶片组相关资讯。当有疑问是,请阅读该驱动程序的操作手册,会有提供更多有关支持硬件及该驱动程序已知问题的信息。

GENERIC核心已有内含常见NIC的驱动程序,意思是在开机时应该会侦测到NIC。可以输入more /var/run/dmesg.boot来检视系统的开机信息并使用空白键卷动文字。在此例中,两个以太网络NIC使用系统已有的dc(4)驱动程序:

dc0: <82c169 PNIC 10/100BaseTX> port 0xa000-0xa0ff mem 0xd3800000-0xd38
000ff irq 15 at device 11.0 on pci0
miibus0: <MII bus> on dc0
bmtphy0: <BCM5201 10/100baseTX PHY> PHY 1 on miibus0
bmtphy0:  10baseT, 10baseT-FDX, 100baseTX, 100baseTX-FDX, auto
dc0: Ethernet address: 00:a0:cc:da:da:da
dc0: [ITHREAD]
dc1: <82c169 PNIC 10/100BaseTX> port 0x9800-0x98ff mem 0xd3000000-0xd30
000ff irq 11 at device 12.0 on pci0
miibus1: <MII bus> on dc1
bmtphy1: <BCM5201 10/100baseTX PHY> PHY 1 on miibus1
bmtphy1:  10baseT, 10baseT-FDX, 100baseTX, 100baseTX-FDX, auto
dc1: Ethernet address: 00:a0:cc:da:da:db
dc1: [ITHREAD]

若在GENERIC中没有该NIC的驱动程序,但有可用的驱动程序,那么在设定及使用NIC前要先加载该驱动程序,有两种方式可以完成这件事:

  • 最简单的方式是使用kldload(8)加载NIC要使用的核心模块。要在开机时自动加载,可加入适当的设定到/boot/ loader.conf。不是所有NIC驱动程序皆可当做模块使用。

  • 或者,静态编译对NIC的支持到自定义核心,请参考/usr/src/sys/conf/NOTES/usr/src/sys/arch/conf/NOTES及驱动程序的操作手册来了解要在自定义核心配置文件中要加入那些设定。要取得更多有关重新编译核心的信息可参考第 8 章 配置 FreeBSD 内核。若在开机时有侦测到NIC,就不需要再重新编译核心。

11.5.1.1. 使用Windows® NDIS驱动程序

很不幸的,仍有很多供应商并没有提供它们驱动程序的技术文件给开源社群,因为这些文件涉及商业机密。因此,FreeBSD及其他操作系统的开发人员只剩下两种方案可以选择:通过长期艰苦的做逆向工程来开发驱动程序或是使用现有供Microsoft® Windows®平台用的二进制驱动程序。

FreeBSD对Network Driver Interface Specification(NDIS)有提供原生的支持,这包含了ndisgen(8)可用来转换Windows® XP驱动程序成可在FreeBSD上使用的格式。由于ndis(4)驱动程序使用的是Windows® XP binary,所以只能在i386™及amd64系统上执行。PCI,CardBus,PCMCIA以及USB装置也都有支持。

要使用ndisgen(8)需要三样东西:

  1. FreeBSD核心源码。

  2. Windows® XP 二进制驱动程序,扩展名为 .SYS

  3. Windows® XP 驱动程序配置文件,扩展名为 .INF

下载供指定NIC使用的.SYS.INF档。通常这些档案可以在驱动程序CD或者供应商的网站上找到。以下示例会使用W32DRIVER.SYSW32DRIVER.INF

驱动程序的位宽度必须与FreeBSD的版本相符。例如FreeBSD/i386需要使用Windows® 32-bit驱动程序,而FreeBSD/amd64则需要使用Windows® 64-bit驱动程序。

下个步骤是编译驱动程序Binary成可加载的核心模块。以root身份使用ndisgen(8)

# ndisgen /path/to/W32DRIVER.INF /path/to/W32DRIVER.SYS

这个指令是互动式的,会提示输入任何所需的额外信息,新的核心模块会被产生在目前的目录,使用kldload(8)来加载新的模块:

# kldload ./W32DRIVER_SYS.ko

除了产生的核心模块之外,ndis.ko以及if_ndis.ko也必须加载,会在任何有相依ndis(4)的模块被加载时一并自动加载。若没有自动加载,则需使用以下指令手动加载:

# kldload ndis
# kldload if_ndis

第一个指令会加载ndis(4) miniport驱动程序包装程序,而第二个指令会加载产生的NIC驱动程序。

检查dmesg(8)查看是否有任何加载错误,若一切正常,输出结果应会如下所示:

ndis0: <Wireless-G PCI Adapter> mem 0xf4100000-0xf4101fff irq 3 at device 8.0 on pci1
ndis0: NDIS API version: 5.0
ndis0: Ethernet address: 0a:b1:2c:d3:4e:f5
ndis0: 11b rates: 1Mbps 2Mbps 5.5Mbps 11Mbps
ndis0: 11g rates: 6Mbps 9Mbps 12Mbps 18Mbps 36Mbps 48Mbps 54Mbps

到此之后ndis0可以像任何其他NIC设定使用。

要设定系统于开机时加载ndis(4)模块,可复制产生的模块W32DRIVER_SYS.ko/boot/modules。然后加入下行到/boot/loader.conf

W32DRIVER_SYS_load="YES"

11.5.2. 设定网络卡

加载正确的NIC驱动程序之后,接着需要设定界面卡,这个动作可能在安装时已经使用bsdinstall(8)设定过了。

要查看NIC设定可输入以下指令:

% ifconfig
dc0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
        options=80008<VLAN_MTU,LINKSTATE>
        ether 00:a0:cc:da:da:da
        inet 192.168.1.3 netmask 0xffffff00 broadcast 192.168.1.255
        media: Ethernet autoselect (100baseTX <full-duplex>)
        status: active
dc1: flags=8802<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
        options=80008<VLAN_MTU,LINKSTATE>
        ether 00:a0:cc:da:da:db
        inet 10.0.0.1 netmask 0xffffff00 broadcast 10.0.0.255
        media: Ethernet 10baseT/UTP
        status: no carrier
lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> metric 0 mtu 16384
        options=3<RXCSUM,TXCSUM>
        inet6 fe80::1%lo0 prefixlen 64 scopeid 0x4
        inet6 ::1 prefixlen 128
        inet 127.0.0.1 netmask 0xff000000
        nd6 options=3<PERFORMNUD,ACCEPT_RTADV>

在这个例子中列出了以下装置:

  • dc0:第一个以太网络界面。

  • dc1:第二个以太网络界面。

  • lo0:Loopback装置。

FreeBSD会使用驱动程序名称接着开机时所侦测到的界面卡顺序来命名NIC。例如sis2是指在系统上使用sis(4)驱动程序的第三个NIC

在此例中,dc0已经上线并且执行中。主要的依据有:

  1. UP代表界面卡已设定好并且准备就绪。

  2. 界面卡有网际网络(inet)位址,192.168.1.3

  3. 界面卡有一个有效的子网络掩码(netmask),其中0xffffff00等同于255.255.255.0

  4. 界面卡有一个有效的广播位址,192.168.1.255

  5. 界面卡(ether)的MAC位址是00:a0:cc:da:da:da

  6. 实体媒介选择为自动选择模式(media: Ethernet autoselect(100baseTX <full-duplex>))。在本例中dc1被设定使用10baseT/UTP媒介。要取得更多有关可用的驱动程序媒介类型请参考操作手册。

  7. 连接的状态(status)为使用中(active),代表有侦测到载波信号(Carrier Signal)。若dc1所代表的界面卡未插入以太网路线则状态为status: no carrier是正常的。

ifconfig(8)的输出结果如下:

dc0: flags=8843<BROADCAST,SIMPLEX,MULTICAST> metric 0 mtu 1500
	options=80008<VLAN_MTU,LINKSTATE>
	ether 00:a0:cc:da:da:da
	media: Ethernet autoselect (100baseTX <full-duplex>)
	status: active

则代表尚未设定界面卡。

界面卡必须以root来设定。NIC的设定可在指令列执行ifconfig(8)来完成,但重新开机之后变会消失,除非将设定也加到/etc/rc.conf。若在LAN中有DHCP服务器,则只需加入此行:

ifconfig_dc0="DHCP"

替换dc0为该系统的正确值。

加入这行之后,接着依据第 11.5.3 节 “测试和故障排除”指示操作。

注意:

若网络在安装时已设定,可能会已经有NIC的设定项目。在加入任何设定前请再次检查/etc/rc.conf

在这个例中,没有DHCP服务器,必须手动设置NIC。为每个 NIC 添加配置,就像下面这样:

ifconfig_dc0="inet 192.168.1.3 netmask 255.255.255.0"
ifconfig_dc1="inet 10.0.0.1 netmask 255.255.255.0 media 10baseT/UTP"

替换dc0dc1以及 IP 位址信息为系统的正确值。请参考驱动程序的操作手册、ifconfig(8)以及rc.conf(5)取得更多有关可用的选项及/etc/rc.conf的语法。

若网络没有使用DNS,则编辑/etc/hosts加入LAN上主机的名称与 IP 位址。要取得更多资讯请参考hosts(5)/usr/share/examples/etc/hosts

注意:

若没有DHCP服务器且需要存取网际网络,那么需要手动设定预设网关及名称服务器:

# echo 'defaultrouter="your_default_router"' >> /etc/rc.conf
# echo 'nameserver your_DNS_server' >> /etc/resolv.conf

11.5.3. 测试和故障排除

必要的变更储存到/etc/rc.conf之后,需要重新启动系统来测试网络设定并检查系统重新启动是否没有任何设定错误。或者使用这个指令将设定套用到网络系统:

# service netif restart

注意:

若预设的通信闸已设定于/etc/rc.conf也同样要下这个指令:

# service routing restart

网络系统重新启动后,便可接着测试NIC

11.5.3.1. 测试以太网卡

要检查以太网路卡是否已正确设定可ping(8)界面卡自己,然后ping(8)其他于LAN上的主机:

% ping -c5 192.168.1.3
PING 192.168.1.3 (192.168.1.3): 56 data bytes
64 bytes from 192.168.1.3: icmp_seq=0 ttl=64 time=0.082 ms
64 bytes from 192.168.1.3: icmp_seq=1 ttl=64 time=0.074 ms
64 bytes from 192.168.1.3: icmp_seq=2 ttl=64 time=0.076 ms
64 bytes from 192.168.1.3: icmp_seq=3 ttl=64 time=0.108 ms
64 bytes from 192.168.1.3: icmp_seq=4 ttl=64 time=0.076 ms

--- 192.168.1.3 ping statistics ---
5 packets transmitted, 5 packets received, 0% packet loss
round-trip min/avg/max/stddev = 0.074/0.083/0.108/0.013 ms
% ping -c5 192.168.1.2
PING 192.168.1.2 (192.168.1.2): 56 data bytes
64 bytes from 192.168.1.2: icmp_seq=0 ttl=64 time=0.726 ms
64 bytes from 192.168.1.2: icmp_seq=1 ttl=64 time=0.766 ms
64 bytes from 192.168.1.2: icmp_seq=2 ttl=64 time=0.700 ms
64 bytes from 192.168.1.2: icmp_seq=3 ttl=64 time=0.747 ms
64 bytes from 192.168.1.2: icmp_seq=4 ttl=64 time=0.704 ms

--- 192.168.1.2 ping statistics ---
5 packets transmitted, 5 packets received, 0% packet loss
round-trip min/avg/max/stddev = 0.700/0.729/0.766/0.025 ms

要测试网络解析,可使用主机名称来替代IP位址。若在网路上没有DNS服务器则必须先设定/etc/hosts,若主机尚未设定到/etc/hosts中,则需编辑/etc/hosts加入LAN上主机的名称及IP位址,要取得更多资讯请参考hosts(5)/usr/share/examples/etc/hosts

11.5.3.2. 故障排除

在排除硬件及软件设定问题时,要先检查几件简单的事。网路线插上了没?网络的服务都正确设定了吗?防火墙设定是否正确?FreeBSD是否支持该NIC?在回报问题之前,永远要先检查Hardware Notes、更新FreeBSD到最新的STABLE版本、检查邮递论坛封存记录以及上网查询。

若界面卡可以运作,但是性能很差,请阅读tuning(7),同时也要检查网络设定,因为不正确的网络设定会造成连接速度缓慢。

部份使用者会遇到一次或两次device timeout的信息,在对某些界面卡是正常的。若信息持续发生或很烦的,请确认是否有与其他的装置冲突,再次检查网路线,或考虑使用其他介面卡。

要解决watchdog timeout错误,先检查网路线。许多界面卡需要使用支持Bus Mastering的PCI插槽,在一些旧型的主板,只会有一个PCI插槽支持,通常是插槽0。检查NIC以及主板说明文件来确定是否为此问题。

若系统无法路由传送封包到目标主机则会出现No route to host信息,这可能是因为没有指定预设的路由或未插上网路线。请检查netstat -rn的输出并确认有一个有效的路由可联机至主机,若没有,请阅读第 31.2 节 “网关和路由”

造成ping: sendto: Permission denied错误讯息的原因通常是防火墙设定错误。若在FreeBSD上有开启防火墙,但却未定义任何的规则,预设的原则是拒绝所有传输,即使是用ping(8)。请参考第 30 章 防火墙取得更多资讯。

有时界面卡的性能很差或低于平均值,在这种情况可尝试设定媒介选择模式由autoselect更改为正确的媒介选项,虽然这在大部份硬件可运作,但可能无法解决问题,同样的,检查所有网络设定并参考tuning(7)

本文档和其它文档可从这里下载: ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/.

如果对于FreeBSD有问题,请先阅读 文档,如不能解决再联系 <questions@FreeBSD.org>.

关于本文档的问题请发信联系 <doc@FreeBSD.org>.