12.5. 设置网卡

添加和配置网卡(NIC)是所有 FreeBSD 管理员的常规任务。

12.5.1. 找到合适的驱动

首先,确定网卡的型号及其使用的芯片。FreeBSD 支持多种类型的网卡,检查 FreeBSD 发行版的硬件兼容列表,看是否支持该网卡。

如果支持网卡,请确定该网卡的 FreeBSD 驱动程序的名称。参考 /usr/src/sys/conf/NOTES/usr/src/sys/arch/conf/NOTES 以了解带有支持的芯片组的一些信息的 网卡驱动程序列表。如果有疑问,请阅读驱动程序的手册页,因为它将提供更多关于支持的硬件和关于该驱动程序的已知限制。

普通网卡的驱动程序已经内置于 GENERIC 内核中,这意味着网卡应该在启动时被探测到。可以通过输入 more /var/run/dmesg.boot 并使用空格键滚动浏览文本来查看系统的启动信息。在这个例子中,系统上有两个使用 dc(4)open in new window 驱动的以太网卡:

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 中没有网卡的驱动程序,但你手头有一个可用的驱动程序,则需要在配置和使用网卡之前加载该驱动程序。这可以通过以下两种方式之一来实现:

  • 最简单的方法是使用 kldload(8)open in new window 为网卡加载一个内核模块。要想在启动时自动加载驱动程序,可以在 /boot/loader.conf 中添加相应的行。并非所有的网卡驱动都可以作为模块使用。
  • 或者,将网卡驱动静态地编译到自定义内核中。参考 /usr/src/sys/conf/NOTES/usr/src/sys/arch/conf/NOTES 和驱动程序的手册页面,以确定在自定义内核配置文件中加入哪一行。更多关于重新编译内核的信息,请参考配置 FreeBSD 内核open in new window。如果能在启动时检测到网卡,则不需要重新编译内核。

12.5.1.1. 使用 Windows® NDIS 驱动

不幸的是,仍然有许多供应商不向开源社区提供他们的驱动程序的源代码,因为他们把这些信息视为商业机密。因此,FreeBSD 和其他操作系统的开发者只能有两个选择:通过漫长而艰苦的逆向工程来开发驱动程序,或者使用现有的用于 Microsoft® Windows® 平台的驱动程序二进制文件。

FreeBSD 提供了对网络驱动接口规范(NDIS)的“原生”支持。它包括 ndisgen(8)open in new window,可以用来将 Windows® XP 驱动转换为可以在 FreeBSD上使用的格式。由于 ndis(4)open in new window 驱动程序使用的是 Windows® XP 二进制文件,它只能在 i386™ 和 amd64 架构上运行,支持 PCI、CardBus、PCMCIA 和 USB 设备。

要使用 ndisgen(8)open in new window,需要以下准备:

  1. FreeBSD 的内核源码。
  2. 一个带有 .SYS 后缀的 Windows® XP 驱动程序。
  3. 一个带有 .INF 后缀的 Windows® XP 驱动配置文件。

你可以为你的网卡下载这些 .SYS.INF 文件,这些通常能在驱动的光盘里或者提供商的网站上找到。接下来的例子我们将使用 W32DRIVER.SYSW32DRIVER.INF

驱动程序的位宽必须与 FreeBSD 的版本相匹配。对于 FreeBSD/i386,需要使用 Windows® 32 位驱动;对于 FreeBSD/amd64,需要使用 Windows® 64 位驱动。

下一步是将驱动的二进制文件编译成可加载的内核模块。用 root 执行 ndisgen(8)open in new window

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

这个命令是交互式的,并提示它需要的任何额外信息。之后,一个新的内核模块将在当前目录下生成,使用 kldload(8)open in new window 来加载新模块:

# kldload ./W32DRIVER_SYS.ko

除了生成的内核模块外,还必须加载 ndis.koif_ndis.ko 模块。当所有依赖 ndis(4)open in new window 的模块被加载时,会自动执行。如果没有,请使用下列命令手动加载它们:

# kldload ndis
# kldload if_ndis

其中,第一条命令加载 ndis(4)open in new window miniport 驱动 wrapper,第二条命令加载生成的网卡驱动。

检查 dmesg(8)open in new window,看看是否有任何加载错误。如果一切顺利,输出应该与下面类似:

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 进行配置。

要配置系统在启动时加载 ndis(4)open in new window 模块,将生成的模块 W32DRIVER_SYS.ko 复制到 /boot/modules。然后,在 /boot/loader.conf 中添加以下一行:

W32DRIVER_SYS_load="YES"

12.5.2. 配置网卡

如果为网卡加载了正确的驱动程序,就需要对网卡进行配置。在安装时,可能已经通过 bsdinstall(8)open in new window 进行了配置。

要显示网卡配置,请输入以下命令:

% 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:回环设备。

