DHCP mini-HOWTO (DHCPd/DHCPcd) <author> 作者:Vladimir Vuksan, <tt>vuksan@veus.hr</tt> 譯者: 蔣大偉, <tt>dawei@sinica.edu.tw</tt> <date> 版本/發行日期:v4.2, 11 June 1999 <abstract> 這份文件主要在解答各位,如何把你的 Linux 機器設定成 DHCP 伺服器 或 DHCP 用戶端,一些基本的問題。 </abstract> <toc> <p> <!-- S e c t i o n - - - - - - - - - - - - - - - B r e a k e r --> <sect> 介紹 <p> <!-- S e c t i o n - - - - - - - - - - - - - - - B r e a k e r --> <sect1> 免責聲明 <p> 這份文件的內容不接受任何賠償要求。引用這份文件的概念、例子、以及其他的內容 時,各位要自己承擔風險。由於這是一份新出版的文件,所以可能會有些錯誤以及不 正確的地方,因此,當然可能對你的系統造成危害。雖然,災難不太可能發生,但還 是請小心為上,出了事我一概不負任何責任。 <p> 同時,也請你銘記在心,這份文件所提供的內容並 <tt>不是</tt> 正式的資訊。這份 文件的內容,有許多都是假設出來的,看起來好像能運作,但未必可以。引用時,各位 要自己承擔風險。 <p> <!-- S e c t i o n - - - - - - - - - - - - - - - B r e a k e r --> <sect1> 如何取得這份文件的最新版本 <p> 這份文件的最新版本會定期地張貼在 <it>comp.os.linux.answers</it> 的新聞論壇上。 它也會被放置在各個儲存這類資訊的匿名 FTP 站台上,例如: <p> <tt> <htmlurl url="ftp://metalab.unc.edu/pub/Linux/docs/HOWTO" name="ftp://metalab.unc.edu/pub/Linux/docs/HOWTO"> </tt> <p> 此外,你通常可以在 Linux 文件計劃的網頁上找到這份文件,請參考網址: <p> <tt> <htmlurl url="http://metalab.unc.edu/LDP/" name="http://metalab.unc.edu/LDP/"> </tt> <p> 這份文件的中文版翻譯,請參考網址: <p> <htmlurl url="http://www.linux.org.tw/CLDP/mini/DHCP.html" name="http://www.linux.org.tw/CLDP/mini/DHCP.html"> <p> 我在此正式授予翻譯權給凡是要將本文件翻譯成自己本國語言的任何人。條件是你必須將 該翻譯版本的鏈結位址提供給我。 <p> <!-- S e c t i o n - - - - - - - - - - - - - - - B r e a k e r --> <sect1> 回饋 <p> 凡是對這份文件所作的任何回饋都非常歡迎。沒有您的付出和參與,這份文件將不會 呈現在眾人的面前。所以,請將您的建議、批評、和指教寄至 <tt>vuksan@veus.hr</tt>。 <p> <!-- S e c t i o n - - - - - - - - - - - - - - - B r e a k e r --> <sect1> 供獻者 <p> 這份文件最初是修改自 Paul Makeev 所撰寫的版本而來的。 <p> 其他對這份文件有過供獻的朋友,列舉如下: <itemize> <item>Heiko Schlittermann <item>Jonathan Smith <item>Dan Khabaza <item>Hal Sadofsky <item>Henrik Stoerner <item>Paul Rossington </itemize> <p> <!-- S e c t i o n - - - - - - - - - - - - - - - B r e a k e r --> <sect1> 版權聲明 <p> 這份文件自 1998 開始的版權屬於 Vladimir Vuksan 所有,並請按照以下規定來流通: <p> <itemize> <item> Linux HOWTO 文件的全部或部分,可以使用任何物理或電子的媒體形式來複製 與流通,只要這個版權聲明被保留在每份拷貝中。商業行為的再流通是被允許而且受歡 迎的;但是,任何的流通行為,作者都希望能被告知。 <item>所有翻譯、衍生的工作、或合併任何 Linux HOWTO 文件的聚集工作,都必須受 到這個版權聲明的保護。也就是說,你不可以從 HOWTO 衍生出一份文件,然後對這份 衍生文件的流通強加上其他限制條件。除非在一些特定的狀況下,才會允諾這些限制 條件;請聯絡 Linux HOWTO 的協調人,他的地址如下: <item> 如果你有任何疑問,請聯絡 Linux HOWTO 的協調人 </itemize> <tt> <htmlurl url="mailto:linux-howto@metalab.unc.edu" name="linux-howto@metalab.unc.edu"> </tt> <p> <!-- S e c t i o n - - - - - - - - - - - - - - - B r e a k e r --> <sect>DHCP 通訊協定 <p> DHCP 就是“動態主機設定協定”(Dynamic Host Configuration Protocol)的簡寫。DHCP 的 主要用途是:透過伺服器的協助來控管各個主機(執行中的用戶端)上不可缺少的網路 連線參數。DHCP 協定向後相容 BOOTP 這個通訊協定。更進一步的資訊請參考 RFC 2131 的標準( RFC 1531 是舊標準)以及其它相關資料。(請參考該文件末尾,參考資料來源 的部分)。你也可以參閱: <htmlurl url="http://web.syr.edu/~jmwobus/comfaqs/dhcp.faq.html" name="DHCP FAQ"> (http://web.syr.edu/~jmwobus/comfaqs/dhcp.faq.html)。 <p> 這份文件將會為各位說明 DHCP 伺服器端的“監控程式”(daemon)和用戶端的監控程式。多 數人在工作站上會需要用到戶端的監控程式,以便從遠端的伺服器上取得網路設定資訊。而 系統管理員則會使用伺服器端的監控程式,以便散佈網路設定資訊給用戶端來取用,所以,i 如果你只是個一般的使用者,那麼你將會需要用戶端的監控程式。 <!-- S e c t i o n - - - - - - - - - - - - - - - B r e a k e r --> <sect>設定用戶端 <!-- S e c t i o n - - - - - - - - - - - - - - - B r e a k e r --> <sect1>下載用戶端的監控程式 <P> <BF>核心 2.0.x </BF> <p> 不論你使用的是哪一種 Linux 的發行版本,你都必需下載用戶端的監控程式。你所需要 下載的程式套件稱為 dhcpcd ,目前的版本編號是 0.70。你可在 <htmlurl url="ftp://metalab.unc.edu/pub/Linux/system/network/daemons/dhcpcd-0.70.lsm" name="此處"> 閱讀到這個套件的內容說明。 (ftp://metalab.unc.edu/pub/Linux/system/network/daemons/dhcpcd-0.70.lsm) <p> <BF>核心 2.2.x </BF> <p> 由於在核心 2.1.x 和 2.2.x 中 ipv4 的網路程式套件曾被修改過(例如,它會在許多 欄位設定預設值)dhcpcd 無法正常運作。除非你使用的是 RedHat 6.x(它目前提供了 dhcpcd 1.3.x 和 2.2.x 的核心)否則你就必須下載另一個版本的 dhcpcd(即 1.3.x) 來使用,這是 Sergei Viznyuk <tt>sergei@phystech.com</tt> 為了避免上述問題所 修改的版本。你可以在以下幾個地方取得: <p> <itemize> <item><htmlurl url="ftp://phystech.dyn.ml.org/pub/" name="ftp://phystech.dyn.ml.org/pub/"> <item><htmlurl url="http://www.cps.msu.edu/~dunham/out/dhcpcd-1.3.6.tar.gz" name="http://www.cps.msu.edu/~dunham/out/dhcpcd-1.3.6.tar.gz"> </itemize> <p> 接下來所做的說明都是以此為基本的原則。 <!-- S e c t i o n - - - - - - - - - - - - - - - B r e a k e r --> <sect1>安裝在 Slackware 之上 <p> 你可以從任何 Metalab 的“鏡射”(mirror)站台或以下幾個地方,下載最新的 DHCPcd 程式套件: <itemize> <item><htmlurl url="ftp://ftp.cdrom.com/pub/linux/metalab/system/network/daemons/"> <item><htmlurl url="ftp://metalab.unc.edu/pub/Linux/system/network/daemons"> <item><htmlurl url="ftp://ftp.kobe-u.ac.jp/pub/PC-UNIX/Linux/network/dhcp"> (主站台在日本) </itemize> <P> 下載最新版本的 dhcpcd.tar.gz 最新版本 <itemize> <item>將 dhcpcd.tar.gz 解開 <p> <tt>tar -zxvf dhcpcd-0.70.tar.gz</tt> <item>切換至套件解開後的子目錄裡,並編譯 dhcpcd 程式 <p> <tt>cd dhcpcd-0.70</tt> <p> <tt>make</tt> <item>安裝套件 (你必須以 root 的身份執行以下的命令) <p> <tt>make install</tt> </itemize> 這個命令會建立 /etc/dhcpc 這個子目錄,DHCPcd 套件會把 DHCP 的資訊儲存在該處, 並且將 dhcpcd 程式檔複製到 /usr/sbin 這個子目錄裡。 為能夠在開機時,系統設定初值期間,使用 DHCP 的功能,請做如下的設定: <tt>cd /etc/rc.d</tt> <p> <tt>mv rc.inet1 rc.inet1.OLD</tt> <P> 上面的動作會將舊有的網路初值設定“命令稿”(script)移轉至 rc.inet1.OLD。接下來, 你必須建立新的 rc.inet1 命令稿。下面的程式碼包含了必需的設定內容: <code> #!/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 </code> 存檔案之後請將電腦重新開機。 <p> 當你完成以上的動作後,請跳至 <ref id="nameserver" name="最後的步驟"> <!-- S e c t i o n - - - - - - - - - - - - - - - B r e a k e r --> <sect1> 安裝在 RedHat 5.x 和 RedHat 6.x 之上 <p> DHCPcd 的設定在 RedHat 5.0 與以上的版本其實很容易。你所要作的事情,就是啟動 “控制台”(Control Panel),請輸入 <p> <tt>control-panel</tt> <p> <itemize> <item> 選取 Network Configuration 的圖像 <item> 以滑鼠單擊 Interfaces 欄標 <item> 以滑鼠單擊 Add 按鈕 <item> 選用 Ethernet 項目 <item> 在 Edit Ethernet/Bus Interface 對話框中勾選 <bf>"Activate interface at boot time"</bf> 項目以及選取 <bf>DHCP</bf> 做為 <bf>Interface configuration protocol</bf> 項目的 輸入。 </itemize> <p> 當你完成以上的動作後,請跳至 <ref id="nameserver" name="最後的步驟"> <!-- S e c t i o n - - - - - - - - - - - - - - - B r e a k e r --> <sect1>在 RedHat 4.x 與 Caldera OpenLinux 1.1 上的設定 <P> DHCPcd 在標準的 RedHat 版本中是以 RPM 的包裝方式來發行的,你可以在其所發行的 CD-ROM 上的 RPMS 目錄中找到它,或到下面的網址下載: <p> <htmlurl url="ftp://ftp.redhat.com/pub/redhat/redhat-4.2/i386/RedHat/RPMS/dhcpcd-0.6-2.i386.rpm"> <P> 然後安裝它,如下所示: <tt>rpm -i dhcpcd-0.6-2.i386.rpm</tt> <P> 或者,你可以按照 Slackware 那節所描述的方法,編譯一個屬於你自己的版本。 <P> <tt>感謝 nothing nothing@cc.gatech.edu 提供以下的資訊給我</tt> <code> 我把靜態的 ip 位址或網域名稱,從檔案 /etc/resolv.conf 中移除。但是,我留下了 search 和 nameserver 的設定行(因為某些原因我的 dhcpcd 伺服器不會產生檔案 /etc/dhcpc/resol.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。 最後儲存檔案,並將電腦重新開機。 </code> 當你完成以上的動作後,請跳至 <ref id="nameserver" name="最後的步驟"> <!-- S e c t i o n - - - - - - - - - - - - - - - B r e a k e r --> <sect1>安裝在 Debian 之上 <p> 你可以在下面的網址找到以 deb 方式包裝的 DHCPcd 程式套件: <p> <tt><htmlurl url="ftp://ftp.debian.org/debian/dists/slink/main/binary-i386/net/dhcpcd_0.70-4.deb"></tt> 或者,你可以按照 Slackware 那節所描述的方法來安裝。 要安裝這個 deb 包裝的程式套件,請輸入: <tt>dpkg -i /where/ever/your/debian/packages/are/dhcpd*deb</tt> <p> 你幾乎不必做任何的 DHCPcd 設定,因為: <tt>From: Heiko Schlittermann (heiko@os.inf.tu-dresden.de)</tt> <p> 這個 dhcpcd 的程式套件如同其它的 debian 套件一樣,會將啟動命令稿安裝在 /etc/init.d/<package_name> 之上,此處為 /etc/init.d/dhcpcd,並將 之鏈結到各個 /etc/rc?.d/ 目錄中。 <p> 在 /etc/rc?.d/ 目錄中所存放的各類檔案,是開機時所執行的命令稿。 <p> 如果你在安裝後不想重新開機,你應該考慮使用人工啟動“監控程式”(daemon) 的方式: <p> <tt>/etc/init.d/dhcpcd start</tt> 當你完成以上的動作後,請跳至 <ref id="nameserver" name="最後的步驟"> <!-- S e c t i o n - - - - - - - - - - - - - - - B r e a k e r --> <sect1>在 LinuxPPC 與 MkLinux 上的設定 <p> 下面這節是 R. Shapiro 撰寫的。 <p> 由 Yoichi Hariguchi 所發展的版本 0.65 和 0.7 的 dhcpcd 程式應該可以在使用核心 2.1.24 的 LinuxPPC 與 MkLinux 上正常執行,但是,你必須注意以下幾個要點: <p> * 如果你想要或需要,透過原始程式碼來建立可執行的檔案,請注意,ppc linux 上的 編譯器會將 'char' 假定為 'unsigned char',但是,Hariguchi 的原始程式碼確將 'char' 假定為 'signed char'。所以,要透過原始程式碼來產生執行檔,你必須編輯 Makefile,讓 CFLAGS 中包含 "-fsigned-char" 這個選項。 <P> * 目前 linuxppc [就是所謂的 linux-pmac] 平臺上最穩定的版本是 2.1.24,需要的話 可到下面的網址取得 dhcpcd 的修正碼: <htmlurl url="http://www.cro.net/~vuksan/dhcppatch" name="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 平臺上正常執行。 <P> * 當我們使用 linuxppc 平臺的 2.1.24 核心時,在 dhcpcd 程式啟動之後,你會看到 一個簡短的路由器警告訊息。你可以忽略它。 <P> * Hariguchi 的 dhcpcd 程式會花一些時間,大約是 30 秒,來完成它初次連接伺服器和 設定路由的動作。當我們使用的是 linuxppc 平臺的 2.1.24 核心時,上述的警告訊息, 只是在說明,路由已經設定完成了。 <p> 對於比較新版的 linuxppc 核心而言,由 Hariguchi 所發展的 dhcpcd 程式都無法使用 :此時你 <bf>必須</bf> 改採 Sergei Viznyuk 所發展的版本(目前的發行版本為 1.3.9 )。麻煩的是 Viznyuk 的 dhcpcd 程式是以 glibc 2 為函式庫來發展的,然而 linuxppc 2.1.1xx 卻不使用這個函式庫。結果,編譯程式需要用到一些技巧 - 相關的細節請與我 聯絡。一旦程式編譯好之後,它就能夠在較新版的核心上正常運作了(在 linuxppc 的 2.1.24 版本或 MkLinux 的部分版本上還是不行)。 <p> 現在我們來討論 Viznyuk 所發展的 dhcpcd 程式,我手上有一個 Viznyuk 版的 dhcpcd (v1.3.7)執行檔,可以在最近發行的 linuxppc 核心:2.1.102、103、115、和 119,上 執行,並且已經完成測試。你應該可以透過原始程式碼來產生執行檔,但是,我不知道實際 的細節。Viznyuk 版的 dhcpcd 無法在 2.1.24 的核心上運作,然而修補過的 Hariguchi 版的 dhcpcd 程式卻可以正常使用。要編譯 Hariguchi 版的 dhcpcd 程式就容易多了。 <p> 摘要整理如下: <p> <code> MkLinux: Hariguchi: 可用; Viznyuk: 不可用 2.1.24: Hariguchi: 如果修正過,可以正常使用(產生執行檔很容易); Viznyuk: 不可用 2.1.102+: Hariguchi: 不可用; Viznyuk: 可用(產生執行檔需要技巧) </code> <p> 請注意,Viznyuk 版的 dhcpcd 會把資料直接寫到 /etc/resolv.conf 裡(寫入之前會先 備份舊有的檔案),因此你不必再自己從 /etc/dhcpc 複製或鏈結相關的資訊。同時也請 注意它通常會把執行檔放到 /sbin 目錄中而不是放到 /usr/sbin 裡,所以它的命令列選 項與 Hariguchi 版本之間會有一點不同。若你使用 ifup 來啟動 dhcpcd ,則 ifup 這個 命令稿也必須做一些小的修正。 <p> 若你想要取得給 linuxppc 使用的預先編譯好之 dhcpcd 程式,請寄信到 <p> <htmlurl url="mailto:reshapiro@mediaone.net" name="reshapiro@mediaone.net">。 我也提供了二元碼的 RPMs 包裝檔: <p> <htmlurl url="ftp://ftp.linuxppc.org//pub/linuxppc/contrib/linuxppc-R4/RPMS/"> 請不要使用該目錄之下的 dhcpcd-1.3.8-2.ppc.rpm 檔案,它已經停止維護了。可靠的版 本是 dhcpcd-0.70-0.ppc.rpm(給 linuxppc 2.1.24 使用的)以及 dhcpcd-1.3.8-3.ppc.rpm (給 linuxppc 2.1.102 和以上的版本使用的)。版本 1.3.9 的 rpm 包裝檔近期內應該 會提供出來。同時我還依照版本 0.65 和 0.70(由 Hariguchi 所發展)的方式對版本 1.3.9 (由 Viznyuk 所發展) 做了一些修改(就是 附加上 -c 的命令列選項)。(請注意,標 準的 Viznyuk dhcpcd 並不包含這樣的內容。) <!-- S e c t i o n - - - - - - - - - - - - - - - B r e a k e r --> <sect1>“記號環”(Token Ring)網路 <p> 若你嘗試在“記號環”網路上執行 dhcpcd 程式,將無法正常運作。以下是 Henrik Stoerner <tt>(henrik_stoerner@olicom.dk)</tt> 提供給我的解決方案。 <p> 問題出在 dhcpcd 只認識“乙太網路”( Ethernet)卡。若它發現到“記號環”網路卡 ,則它會拒絕做任何的事情,並且報告說“界面不是乙太網路”。 <p> 解決方案就是使用一個簡單的修正碼來變更 dhcpcd 的原始程式碼。我已經將此修正碼 放在一個小型的網頁上,並提供 RedHat 的 RPM 包裝檔和一個預先編譯好的二元檔: <htmlurl url="http://eolicom.olicom.dk/~storner/dhcp/"> <p> 這個修正碼已經送到了 dhcpcd 的維護者手上了,因此,它有希望被未來發行的 dhcpcd 版本所採用。 <!-- S e c t i o n - - - - - - - - - - - - - - - B r e a k e r --> <sect1>最後,請完成以下的動作<label id="nameserver"> <p> 在你的機器重新開機之後,你應該設定網路的界面。請輸入: <tt>ifconfig</tt> 你應該會看到如下的內容 <code>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 </code> <P> 如果,你在 inet addr 之後看到一些正常的數字,這表示你已經設定好了。如果,你看到 的是 0.0.0.0 也不要絕望,它只是 dhcpcd 在取得 IP 位址前暫時的設定值。如果,過了 幾分鐘之後,你仍然看到 0.0.0.0 ,請參考 <ref id="troubleshooting" name="疑難排除"> 。DHCPcd 是一個“監控程式”(daemon),所以只要你的機器還活著,它將會持續保持執行 的狀態。它每三小時會與 DHCP 伺服器再聯絡一次,嘗試續約 IP 位址的租期。它會將所 有的訊息記錄在 syslog 檔案中(在 Slackware 上,為 /var/adm/syslog;在 RedHat/OpenLinux 上,為 /var/log/syslog)。 <p> 最後要做一件事。你必須指定名稱伺服器。有兩個方式可以完成這個步驟,你可以要求網路 服務供應商,告知名稱伺服器的 IP 位址,然後再將此位址填入 /etc/resolv.conf 檔中 ,或者,你也可以讓 DHCPcd 從 DHCP 伺服器取得資料,然後在 /etc/dhcpc 目錄下產生 檔案 resolv.conf。我決定使用 DHCPcd 來產生檔案 resolv.conf 的內容,方法如下: <p> 備份舊的 /etc/resolv.conf 檔案 <tt>mv /etc/resolv.conf /etc/resolv.conf.OLD</tt> 如果目錄 /etc/dhcpc 不存在,你可以自行產生此目錄 <tt>mkdir /etc/dhcpc</tt> 然候將 /etc/resolv.conf 以“符號鏈結”至 /etc/dhcpc/resolv.conf <tt>ln -s /etc/dhcpc/resolv.conf /etc/resolv.conf</tt> <p> 如果這個方式無法正常運作,請嘗試使用下面的方法 (下面這個修正方法是 nothing@cc.gatech.edu 所建議的,其內容修改自 Henrik Stoerner 所提供的修正方法) <p> <label id="error3"> 我還必須執行下面這個步驟,只因為我的 dhcpcd 不會產生檔案 /etc/dhcpc/resolv.conf 。我在 /etc/sysconfig/network-scripts/ifup 檔案中,做了以下的修改(雖然改的不是 很好,但是它已經可以為我解決這個問題了): <p> <code> 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 </code> 我把它修改成: <code> 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 </code> <p> <bf>注意</bf> ! (bang) 這個符號 <tt>if [ ! -f /var/run/dhcp-wait-${DEVICE}.pid ];</tt> <p> <P>總算大功告成,可以坐下來享受成果了 :-)。</P> <!-- S e c t i o n - - - - - - - - - - - - - - - B r e a k e r --> <sect1>其它注意事項 <p> 以下的步驟不是絕對必要,但是對某些人而言,可能就派得上用場。 <bf>a) </bf>如果,你只是偶爾才會有網路連線的需求,你可以使用命令列的方式來啟動 dhcpcd(要完成這個步驟,你必須擁有 root 的身份):<p> <tt>/usr/sbin/dhcpcd</tt> 當你想要關掉網路,請輸入 <tt>/usr/sbin/dhcpcd -k</tt> <!-- S e c t i o n - - - - - - - - - - - - - - - B r e a k e r --> <sect1>疑難排除<label id="troubleshooting"> <p> 如果,你按照了上述的步驟,卻仍然無法存取網路,很可能是因為: <p> <bf>I. 你的網路卡設定不正確。 </bf> <p> 在開機的過程中,你機器將會偵測你的網路卡,並且應該會顯示下面幾行的訊息內容: <code> 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 </code> 如果,你的 Linux 系統不會出現上面這個訊息,這表示,你的網路卡可能無法被辨識。假 使,你使用的是一般的乙太網路卡(NE2000 相容),你應該會拿到一片 DOS 工具磁片,你 可以用它來設定網路卡。嘗試設定各個 IRQs 值,一直到 Linux 可以辨識到你的網路卡( IRQ 的值設定通常為 9,10,12)。 <p> <bf>II. 所使用的 DHCP 伺服器支援 RFC 1541 標準/我的 DHCP 伺服器是 Windows NT</bf> <p> 嘗試執行 dhcpcd ,請輸入 <tt>dhcpcd -r</tt> 使用 ifconfig 來檢查看看,是否你的網路界面已經設定好了(最初你所看到的是 Inet.addr=0.0.0.0,你得等待幾秒的設定時間)。 <p> 如果這個方法可以解決你的問題,則你應該在相關的開機命令稿中加上 "-r" 選項,譬如 將 <tt>/sbin/dhcpcd</tt> 修改成 <tt>/sbin/dhcpcd -r 。</tt> <p> 以 RedHat 為例,你必須編輯 /etc/sysconfig/network-scripts/ifup 這個命令稿,並 將它修改成: <code> IFNAME=$[ {DEVICE} \ "/sbin/dhcpcd -r -c /etc/"- etc etc. </code> <p> <bf>III. 在開機期間會產生錯誤訊息 "Using DHCP for eth0 ... failed",但是,系統 卻能正常運作。</bf> <p> 你很可能使用的是 RedHat 的系統,而且,你並未仔細地按照說明操作 :-)。你在 if 敘述 中遺漏了 ! (bang) 這個符號。跳到 <ref id="error3" name="此處"> ,檢視如何來修正 它。 <p> <bf>IV. 我的網路卡運作了幾分鐘之後,便沒有反應了。</bf> <p> 可能是 gated(“閘道監控程式”(gateway daemon)) 所回報的資訊,弄亂了 Linux 主機的路由,才會造成這樣的問題。檢查是否 gated 正在執行中: <p> <tt>ps -auxww | grep gate</tt> <p> 如果真的是這樣,你可以使用 RedHat 的 RPM 管理程式將它移除,或是手動將它從 /etc/rc.d/ 中移除。 <p> <bf>V.在開機時可以辨識到我的乙太網路卡,但是,在我的訊息記錄中,仍然會出現 "NO DHCPOFFER" 的訊息。同時,這個狀況也會發生在我的 PCMCIA 乙太網路卡上。</bf> <p> 你必須確定,網路卡使用的是 10BaseT 連接埠(就像電話線的插座)。你最好檢查一下, 開機時網路卡的設定,到底是使用那個連接埠。例如: <code> 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 </code> <p> 我曾聽過使用膝上型電腦的人抱怨,他們使用 PCMCIA 工具(特別是 ifport)將連接埠設 定為 10Base2 (“細同軸線網路”(thinnet)),也會有這樣的問題。如果你不想重新設定 網路卡和重開機。你必須確定你使用的是 10BaseT 的連線。 <p> <bf>VI. 沒有伺服器回應我 DHCP 用戶端的廣播要求(由 Peter Amstutz 提供)</bf> <p> 在某些系統上,你的廣播要求中必須包含你機器的主機名稱。以 dhcpcd 為例,你可以執行 'dhcpcd -h foohost'。或許,你可以使用你在網路上的帳戶名稱,來做為該主機名稱。 <p> <bf>VII. 我已經按照所有的步驟完成了設定,但是,我的機器仍然無法連線。</bf> <p> “纜線數據機”(cable modem)通常會記住你網路卡的乙太網路位址,所以,若你要連接 新的電腦或更換網路卡,你必須以某種方法來“教導”你的 cable modem 認得新的電腦/網路 卡。通常你可以先關掉 cable modem ,電腦開機後再使用 cable modem,或是以電話請求 技術的支援,告知對方你的電腦已經更換了網路卡。 <p> 你的防火牆規則(ipfwadm 的規則)不允許埠編號 67/68( DHCP 使用來散佈設定資訊) 的流量。請仔細檢查你的防火牆規則。 <p> <bf>VIII. 我使用的是 MediaOne Express 所提供的服務,但是我仍然無法連線。</bf> <p> 原因可能是 MediaOne 在 DHCP 中附加了不應該出現的訊息。一般相信,如今這已不再 是個問題,但是你卻無法使用它,你可以朝這方面來檢查。如果你(不)幸使用的是 Windows NT,此時,如果你使用“事件檢視器”(Event Viewer),你將會看到如下的 警示訊息。 <p> DHCP 接收到一個未知的長度為 005 的 067 選項。原始的選項資料如下所示。 <p> <tt> 0000: 62 61 73 69 63 basic </tt> <p> 如果你遇到這樣的問題,請到 <htmlurl url="ftp://vanbuer.ddns.org/pub/"> 下載修正 的二元碼或取得原始碼。 <p> <p> <!-- S e c t i o n - - - - - - - - - - - - - - - B r e a k e r --> <sect>設定 DHCP 伺服器 <!-- S e c t i o n - - - - - - - - - - - - - - - B r e a k e r --> <sect1>UNIX 上的 DHCP 伺服器 <p> 在各種 UNIX 相容的作業系統上,有許多商業或免費的 DHCP 伺服器程式可用。其中, 較著名的免費伺服器程式是 Paul Vixie/ISC 版的 DHCPd。目前最新的版本是 2.0( 建議大家使用),而 3.0 版正在做 beta 階段的測試。你可以到下面的網址取得: <htmlurl url="ftp://ftp.isc.org/isc/dhcp/"> <p> 在 RedHat(版本 5.2)這個 Linux 套件中包含了有 DHCP 伺服器二元碼的 RPM 包裝。 該 RPM 包裝的檔名為 dhcp-2.0b1pl6-2.platform.rpm。安裝時只要輸入 <p> <tt>rpm -i dhcp-2.0b1pl6-2.i386.rpm</tt> <p> 若你使用上面的步驟,則你可以跳過下面的安裝說明。 <p> 在你下載之後,你必須將它解開。然後進入解開的目錄,輸入: <tt> ./configure </tt> 要做好安裝前的設定工作,可能要花點時間。請隨後輸入: <tt> make </tt> 以及 <tt> make install </tt> <p> <!-- S e c t i o n - - - - - - - - - - - - - - - B r e a k e r --> <sect1>設定網路組態。 <p> 當完成安裝之後,請輸入 ifconfig -a,你將看到如下的訊息: <p> <code> eth0 Link encap:10Mbps Ethernet HWaddr 00:C0:4F:D3:C4:62 inet addr:183.217.19.43 Bcast:183.217.19.255 Mask:255.255.255.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:2875542 errors:0 dropped:0 overruns:0 TX packets:218647 errors:0 dropped:0 overruns:0 Interrupt:11 Base address:0x210 </code> <p> 如果未顯示 MULTICAST 的訊息,你應該重新設定你的核心,加入對“多址傳播” (multicast)的支援。對於大多數的系統而言,你幾乎都不必如此做。 <p> 下個步驟是,加入 255.255.255.255 的路由。以下的說明引述自 DHCPd 程式的 “讀我檔案”(README): <p> “為了讓 dhcpd 能夠正確地服務過分挑剔的 DHCP 用戶端(例如,Windows 95),dhcpd 必須能夠送封包到 255.255.255.255 的 IP 位址上。不幸的是,Linux 會將 255.255.255.255 做為本地子網路的廣播位址(此處為 192.5.5.223)。這將違反 DHCP 通訊協定,然而許多 DHCP 用戶端並不受影響,有些(例如,所有 Microsoft DHCP 用戶端)卻會。有此類問題 的用戶端,將會看不到來自伺服器的 DHCPOFFER 訊息。” <p> 輸入: <tt> route add -host 255.255.255.255 dev eth0 </tt> 如果你看到如下的訊息 <tt> "255.255.255.255: Unknown host" </tt> 你應該將下面的資訊加入到 /etc/hosts 檔案中: /etc/hosts file: <tt> 255.255.255.255 all-ones </tt> 然後,輸入: <tt> route add -host all-ones dev eth0 </tt> 或 <tt> route add 255.255.255.0 dev eth0 </tt> eth0 應該是你目前使用網路卡的裝置名稱。如果不是,你得配合實際情況做正確的修改。 <p> <!-- S e c t i o n - - - - - - - - - - - - - - - B r e a k e r --> <sect1>DHCPd 的選項設定 <p> 現在,你必須設定 DHCPd。為此,你必須產生或編輯 /etc/dhcpd.conf。 <p> 通常你所要做的是,隨機地指派 IP 位址。為此,你必須按照下面的方式來設定: <p> <code> default-lease-time 600; max-lease-time 7200; option subnet-mask 255.255.255.0; option broadcast-address 192.168.1.255; option routers 192.168.1.254; option domain-name-servers 192.168.1.1, 192.168.1.2; option domain-name "mydomain.org"; subnet 192.168.1.0 netmask 255.255.255.0 { range 192.168.1.10 192.168.1.100; range 192.168.1.150 192.168.1.200; } </code> <p> 設定的結果為,DHCP 伺服器會提供用戶端,使用範圍 192.168.1.10-192.168.1.100 或 192.168.1.150-192.168.1.200 的 IP 位址。如果,用戶端沒有特別約定 IP 位址的租用 時間,則釋出時間預定為 600 秒,要不然,最大(允許)的釋出時間為 7200 秒。同時 伺服器也會“通知”用戶端,要求它使用 255.255.255.0 做為子網路遮罩,192.168.1.255 做為廣播位址,192.168.1.254 做為路由/閘道器,並以 192.168.1.2 做為 DNS 伺服器。 <p> 你也可以依據用戶端的乙太網路位址,來指派特定的 IP 位址給用戶端,例如 <code> host haagen { hardware ethernet 08:00:2b:4c:59:23; fixed-address 192.168.1.222; } </code> <p> 這個設定將會指派 IP 位址 192.168.1.222 給乙太網路位址為 08:00:2b:4c:59:23 的 用戶端。 <p> 網路上 IP 位址的指定,可以採混合雙軌制,譬如,你可以讓某些電腦擁有“靜態”的 IP 位址(例如,伺服器),而讓其它的用戶端取得“動態”的IP 位址(例如,使用膝 上型電腦,機動的使用者)。還有其它的選項,譬如,說 wins 伺服器的位址、時間伺服 器等等,如果你需要進一步瞭解的話,可以請參閱 dhcpd.conf 的說明文件。 <p> <!-- S e c t i o n - - - - - - - - - - - - - - - B r e a k e r --> <sect1>啟動伺服器 <p> 在啟動伺服器之前你只要做一件事情就行了。通常 DHCP 的安裝過程中並不會產生檔案 dhcp.leases。伺服器 DHCPd 會使用這個檔案來儲存目前的租用資訊。該檔案採用一般 文字的格式來儲存資料,所以在 DHCPd 操作期間你可以直接檢視它的內容。現在我們 來產生檔案 dhcp.leases,請在命令列上輸入: <tt>touch /etc/dhcp.leases</tt> 這個動作將會產生一個空白的檔案(檔案的大小 = 0)。你不需要對該檔案做任何的修改 所以它應該是空白的。若你看到一個錯誤的訊息說該檔案是空白的,你可以不理會它並且 請繼續以下的步驟。 <p> 現在,你可以啟用 DHCP 伺服器了。只要輸入(或將下面的敘述加到開機設定檔中) <tt> /usr/sbin/dhcpd </tt> 如果,你想要確定運作是否一切正常,你應該先開啟除錯模式,並把伺服器放到“幕前” (foreground)來執行。為此,你可以輸入 <tt> /usr/sbin/dhcpd -d -f </tt> 然後,開啟你任何一個用戶端機器,並察看伺服器端“操作控制台”(console)的螢幕, 你將會看到一些除錯訊息被顯示出來。 <!-- End of HOWTO .. End of HOWTO .. End of HOWTO .. End of HO --> </article>