目前,Linux 有三种不同的 DHCP 客户端程序:dhcpcd、pump 和 dhclient。本 mini-HOWTO 主要介绍 dhcpcd。
根据您的发行版,您可能需要下载 DHCP 客户端守护程序。如果您想从源代码包编译它,您需要的包名为 dhcpcd,当前版本为 1.3.18。它由 Sergei Viznyuk 维护<sergei@phystech.com>如今,大多数发行版都将其作为二进制包提供。
可以从以下位置下载 dhcpcd 源代码
然后按照以下说明操作。它们应该是相同的。
您可以从任何 Metalab 镜像或以下位置下载最新版本的 DHCPcd
下载最新版本dhcpcd.tar.gz.
解压缩它
tar -zxvf dhcpcd-1.3.18pl1.tar.gz
cd 进入目录并 make dhcpcd
cd dhcpcd-1.3.18pl1
make
安装它(您必须以 root 用户身份运行以下命令)
make install
这将创建目录 /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 |
保存并重启您的计算机。
完成后,转到最后一步。
RedHat 6.0+ 下的 DHCPcd 配置非常容易。您需要做的就是通过输入 control-panel 启动控制面板。
选择“网络配置”
点击“接口”
点击“添加”
选择“以太网”
在“编辑以太网/总线接口”中,选择“启动时激活接口”,并选择“DHCP”作为“接口配置协议”。
请注意,在 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 的其他说明<alexander.stevenson@home.com>:
我使用 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。
RedHat 5.0+ 下的 DHCPcd 配置非常容易。您需要做的就是通过输入 control-panel 启动控制面板。
选择“网络配置”
点击“接口”
点击“添加”
选择“以太网”
在“编辑以太网/总线接口”中,选择“启动时激活接口”,并选择“DHCP”作为“接口配置协议”。
完成后,转到最后一步。
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 提供给我<nothing@cc.gatech.edu>.
从/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。
保存文件。重启您的计算机。
完成后,转到最后一步。
在
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 <heiko@os.inf.tu-dresden.de> |
然后,在启动时执行/etc/rc?.d/目录的内容。
如果您在安装后不重启,您应该考虑手动启动守护程序:/etc/init.d/dhcpcd start。
完成后,转到最后一步。
以下部分由 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 获取。
机器重启后,您的网络接口应该已配置。输入: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.conf:mv /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
如果这不起作用,请尝试此操作(由<nothing@cc.gatech.edu>建议的修复,并由 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 ];
中的 ! (感叹号)。现在坐下来享受吧 :-)。
以下步骤不是必需的,但可能对某些人有用
如果您只需要偶尔的网络连接,您可以从命令行启动 dhcpcd(您必须是 root 用户才能执行此操作),命令是:/usr/sbin/dhcpcd。
当您需要关闭(关闭)网络时,输入 /usr/sbin/dhcpcd -k。
如果您已按照上述步骤操作,但仍然无法访问网络,则可能有几种可能的解释
在启动过程中,您的 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 通常是不错的选择)。
尝试通过输入 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. |
您很可能正在使用 RedHat,并且没有仔细按照说明操作 :-)。您在一个 if 语句中遗漏了 ! (感叹号)。跳转此处并检查如何修复它。
有一些报告称 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 端口(“电话”插头)。验证它的最佳方法是检查您的网卡在启动期间配置为何种类型的连接器,例如
3.10.6. 我的 DHCP 客户端广播请求,但没有人应答(由 Peter Amstutz 贡献)
3.10.7. 我已按照所有步骤操作,但我的机器仍然无法连接
电缆调制解调器通常会记住您的网卡的以太网地址,因此如果您连接新计算机或切换网卡,您将需要以某种方式“教导”您的电缆调制解调器识别新的计算机/网卡。通常,您可以关闭调制解调器并在计算机开启时将其重新启动,或者您将需要致电技术支持并告知他们您已更换计算机中的网卡。
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,如果您进入事件查看器,您将看到如下警告
3.11. 备用 DHCP 客户端 (ISC dhclient)
如果您使用 dhcpcd 运行 Linux 连接没有成功,您可能需要尝试 ISC dhclient。dhclient 随附 ISC 的 DHCP 发行版,其中包括 DHCP 客户端和 DHCP 服务器。有关如何获取和编译 DHCP 发行版的说明,请参见此处。完成后,请返回本节以配置客户端。注意:以下信息由 Ted Lemon 提供<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; } |
文件,其中包含此示例配置。