FreeBSD 使用驱动程序的名称和启动时检测到的网卡的顺序来命名网卡。例如,sis2 是系统中使用 sis(4)open in new window 驱动程序的第三块网卡。

在这个例子中,dc0 已经启动并运行,关键指标为:

  1. UP 表示网卡已经被配置好了并且能使用。
  2. 这张网卡有一个网络(inet)地址,是 192.168.1.3
  3. 这个有一个合法的子网掩码(netmask),其中 0xffffff00255.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 的,表明检测到了载波信号。对于 dc1,当以太网电缆没有插入卡中时,将显示:status: no carrier

如果 ifconfig(8)open in new window 的输出是像这样的:

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 身份进行配置该卡。网卡配置可以在命令行中用 ifconfig(8)open in new window 执行,但在重启后将不会持续,除非配置也被添加到 /etc/rc.conf 中。如果局域网上有 DHCP 服务器,只需添加这一行即可:

ifconfig_dc0="DHCP"

请用系统的正确值替换 dc0

添加这一行后,按照测试和故障排除open in new window中的说明进行操作。

注意

如果网络在安装过程中就已经配置了,网卡的一些条目就可能已经存在。在对 /etc/rc.conf 进行任何添加前,请仔细检查。

如果没有 DHCP 服务器,则必须手动配置网卡。如本例所示,为系统中的每个网卡添加一行:

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 地址信息。关于允许的选项和 /etc/rc.conf 的语法的更多细节,请参考驱动程序、ifconfig(8)open in new windowrc.conf(5)open in new window 的手册页面。

如果网络没有使用 DNS,请编辑 /etc/hosts,如果局域网上的主机配置还没有在那里的话,添加它们的主机名称和 IP 地址。欲了解更多信息,请参考 hosts(5)open in new window 的手册页面和 /usr/share/examples/etc/hosts

注意

如果没有 DHCP 服务器,且需要访问互联网,请手动配置默认的 gateway 和 nameserver:

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

12.5.3. 测试和故障排除

保存了对 /etc/rc.conf 的必要更改后,就可以使用重新启动来测试网络配置,并验证系统重新启动时没有出现任何配置错误。或者,通过下面的命令将这些设置应用到网络系统:

# service netif restart

如果在 /etc/rc.conf 中设置了默认网关,也可以执行以下命令:

# service routing restart

重新启动网络系统后,测试网卡。

12.5.3.1. 测试以太网卡

为了验证以太网卡的配置是否正确,先 ping(8)open in new window 接口本身,然后再 ping(8)open in new window 局域网上的另一台机器。

% 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

要测试网络解析 (network resolution),请使用主机名而不是 IP 地址。如果网络上没有 DNS 服务器,必须首先配置 /etc/hosts。为此,编辑 /etc/hosts,添加局域网上主机的名称和 IP 地址,如果它们还没有在那里。欲了解更多信息,请参考 hosts(5)open in new window/usr/share/examples/etc/hosts

12.5.3.2. 故障排除

在排除硬件和软件配置的故障时,请首先检查简单的东西。网线是否插好了?网络服务的配置是否正确?防火墙的配置是否正确?这个网卡是否被 FreeBSD 支持?在发送错误报告之前,一定要检查硬件说明,将 FreeBSD 的版本更新到最新的 STABLE 版本,然后检查邮件列表的存档,并在互联网上搜索。

如果网卡可以使用,但性能却很差,请阅读 tuning(7)open in new window。另外,检查网络配置,因为不正确的网络设置也会导致连接缓慢。

有些用户遇到一两个 device timeout 的信息,这对某些网卡来说是正常的。如果它们继续存在,或令人烦恼,请确定该设备是否与其他设备冲突,仔细检查电缆的连接,并考虑尝试另一块网卡。

要解决 watchdog timeout 错误,首先检查网线。许多网卡需要一个支持总线主控的 PCI 插槽。在一些旧主板上,只有一个 PCI 插槽允许,通常是 0 号插槽。检查网卡和主板文档,以确定这是否可能是问题所在。

如果系统无法将数据包路由到目标主机,就会出现 No route to host 的信息。如果没有指定默认路由或拔掉电缆,就会发生这种情况。检查 netstat -rn 的输出,确保有一个到主机的有效路由。如果没有,请阅读网关和路由open in new window

ping: sendto: Permission denied 的错误信息通常是由防火墙的配置错误引起的。如果在 FreeBSD 上启用了防火墙,但没有定义规则,那默认策略是拒绝所有流量,甚至是 ping(8)open in new window。更多信息请参考防火墙open in new window

有时网卡的性能很差或低于平均水平。在这些情况下,尝试将媒体选择模式从 sutoselect 设置为正确的媒体选择。虽然这对大多数硬件有效,但它也可能没法解决这个问题。同样,检查所有的网络设置,并参考 tuning(7)open in new window

Loading...