12.5. 设置网卡

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

12.5.1. 找到合适的驱动

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

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

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

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

如果 GENERIC 中没有 NIC 的驱动程序,但你手头有一个可用的驱动程序,则需要在配置和使用 NIC 之前加载该驱动程序。这可以通过以下两种方式之一来实现:

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

12.5.1.1. 使用 Windows® NDIS 驱动

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

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

要使用 ndisgen(8) , 需要以下准备:

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

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

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

下一步是将驱动的二进制文件编译成可加载的内核模块。作为 root,使用 ndisgen(8)

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

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

  1. # kldload ./W32DRIVER_SYS.ko

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

  1. # kldload ndis
  2. # kldload if_ndis

其中,第一条命令加载 ndis(4) miniport 驱动包装器,第二条命令加载生成的网卡驱动。

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

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

在这里,ndis0可以像其他网卡一样进行配置。

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

  1. W32DRIVER_SYS_load="YES"

12.5.2. 配置网卡

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

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

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

在这个例子中,以下设备被显示出来:

  • dc0 : 第一个以太网口
  • dc1 : 第二个以太网口
  • lo0: 回环设备

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

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

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

如果 ifconfig(8) 的输出是像这样的:

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

这表明该卡还没有被配置。

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

  1. ifconfig_dc0="DHCP"

请用系统的正确值替换dc0

添加这一行后,按照《12.5.3. 测试和故障排除》中的说明进行操作。

注意

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

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

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

用系统的正确值替换 dc0dc1 以及 IP 地址信息。关于允许的选项和 /etc/rc.conf 的语法的更多细节,请参考驱动程序、ifconfig(8)rc.conf(5) 的手册页面。

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

注意

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

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

12.5.3. 测试和故障排除

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

  1. # service netif restart

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

  1. # service routing restart

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

12.5.3.1. 测试以太网卡

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

  1. % ping -c5 192.168.1.3
  2. PING 192.168.1.3 (192.168.1.3): 56 data bytes
  3. 64 bytes from 192.168.1.3: icmp_seq=0 ttl=64 time=0.082 ms
  4. 64 bytes from 192.168.1.3: icmp_seq=1 ttl=64 time=0.074 ms
  5. 64 bytes from 192.168.1.3: icmp_seq=2 ttl=64 time=0.076 ms
  6. 64 bytes from 192.168.1.3: icmp_seq=3 ttl=64 time=0.108 ms
  7. 64 bytes from 192.168.1.3: icmp_seq=4 ttl=64 time=0.076 ms
  8. --- 192.168.1.3 ping statistics ---
  9. 5 packets transmitted, 5 packets received, 0% packet loss
  10. round-trip min/avg/max/stddev = 0.074/0.083/0.108/0.013 ms
  1. % ping -c5 192.168.1.2
  2. PING 192.168.1.2 (192.168.1.2): 56 data bytes
  3. 64 bytes from 192.168.1.2: icmp_seq=0 ttl=64 time=0.726 ms
  4. 64 bytes from 192.168.1.2: icmp_seq=1 ttl=64 time=0.766 ms
  5. 64 bytes from 192.168.1.2: icmp_seq=2 ttl=64 time=0.700 ms
  6. 64 bytes from 192.168.1.2: icmp_seq=3 ttl=64 time=0.747 ms
  7. 64 bytes from 192.168.1.2: icmp_seq=4 ttl=64 time=0.704 ms
  8. --- 192.168.1.2 ping statistics ---
  9. 5 packets transmitted, 5 packets received, 0% packet loss
  10. 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)/usr/share/examples/etc/hosts

12.5.3.2. 故障排除

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

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

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

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

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

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

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