11.8. 设置网卡

Contributed by Marc Fonvieille.

现在我们不可想象一个计算机没有网络连接的情况。添加和配置一块网卡是任何 FreeBSD 系统管理员的一项基本任务。

11.8.1. 查找正确的驱动程序

在开始之前,你应该知道你的网卡类型,它用的芯片和它是 PCI 还是 ISA 网卡。FreeBSD 支持很多种 PCI 和 ISA 网卡。可以查看你的版本硬件兼容性列表以确定你的网卡被支持。

现在你已经确信你的网卡被支持了,你需要为这块网卡选择正确的驱动程序。/usr/src/sys/i386/conf/LINT 文件将会给你一些被支持的芯片/网卡驱动信息的列表。如果你对哪个是正确的驱动有疑问,阅读驱动的使用手册。手册会提供所支持硬件的更多信息和相关可能产生的问题。

如果你有一个普通的网卡,大多数时候你不需要为驱动浪费精力。常用的网卡在 GENERIC 内核中已经支持了,所以你的网卡在启动时就会显示出来,像是:

dc0: <82c169 PNIC 10/100BaseTX> port 0xa000-0xa0ff mem 0xd3800000-0xd38
000ff irq 15 at device 11.0 on pci0
dc0: Ethernet address: 00:a0:cc:da:da:da
miibus0: <MII bus> on dc0
ukphy0: <Generic IEEE 802.3u media interface> on miibus0
ukphy0:  10baseT, 10baseT-FDX, 100baseTX, 100baseTX-FDX, auto
dc1: <82c169 PNIC 10/100BaseTX> port 0x9800-0x98ff mem 0xd3000000-0xd30
000ff irq 11 at device 12.0 on pci0
dc1: Ethernet address: 00:a0:cc:da:da:db
miibus1: <MII bus> on dc1
ukphy1: <Generic IEEE 802.3u media interface> on miibus1
ukphy1:  10baseT, 10baseT-FDX, 100baseTX, 100baseTX-FDX, auto

在这个例子中,我们看到有两块使用 dc(4) 驱动的网卡在系统中。

为了使用网卡,需要装载正确的驱动程序。这可能通过两种途径来完成。最简单的方法是简单的用 kldload(8) 来装载一个驱动该网卡的内核模块。一个模块不是支持所有网卡驱动的(例如ISA 网卡用 ed(4) 来驱动)。另一种可选择的方法是你可以把支持你网卡的驱动静态的编译进内核。查看 /usr/src/sys/i386/conf/LINT 和手册中的驱动部分来了解把什么添加到你的内核配置文件中。可以查看 µÚ 8 章 以获得更多的重新编译内核的信息。如果你的网卡在启动时被你的内核(GENERIC)检测到了,那么就没有必要建立一个新内核了。

11.8.2. 配置网卡

现在正确的网卡驱动程序已经装载,那么就应该配置它了。跟其他配置一样,网卡可以在安装时用 sysinstall 来配置。

要显示你系统上的网络接口的配置,输入下列命令:

% ifconfig
dc0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500
        inet 192.168.1.3 netmask 0xffffff00 broadcast 192.168.1.255
        ether 00:a0:cc:da:da:da
        media: Ethernet autoselect (100baseTX <full-duplex>)
        status: active
dc1: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500
        inet 10.0.0.1 netmask 0xffffff00 broadcast 10.0.0.255
        ether 00:a0:cc:da:da:db
        media: Ethernet 10baseT/UTP
        status: no carrier
lp0: flags=8810<POINTOPOINT,SIMPLEX,MULTICAST> mtu 1500
lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> mtu 16384
        inet 127.0.0.1 netmask 0xff000000
tun0: flags=8010<POINTOPOINT,MULTICAST> mtu 1500

注: 老版本的 FreeBSD 可能需要在 ifconfig(8) 后面接 -a 选项,需要了解更多的 ifconfig(8) 语法请查阅使用手册。注意所有关于 IPv6 (inet6 等等) 的记录在这个例子里都被忽略了。

在这个例子中,显示出了下列设备:

FreeBSD 使用内核引导时检测到的网卡驱动顺序来命名网卡。例如 sis2 是系统中使用 sis(4) 驱动的第三块网卡。

