3. 客户端设置

目前,Linux 有三种不同的 DHCP 客户端程序:dhcpcd、pump 和 dhclient。本 mini-HOWTO 主要介绍 dhcpcd。

3.1. 下载客户端守护程序 (dhcpcd)

根据您的发行版,您可能需要下载 DHCP 客户端守护程序。如果您想从源代码包编译它,您需要的包名为 dhcpcd,当前版本为 1.3.18。它由 Sergei Viznyuk 维护如今,大多数发行版都将其作为二进制包提供。

可以从以下位置下载 dhcpcd 源代码

然后按照以下说明操作。它们应该是相同的。

3.2. Slackware

您可以从任何 Metalab 镜像或以下位置下载最新版本的 DHCPcd

下载最新版本dhcpcd.tar.gz.

这将创建目录 /etc/dhcpc,DHCPcd 将在其中存储 DHCP 信息,并且 dhcpcd 文件将被复制到 /usr/sbin。

为了使系统在启动时使用 DHCP 初始化,输入

cd /etc/rc.d

mv rc.inet1 rc.inet1.OLD

这将把旧的网络初始化脚本移动到rc.inet1.OLD。您现在需要创建新的rc.inet1脚本。以下代码是您需要的全部内容

#!/bin/sh
#
# rc.inet1      This shell script boots up the base INET system.

HOSTNAME=`cat /etc/HOSTNAME` #This is probably not necessary but I
                             #will leave it in anyways

# Attach the loopback device.
/sbin/ifconfig lo 127.0.0.1
/sbin/route add -net 127.0.0.0 netmask 255.0.0.0 lo

# IF YOU HAVE AN ETHERNET CONNECTION, use these lines below to configure the
# eth0 interface. If you're only using loopback or SLIP, don't include the
# rest of the lines in this file.

/usr/sbin/dhcpcd

保存并重启您的计算机。

完成后,转到最后一步

3.3. RedHat 6.x 和 Mandrake 6.x

RedHat 6.0+ 下的 DHCPcd 配置非常容易。您需要做的就是通过输入 control-panel 启动控制面板。

请注意,在 RedHat 6.x 中,Redhat 默认包含一个名为 pump 的 DHCP 客户端,而不是上面提到的 dhcpcd。CD-ROM 包含 dhcpcd RPM,因此如果您使用 pump 运气不佳,请尝试使用 dhcpcd。安装 dhcpcd 后(例如,rpm -i dhcpcd-1.3.17pl2-1.i386.rpm),您将需要进行一些更改

来自 Alexander Stevenson 的其他说明:

我使用 DHCPcd 没有成功。最终对我有效的是“pump”,它随 Linux Mandrake 6.0 一起提供(所以我认为它也包含在 RedHat 中)。我使用的命令是

pump -i eth0 -h hostname

“hostname”是什么并不重要,但没有它,服务器不会响应。

然后我更改了我的/sbin/ifup脚本中的行以反映更改;默认版本没有 -h 开关,因此对我不起作用。

基本上,如果您使用 linuxconf,并且在将适配器设置为“DHCP”后仍然不起作用,请尝试在/sbin/ifup脚本的 pump 行中添加 “-h hostname”。我的脚本现在看起来像这样

...
if [ -n "$PUMP" ]; then
    echo -n "Determining IP information for $DEVICE..."
    if /sbin/pump -i $DEVICE -h hostname; then
        echo " done."
    else
        echo " failed."
        exit 1
    fi
else ...

Aad van der Klaauw 提供了另一种更优雅的方式来添加主机名字段

目前,我正在家中配置网关系统,需要设置 MAC 地址并使用 '-h hostname' 解决方法。所以我决定 *不* 更改脚本,而是使用配置文件。在我的 /etc/sysconfig/network-scripts/ifcfg-eth0 中,我添加了以下内容

DEVICE="eth0"
MACADDR="00:11:22:33:44:55"
DHCP_HOSTNAME="trigger_for_terayon"

这将会在升级后仍然存在,并且在我看来是一种“更干净”的方式。

就是这样。重启您的机器或在命令行中输入 /sbin/ifup eth0

3.4. RedHat 5.x

RedHat 5.0+ 下的 DHCPcd 配置非常容易。您需要做的就是通过输入 control-panel 启动控制面板。

完成后,转到最后一步

3.5. RedHat 4.x 和 Caldera OpenLinux 1.1/1.2

DHCPcd 包含在标准的 RedHat 发行版中,作为一个 RPM,您可以在发行版的 CD-ROM 的 RPMS 目录中找到它,或者您可以从以下位置下载它

