核心 2.0.x
不论你使用那一种 Linux 的发行版本,你都会必需下载用户端监控程式。你所需要下载的 程式套件称为 dhcpcd ,目前的版本编号是 0.70。你可在 此处 阅读到这个套件的内容说明。 (ftp://sunsite.unc.edu/pub/Linux/system/network/daemons/dhcpcd-0.70.lsm)
核心 2.1.x
由於核心 2.1.x 中的 ipv4 网路程式套件被修改过(例如,它会在许多栏位设定预设值)
,dhcpcd 无法正常工作。然而,大部分的使用者不会采用这个试验性质的核心程式,所以
,这应该不成问题。否则,你就得试著使用 dhcpcd 1.3.6,这是 Sergei Viznyuk
sergei@phystech.com
为避免上述问题所修改的版本。你可以在以下几个地方
取得:
你可以从任何 sunsite 的镜射站台或以下几个地方,下载最新的 DHCPcd 套件:
下载 dhcpcd.tar.gz 最新版本
tar -zxvf dhcpcd-0.70.tar.gz
cd dhcpcd-0.70
make
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 这个 shell 命令稿程式,会在开机时处理 INET 系统的基本设定。 HOSTNAME=`cat /etc/HOSTNAME` #这个命令或许不需要,但是我还是 #将它保留了下来。 # 附接上 loopback 装置。 /sbin/ifconfig lo 127.0.0.1 /sbin/route add -net 127.0.0.0 netmask 255.0.0.0 lo # 如果你有乙太网路,使用下面的命令来设定 eth0 界面。如果你只有 loopback 或 SLIP, # 不要在这个档案里使用下面的命令。 /usr/sbin/dhcpcd
储存档案後将你的电脑重新开机。
当你完成以上的动作後,请跳至 最後的步骤
DHCPcd 的设定在 RedHat 5.0 与以上的版本,很容易。你所要作的事情,就是启动 “控制台(Control Panel)”,请输入
control-panel
然後选用“网路设定(Network Configuration)”,并在 interface 栏标中选取 ethernet 界面(通常是eth0),定义 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 或 ftp://linux.sinica.edu.tw/pub1/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 提供以下的资讯
我把静态的 ip 位址或网域名称,从档案 /etc/resolv.conf 中移除。但是,我留下了 search 和 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。 接著储存档案,并将电脑重新开机。
当你完成以上的动作後,请跳至 最後的步骤
你可以到下面的网址取得 deb 版本的 DHCPcd 套装程式
ftp://ftp.debian.org/debian/stable/binary/net/
或许,你可以参照 Slackware 的安装说明。 将这个套装程式解开并安装,请输入
dpkg -i /where/ever/your/debian/packages/are/dhcpd*deb
你几乎不必做任何的 DHCPcd 设定,因为:
From: Heiko Schlittermann (heiko@os.inf.tu-dresden.de)
这个 dhcpcd 套装程式如同其它的 debian 套装程式一样,会将其启动命令稿安装在 /etc/init.d/<package_name> 之上,此处为 /etc/init.d/dhcpcd,并将之链 结到各个 /etc/rc?.d/ 目录中。
在 /etc/rc?.d/ 目录中所存放的各类档案,是开机时所执行的命令稿。
如果你在安装後不想重新开机,你应该考虑使用人工启动“监控程式(daemon)” 的方式:
/etc/init.d/dhcpcd start
当你完成以上的动作後,请跳至 最後的步骤
下面这节是 R. Shapiro 所撰写的。
在 LinuxPPC 与 MkLinux 上应该可以正常执行,由 Yoichi Hariguchi 所发展的版本 0.65 和 0.7 的 dhcpcd 程式,但是,你必须注意以下几个要点:
* 如果你想要或需要,透过原始程式码来建立可执行的档案,请注意,ppc linux 上的 编译器会将 'char' 假定为 'unsigned char',但是,Hariguchi 的原始程式码确将 'char' 假定为 'signed char'。所以,要透过原始程式码来产生执行档,你必须编辑 Makefile,让 CFLAGS 中包含 "-fsigned-char" 这个选项。
* 目前 linuxppc [就是所谓的 linux-pmac] 平台上最稳定的版本是 2.1.24,需要的话 可到下面的网址取得: 2.1 版修正码 (http://www.cro.net/ vuksan/dhcppatch)。 mklinux 平台上所发行的 DR2.1 和 DR3.0 这两个版本,采用的是 2.0 的核心 (2.0.33) ,所以,不必使用这个修正码,但是,即使安装了这个修正码也没有什麽伤害。请注意 ,linuxppc 安装光碟片上 dhcpcd 程式的 rpm 包装里,并不包含这个 2.1 修正码,因此 ,它在 linuxppc 平台上无法正常运作,反倒是,可以在 mklinux 平台上正常执行。
* 当我们使用 linuxppc 平台的 2.1 核心时,在 dhcpcd 程式启动之後,你会看到一个 简短的路由器警告讯息。你可以忽略它。
* Hariguchi 的 dhcpcd 程式会花一些时间,大约是 30 秒,来完成它初次连接伺服器和 设定路由的动作。当我们使用的是 linuxppc 平台的 2.1 核心时,上述的警告讯息,只是 在说明,路由已经设定完成。若使用的是 mklinux,你还必须使用 netstat -r 来显示路由 的设定结果。
现在我们来讨论 Viznyuk 所发展的 dhcpcd 程式,我手上有一个 Viznyuk 版的 dhcpcd (v1.3.7)执行档,可以在最近发行的 linuxppc 核心:2.1.102、103、115、和 119,上 执行,并且已经完成测试。你应该可以透过原始程式码来产生执行档,但是,我不知道实际 的细节。然而, Hariguchi 版的 dhcpcd 程式就容易多了。
总而言之:
2.1.24: Hariguchi: 如果修正过,可以正常执行(产生执行档很容易); Viznyuk: 否 2.1.102+: Hariguchi: 否; Viznyuk: 可以正常执行 (产生执行档需要技巧)
一旦 dhcpcd 安装完成後,除了执行以下的动作外,你还得完成在 最後的步骤 中所提到 resolv.conf 的相关设定。
如果,你想要取得可以在 linuxppc 2.1 核心上执行,预先编译过之 dhcpcd 的 0.70 版程 式,请寄信到 reshapiro@mediaone.net 索取。
如果,你尝试在 Token Ring 网路上执行 dhcpcd 程式,将无法正常运作。以下是
Henrik Stoerner (henrik_stoerner@olicom.dk)
提供给我的解决方案。
问题出在 dhcpcd 只认识 Ethernet(乙太网路)卡。如果,它发现到 Token-Ring 网路卡 ,它会拒绝做任何的事情,并且报告说“界面不是乙太网路”。
解决方案就是使用一个简单的修正码来修改 dhcpcd 原始程式码。我已经将此修正码放在 一个小的网页上,并提供 RedHat 的 RPM 包装档和一个预先编译好的二元档: http://eolicom.olicom.dk/~storner/dhcp/
这个修正码已经送到了 dhcpcd 的维护者手上,因此,它有希望被未来发行的 dhcpcd 版本 所采用。
在你的机器重新开机之後,你应该设定网路的界面。请输入:
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 是一个“监控程式(daemon)”,所以只要你的机器还活著,它将会持续保持执行 的状态。它每三小时会与 DHCP 伺服器再联络一次,尝试续约 IP 位址的租期。它会将所 有的讯息记录在 syslog 档案中(在 Slackware 上,为 /var/adm/syslog;在 RedHat/OpenLinux 上,为 /var/log/syslog)。
最後要做一件事。你必须指定名称伺服器。有两个方式可以完成这个步骤,你可以要求网路 服务供应商,告知名称伺服器的 IP 位址,然後,再将此位址填入 /etc/resolv.conf 档中 ,或者,你也可以让 DHCPcd 从 DHCP 伺服器取得资料,然後在 /etc/dhcpc 目录下产生 档案 resolv.conf。我决定使用 DHCPcd 来产生档案 resolv.conf 的内容,方法如下:
备份旧的 /etc/resolv.conf 档案
mv /etc/resolv.conf /etc/resolv.conf.OLD
如果目录 /etc/dhcpc 不存在,你可以自己产生一个
mkdir /etc/dhcpc
然候将 /etc/resolv.conf “符号链结”至 /etc/dhcpc/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 档案中,做了以下的修改(虽然改的不是 很好,但是它已经可以解决这个问题了):
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
注意 ! (bang) 这个符号
if [ ! -f /var/run/dhcp-wait-${DEVICE}.pid ];
总算大功告成,可以坐下来享受成果了 :-).
以下的步骤不是绝对必要,但是对某些人而言,可能就派得上用场。
a) 如果,你只是偶尔才会有网路连线的需求,你可以使用命令列的方式来启动 dhcpcd(要完成这个步骤,你必须拥有 root 的身份):
/usr/sbin/dhcpcd
当你想要关掉网路,请输入
/usr/sbin/dhcpcd -k
如果,你按照了上述的步骤,却仍然无法存取网路,很可能是因为:
I. 你的网路卡设定不正确。
在开机的过程中,你机器将会侦测你的网路卡,并且,应该会显示下面几行内容:
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 工具磁片,你 可以用它来设定网路卡。尝试设定各个 IRQs 值,一直到 Linux 可以辨识到你的网路卡( IRQ 的值设定通常为 9,10,12)。
II. 所使用的 DHCP 伺服器支援 RFC 1541 标准
尝试执行 dhcpcd ,请输入
dhcpcd -r
使用 ifconfig 来检查看看,是否你的网路界面已经设定好了(最初你会看到 Inet.addr=0.0.0.0 ,你得等待几秒的设定时间)。
如果这个方法可以解决你的问题,则你应该在相关的开机命令稿中加上 "-r" 选项,例如
将 /sbin/dhcpcd
修改成 /sbin/dhcpcd -r 。
III. 在开机期间会产生错误讯息 "Using DHCP for eth0 ... failed",但是,系统 却能正常运作。
你很可能使用的是 RedHat 的系统,而且,你并未仔细地按照说明操作 :-)。你在 if 叙述 中遗漏了 ! (bang) 这个符号。跳到 此处 ,检视如何来修正 它。
IV. 我的网路卡运作几分钟之後,便没有反应了。
可能是 gated(“闸道监控程式(gateway daemon)”) 所回报的资讯,弄乱了 Linux 主机 的路由,才会造成这样的问题。检查是否 gated 正在执行中
ps -auxww | grep gate
如果真的是这样,你可以使用 RedHat 的 RPM 管理程式将它移除,或是手动将它从 /etc/rc.d/ 中移除。
V. 在开机时可以辨识到我的乙太网路卡,但是,在我的讯息记录中,仍然会出现 "NO DHCPOFFER" 的讯息。同时,这个状况也会发生在我的 PCMCIA 乙太网路卡上。
你必须确定,网路卡使用的是 10BaseT 连接埠(就像电话线的插座)。你最好检查一下,开 机时网路卡的设定,到底是使用那个连接埠。例如
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
我曾听过使用膝上型电脑的人抱怨,他们使用 PCMCIA 工具(特别是 ifport)将连接埠设 定为 10Base2 (“细同轴线网路(thinnet)”),也会有这样的问题。如果你不想重新设定 网路卡和重开机。你必须确定你使用的是 10BaseT 的连线。
VI. 没有伺服器回应我 DHCP 用户端的广播要求(由 Peter Amstutz 提供)
在某些系统上,你的广播要求中必须包含你机器的主机名称。以 dhcpcd 为例,你可以执行 'dhcpcd -h foohost'。或许,你可以使用你在网路上的帐户名称,来做为该主机名称。
VII. 我已经按照所有的步骤完成了设定,但是,我的机器仍然无法连线。
“缆线数据机(cable modem)”通常会记住你网路卡的乙太网路位址,所以,若你要连接新 的电脑或更换网路卡,你必须以某种方法来“教导”你的 cable modem 认得新的电脑/网路 卡。通常你可以先关掉 cable modem ,电脑开机後再使用 cable modem,或是你可以电话 请求技术支援,告知对方你的电脑已经更换了网路卡。
你的防火墙规则(ipfwadm 的规则)不允许埠编号 67/68( DHCP 使用来散布设定资讯) 的流量。请仔细检查你的防火墙规则。
VIII. 我使用的是 MediaOne Express 所提供的服务,但是,我仍然无法连线。
原因可能是 MediaOne 在 DHCP 中附加了不应该出现的讯息。一般相信,如今这已不再是个 问题,但是你真地无法使用,你可以朝这方面来检查。如果你(不)幸使用的是 Windows NT ,此时,如果你使用“事件检视器(Event Viewer)”,你将会看到如下的警示讯息。
DHCP 接收到一个未知的长度为 005 的 067 选项。原始的选项资料如下所示。
0000: 62 61 73 69 63 basic
如果你遇到这样的问题,请到 ftp://vanbuer.ddns.org/pub/ 下载修正 的二元码或取得原始码。