在这个例子中,dc0 设备启用了。主要表现在:

  1. UP 表示这块网卡已经配置完成准备工作。

  2. 这块网卡有一个 Internet (inet) 地址 (这个例子中是 192.168.1.3)。

  3. 它有一个有效的子网掩码 (netmask0xffffff00 等同于 255.255.255.0)。

  4. 它有一个有效的广播地址 (这个例子中是 192.168.1.255)。

  5. 网卡的 MAC (ether) 地址是 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) 的输出显示了类似于:

dc0: flags=8843<BROADCAST,SIMPLEX,MULTICAST> mtu 1500
            ether 00:a0:cc:da:da:da

的信息,那么就是还没有配置网卡。

要配置网卡,你需要 root 权限。网卡配置可以通过使用 ifconfig(8) 命令行方式来完成,但是这样每次启动都要做一遍。放置网卡配置信息的文件是 /etc/rc.conf

用你自己喜欢的编辑器打开 /etc/rc.conf。并且你需要为每一块系统中存在的网卡添加一行,在我们的例子中,添加如下几行:

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 等内容。你应该应该查阅网卡驱动和 ifconfig(8) 的手册页来了解各选项,也要查看一下 rc.conf(5) 帮助页来了解 /etc/rc.conf 的语法。

如果在安装的时候配置了网络,关于网卡的一些行可能已经存在了。所以在添加新行前仔细检查一下 /etc/rc.conf

你也可能需要编辑 /etc/hosts 来添加局域网中不同的机器名称和 IP 地址,如果它们不存在,查看 hosts(5) 帮助和 /usr/share/examples/etc/hosts 以获得更多信息。

11.8.3. 测试和调试

/etc/rc.conf 做了必要的修改之后应该重启系统以应用对接口的修改,并且确认系统重启后没有任何配置错误。

系统重启后就应该测试网络接口了。

11.8.3.1. 测试以太网卡

为了确认网卡被正确的配置了,在这里我们要做两件事情。首先,ping 自己的网络接口,接着 ping 局域网内的其他机器。

首先测试本地接口:

% 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 局域网内的其他机器:

% 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

你如果你设置了 /etc/hosts 文件,也可以用机器名来替换 192.168.1.2

11.8.3.2. 调试

调试硬件和软件配置一直是一件头痛的事情,从最简单的开始可以减轻一些痛苦。例如网线是否插好了?是否配置好了网络服务?防火墙配置正确吗?是否使用了被 & os; 支持的网卡?在发送错误报告之前你应该查看一下硬件说明,升级 FreeBSD 到最新的 STABLE 版本,看一下邮件列表或者在 Internet 上搜索一下。

如果网卡工作了,但是性能底下,应该好好阅读一下 tuning(7) 帮助页。你也可以检查一下网络配置,一些不正确的设置会导致慢速的网络连接。

一些用户可能会在一些网卡上经历一到两次`` 设备超时(device timeouts)'',如果经常这样甚至引起麻烦,你要确定一下它跟其他设备没有冲突。仔细检查网线连接。可能这需要换一块网卡。

有时用户会看到少数的 ``监测者超时(watchdog timeout)'' 错误。这种情况要做的第一件事就是检查线缆连接。一些网卡需要支持总线控制的 PCI 插槽。在一些老的主板上,只有一个 PCI 插槽支持。(一般是 slot 0)。检查网卡和主板说明书来确定是不是这个问题。

``没有到主机的路由(No route to host)'' 的信息发生在如果系统不能发送一个路由到目的主机的包的时候。这在没有指定默认路由或者网线没有插上时会发生。检查 netstat -rn 的输出并确认有一个有效的路由能到达你要的主机。如果没有,请查阅 µÚ 24 章

``ping: 发送到: 访问被拒绝(ping: sendto: Permission denied)'' 错误信息经常因为一个配置错误的防火墙引起。如果 ipfw 在内核中启用了但是没有定义规则,那么默认的规则就是拒绝所有通讯,甚至 ping 请求!查阅 µÚ 14.8 节 以了解更多信息。

有时网卡性能底下或者低于平均水平,这种情况最好把传输媒介模式从 autoselect 改变为正确的传输媒介模式。这通常对大多数硬件有用,但是可能不会解决所有人的问题。接着,检查所有网络设置,并且阅读 tuning(7) 手册页。