ftp://ftp.redhat.com/pub/redhat/redhat-4.2/i386/RedHat/RPMS/dhcpcd-0.6-2.i386.rpm

使用 rpm -i dhcpcd-0.6-2.i386.rpm 安装它。

或者,您可以按照 Slackware 中概述的步骤编译您自己的版本。

以下信息由 nothing 提供给我.

/etc/resolv.conf中删除了我的静态 IP 和名称。但是,我确实保留了搜索行和我的两个 nameserver 行(由于某种原因,我的 dhcpcd 从未创建/etc/dhcpc/resolv.conf,所以我必须使用静态/etc/resolv.conf).

/etc/sysconfig/network中,我删除了 HOSTNAME 和 GATEWAY 条目。我保留了其他条目不变(NETWORKING、DOMAINNAME、GATEWAYDEV)。

/etc/sysconfig/network-scripts/ifcfg-eth0我删除了 IPADDR、NETMASK、NETWORK 和 BROADCAST 条目。我保留了 DEVICE 和 ONBOOT 不变。我将 BOOTPROTO 行更改为 BOOTPROTO=dhcp。

保存文件。重启您的计算机。

完成后,转到最后一步

3.6. Debian

http://ftp.debian.org/debian/dists/slink/main/binary-i386/net/

有一个 DHCPcd 的 deb 包(确保它以 dhcpcd 开头)。或者,按照 Slackware 安装说明进行操作。

要解压缩 deb 包,输入 dpkg -i /where/ever/your/debian/packages/are/dhcpcd*deb

似乎不需要任何 DHCPcd 配置,因为

 

dhcpcd 包将其启动脚本安装为 Debian 包的通常方式,在/etc/init.d/package_name中,这里是/etc/init.d/dhcpcd,并将此链接到各种/etc/rc?.d/目录。

 
--来自:Heiko Schlittermann  

然后,在启动时执行/etc/rc?.d/目录的内容。

如果您在安装后不重启,您应该考虑手动启动守护程序:/etc/init.d/dhcpcd start

完成后,转到最后一步

3.7. LinuxPPC 和 MkLinux

以下部分由 R. Shapiro 编写

截至“1999”(R5)版本,Linuxppc 现在几乎完全兼容 Redhat 6,只有一个注意事项(见下文)。一般来说,说明与当前版本的 RedHat 6.x 和 Mandrake 6.x 完全相同。

剩下的问题是 Redhat 6 默认使用 'pump' 客户端进行 dhcp,而 'pump' 在 Linuxppc 中不能可靠地工作。为了解决这个问题,您应该从 Sergei Viznyuk 安装最新的 dhcpcd,然后编辑/sbin/ifup以使用 dhcpcd 而不是 pump

更改

if [ "$BOOTPROTO" = bootp -o "$BOOTPROTO" = dhcp ]; then
     PUMP=true
 fi

 if [ -n "$PUMP" ]; then

 if [  "$BOOTPROTO" = bootp ]; then
       echo " done."
     else
       echo " failed."
       exit 1
     fi
 elif [ "$BOOTPROTO" = dhcp ]; then
     echo -n "Determining IP information for $DEVICE..."
     if /sbin/dhcpcd -d $DEVICE ; then
       if [ -f /etc/dhcpc/dhcpcd-${DEVICE}.exe ]; then
           /etc/dhcpc/dhcpcd-${DEVICE}.exe
       fi

以及 ifdown 的相应更改。更改

if [ "$BOOTPROTO" = bootp -o "$BOOTPROTO" = dhcp ]; then
....
fi

if [ "$BOOTPROTO" = bootp ]; then
fi

if [ "$BOOTPROTO" = dhcp ]; then
      if [ -f /var/run/dhcpcd-${DEVICE}.pid ]; then
              kill `cat /var/run/dhcpcd-${DEVICE}.pid`
              rm -f /var/run/dhcpcd-${DEVICE}.pid
      fi
fi

Linuxppc 1999 cd 中包含一个可用的 ppc rpm for dhcpcd;contrib 目录中提供了稍后版本的 rpm,网址为 ftp://ftp.linuxppc.org/。源代码(可在 Linuxppc 1999 中开箱即用编译)可从 ftp://ftp.phystech.com/pub/dhcpcd-1.3.17-pl9.tar.gz 获取。

3.8. 将所有内容联系起来

机器重启后,您的网络接口应该已配置。输入:ifconfig

您应该得到类似这样的结果

          lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Bcast:127.255.255.255  Mask:255.0.0.0
          UP BROADCAST LOOPBACK RUNNING  MTU:3584  Metric:1
          RX packets:302 errors:0 dropped:0 overruns:0 frame:0
          TX packets:302 errors:0 dropped:0 overruns:0 carrier:0 coll:0

eth0      Link encap:Ethernet  HWaddr 00:20:AF:EE:05:45
          inet addr:24.128.53.102  Bcast:24.128.53.255  Mask:255.255.254.0
          ^^^^^^^^^^^^^^^^^^^^^^^
          UP BROADCAST NOTRAILERS RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:24783 errors:1 dropped:1 overruns:0 frame:1
          TX packets:11598 errors:0 dropped:0 overruns:0 carrier:0 coll:96
          Interrupt:10 Base address:0x300 

如果您在inet addr下看到一些正常的数字,则表示设置完成。如果您看到 0.0.0.0,请不要绝望,这是 dhcpcd 获取 IP 地址之前的临时设置。如果即使几分钟后您仍然看到 0.0.0.0,请查看 故障排除。DHCPcd 是一个守护程序,只要您的机器开机,它就会一直运行。每三个小时,它会联系 DHCP 服务器并尝试续订 IP 地址租约。它会将所有消息记录在 syslog 中(在 Slackware 上是/var/adm/syslog,RedHat/OpenLinux 是/var/log/syslog).

最后一件事情。您需要指定您的名称服务器。有两种方法可以做到这一点,您可以要求您的提供商为您提供名称服务器的地址,然后将这些地址放在/etc/resolv.conf中,或者 DHCPcd 将从 DHCP 服务器获取列表并构建一个resolv.conf/etc/dhcpc.

中。我决定使用 DHCPcd 的resolv.conf,通过执行以下操作

备份您的旧/etc/resolv.confmv /etc/resolv.conf /etc/resolv.conf.OLD

如果目录/etc/dhcpc不存在,请创建它:mkdir /etc/dhcpc

/etc/dhcpc/resolv.conf/etc/resolv.conf创建一个链接:ln -s /etc/dhcpc/resolv.conf /etc/resolv.conf

如果这不起作用,请尝试此操作(由建议的修复,并由 Henrik Stoerner 稍作修改)

我执行最后一步只是因为我的 dhcpcd 没有创建/etc/dhcpc/resolv.conf。在/etc/sysconfig/network-scripts/ifup中,我做了以下更改(这是一个非常糟糕的 hack,但它对我有用)

elif [ "$BOOTPROTO" = dhcp -a "$ISALIAS" = no ]; then
    echo -n "Using DHCP for ${DEVICE}... "
    /sbin/dhcpcd -c /etc/sysconfig/network-scripts/ifdhcpc-done ${DEVICE}
    echo "echo \$$ > /var/run/dhcp-wait-${DEVICE}.pid; exec sleep 30" | sh

    if [ -f /var/run/dhcp-wait-${DEVICE}.pid ]; then
	^^^^
        echo "failed."
        exit 1

我更改为

elif [ "$BOOTPROTO" = dhcp -a "$ISALIAS" = no ]; then
    echo -n "Using DHCP for ${DEVICE}... "
    /sbin/dhcpcd
    echo "echo \$$ > /var/run/dhcp-wait-${DEVICE}.pid; exec sleep 30" | sh

    if [ ! -f /var/run/dhcp-wait-${DEVICE}.pid ]; then
	^^^^^^
       echo "failed."
       exit 1

注意:请注意if [ ! -f /var/run/dhcp-wait-${DEVICE}.pid ];

中的 ! (感叹号)。现在坐下来享受吧 :-)。

3.9. 各种注意事项

以下步骤不是必需的,但可能对某些人有用

  1. 如果您只需要偶尔的网络连接,您可以从命令行启动 dhcpcd(您必须是 root 用户才能执行此操作),命令是:/usr/sbin/dhcpcd

    当您需要关闭(关闭)网络时,输入 /usr/sbin/dhcpcd -k

3.10. 故障排除

如果您已按照上述步骤操作,但仍然无法访问网络,则可能有几种可能的解释

3.10.1. 您的网卡配置不正确

在启动过程中,您的 Linux 将探测您的网卡,并且应该会显示类似这样的消息

eth0: 3c509 at 0x300 tag 1, 10baseT port, address  00 20 af ee 11 11, IRQ 10.
3c509.c:1.07 6/15/95 becker@cesdis.gsfc.nasa.gov

如果未显示此类消息,则您的以太网卡可能未被您的 Linux 系统识别。如果您使用的是通用以太网卡(NE2000 克隆),您应该收到一张包含 DOS 实用程序的磁盘,您可以使用这些实用程序来设置网卡。尝试调整 IRQ,直到 Linux 识别您的网卡(IRQ 9,10,12 通常是不错的选择)。

3.10.2. 您的 DHCP 服务器支持 RFC 1541/我的 DHCP 服务器是 Windows NT

尝试通过输入 dhcpcd -r 运行 dhcpcd

使用 ifconfig 检查您的网络接口是否已配置(等待几秒钟进行配置过程,最初它会显示Inet.addr=0.0.0.0)

如果这解决了您的问题,请将“-r”标志添加到启动脚本中,即:将 /sbin/dhcpcd 更改为 /sbin/dhcpcd -r

例如,在 RedHat 下编辑脚本/etc/sysconfig/network-scripts/ifup并进行以下更改

        IFNAME=$[ {DEVICE} \
        "/sbin/dhcpcd -r -c /etc/"- etc etc.    

3.10.3. 在启动期间,我收到错误消息“Using DHCP for eth0 ... failed”,但我的系统工作正常。

您很可能正在使用 RedHat,并且没有仔细按照说明操作 :-)。您在一个 if 语句中遗漏了 ! (感叹号)。跳转此处并检查如何修复它。

3.10.4. 我的网络工作了几分钟,然后停止响应

有一些报告称 gated(网关守护程序)搞砸了 Linux 机器上的路由,从而导致上述问题。检查 gated 是否正在运行,命令是:ps -auxww | grep gate

如果是,请尝试使用 RedHat 的 RPM 管理器将其删除,或删除/etc/rc.d/.

中的条目。

3.10.5. 我的以太网卡在启动期间被识别,但我仍然在日志中收到“NO DHCPOFFER”消息。我碰巧有一张 PCMCIA 以太网卡。

eth0: 3c509 at 0x300 tag 1, 10baseT port, address  00 20 af ee 11 11, IRQ 10.
		            ^^^^^^^^^^^^
3c509.c:1.07 6/15/95 becker@cesdis.gsfc.nasa.gov

您需要确保已激活网卡上的 10BaseT 端口(“电话”插头)。验证它的最佳方法是检查您的网卡在启动期间配置为何种类型的连接器,例如

在某些系统中,您需要在请求中包含一些计算机的主机名。对于 dhcpcd,请使用 dhcpcd -h foohost 执行此操作。可能需要的主机名将是您在网络上的帐户用户名。

3.10.7. 我已按照所有步骤操作,但我的机器仍然无法连接

电缆调制解调器通常会记住您的网卡的以太网地址,因此如果您连接新计算机或切换网卡,您将需要以某种方式“教导”您的电缆调制解调器识别新的计算机/网卡。通常,您可以关闭调制解调器并在计算机开启时将其重新启动,或者您将需要致电技术支持并告知他们您已更换计算机中的网卡。

您有防火墙规则(ipfwadm 规则)禁止 DHCP 使用的端口 67/68 流量来分发配置信息。仔细检查您的防火墙规则。

3.10.8. 我有 MediaOne Express 服务,但仍然无法连接。

DHCP received an unknown option 067 of length 005. The raw option data is 
given  below.

0000: 62 61 73 69 63            basic

看来 MediaOne 一直在向 DHCP 添加一些不应该存在的东西。据称这不再是一个问题,但如果您遇到中断,请检查这些东西。如果您(不)幸运地在您的机器上安装了 Windows NT,如果您进入事件查看器,您将看到如下警告

如果这是问题所在,请转到 ftp://vanbuer.ddns.org/pub/ 并下载二进制文件或获取更改的源代码。

3.11. 备用 DHCP 客户端 (ISC dhclient)

如果您使用 dhcpcd 运行 Linux 连接没有成功,您可能需要尝试 ISC dhclient。dhclient 随附 ISC 的 DHCP 发行版,其中包括 DHCP 客户端和 DHCP 服务器。有关如何获取和编译 DHCP 发行版的说明,请参见此处。完成后,请返回本节以配置客户端。<mellon@isc.org>

dhclient 的作者之一。使用当前版本的 DHCP 客户端,您实际上不需要dhclient.conf

。您所要做的就是调用 dhclient,例如:/sbin/dhclient这将配置所有广播接口。如果这不起作用,或者您只想指定一个接口,请创建一个/etc/dhclient.conf

interface "eth0" {
  send dhcp-client-identifier 1:xx:xx:xx:xx:xx:xx;
  send dhcp-lease-time 86400;
}

文件,其中包含此示例配置。