2006年(25)
分类: LINUX
2006-09-09 11:47:53
或許許多朋友都知道 DHCP 就是 Dynamic Host Configuration Protocol 的意思﹐至於它的好處﹐我已經在“”之“”裡面花了不少筆墨﹐這裡也就不再多說。如果您沒看過剛纔的文章﹐我建議您先讀完才回來這裡繼續。
別以為我在前面的文章那裡說得那麼複雜﹐那只是原理而已。事實上﹐在 Linux 下面設定 DHCP 伺服器一點也不困難﹐請先確定您有安裝 dhcp 套件﹐同時用 ntsysv 確定 dhcpd 能在開機的時候啟動。然後﹐您要做的事情只是修改一個檔案﹕/etc/dhcpd.conf (如果該檔案不存在﹐自行建立則可)。
下面﹐我用我自己的設定來說說怎麼修改這個檔案﹕
和其它 Linux 設定檔一樣(如 lilo.conf﹑smb.conf 等)﹐一開始是關於 global 的設定﹐其後再分開不同的 section 來設定。有些設定可以同時在 global 和 section﹐但有些則只能用於 global 或 section 裡面﹐如果有衝突﹐在 section 裡面則以 section 為準﹔如果 section 裡面沒設﹐則以 global 的設定為準。而 section 裡面﹐或許還包括其它 sub-section﹐諸如此類。
下面幾行是 global 的設定﹕
default-lease-time 259200; max-lease-time 777600; option domain-name "siyongc.domain"; |
這幾行我放在檔案的開頭部份。第一和第二行我定義出租約的預設期限和最高期限﹐數值以秒來計算﹐也就是‘三天’和‘九天’。因為 DHCP 的發放﹐主要是透過 server 和 client 的溝通協調而達成的﹐如果客戶端沒指定租約時間﹐那就使用預設值﹔如果客戶端有指定租約時間﹐則以客戶指定為準﹐但不能超過最高期限。
然後在第三行我指定了網路使用的網域名稱﹐它目前設在 global 中﹐換句話說﹐除非後面的 section 另外指定﹐否則都使用這個網域名稱。
接下來是其中兩個 subnet 的 section 設定﹕
subnet 192.168.100.0 netmask 255.255.255.0 { range 192.168.100.30 192.168.100.50; range 192.168.100.121 192.168.100.230; option broadcast-address 192.168.100.255; option routers 192.168.100.23; option domain-name-servers 192.168.0.23, 139.175.10.20, 168.95.1.1; } subnet 10.0.1.128 netmask 255.255.255.224 { range 10.0.1.140 10.0.1.150; option broadcast-address 10.0.1.159; option routers 10.0.1.131; option domain-name-servers 10.0.1.131, 168.95.1.1; } |
在我的機器上﹐事實上有三張網路卡分別屬於三個子網路﹐但我這裡只向兩個網路提供 DHCP 服務而已。其中﹕在第一個網路(192.168.100.0/24)下面我指定出兩個 range ﹐也就是用來分配 DHCP 的 IP 範圍﹕192.168.100.30 到 192.168.0.50 和 192.168.100.121 到 192.168.100.230 。另外﹐我還為每個子網路指定了‘廣播位址’﹑‘路由器位址’和‘DNS 的位址’。
設定 subnet 的時候﹐您必須要知道如何計算 NetID 和 Broadcast 。例如﹐我這裡的第二個網路因為使用了27 bit 的 netmask﹐所以 Net ID 是﹕ 10.0.1.128 ﹐而廣播位址則是﹕10.0.1.159 (如果您不會算﹐請溫習“ ”)。這也是初學者最容易犯的錯誤﹐請一定要搞清楚 subnet 和 host 的概念。
start() { # Start daemons. echo -n $"Starting $prog: " daemon /usr/sbin/dhcpd eth0 eth1 ...... |
或許您在 man dhcpd.conf 的時候﹐還看到 shared-network 的設定﹐在這裡要小心使用﹕如果您將上面這兩個 subnet 放在同一個 shared-network 裡面的話﹐那 dhcpd 在發放 IP 的時候不會以界面所在的 subnet 為依據﹐而是直接從 shared-network 中尋找首先可用的 subnet 。嗯﹐我不是很了解 shared-network 的運作原理﹐只是在實作中發現這個現像而已。
我們知到﹐通過 DHCP 獲取 IP 的客戶端機器﹐如果其租約已經過期了﹐那麼好可能失去了原來的 IP 。不過﹐我又想我的 acer 這台主機永遠都使用一個固定的 IP 地址。下面的句子就是為了這個目的而設的了﹕
host acer { hardware ethernet 00:D0:59:26:DD:A9; fixed-address 192.168.100.20; option broadcast-address 192.168.100.255; option routers 192.168.100.23; option domain-name-servers 192.168.100.23, 168.95.1.1; } |
首先﹐我得指定 acer 這台機器所使用的界面種類和硬體位址﹐也就是 ethernet 00:D0:59:26:DD:A9 ﹐然後我用‘fixed-address’將 192.168.100.20 這個不在 DHCP range 之內的 IP 分配給它。至於這個 host 的名稱用什麼沒關係﹐因為 client 可以使用自己的設定。
如果您參考上面這個檔案進行設定的話﹐務必留意每一個標點符號﹐有些數字是用‘﹐’來分隔﹐而有些則用空白鍵來分隔﹔而每一個句子﹐都要用‘﹔’做結尾(和 perl script 一樣)﹐否則﹐下面一行將會視為該行的延續部份﹐而不會當是新的一行看待。
當這個 /etc/dhcpd.conf 檔案設定好之後﹐您還要用下面的命令建立一個 dhcp.leases 的空白檔﹕
touch /var/lib/dhcp/dhcpd.leases |
注意﹕這個檔的路徑會因不同的版本而不一樣。您可以輸入下面的命令找到它的正確路徑﹕
grep "dhcpd.leases" /etc/rc.d/init.d/dhcpd |
請不要嘗試自行修改這個檔案﹐假如該檔有問題的話﹐將之刪除或改名﹐然後再用 touch 命令再建立就是了。
255.255.255.255 all-ones all-ones |
然後﹐我還在 /etc/rc.d/rc.local 中增加了這樣的敘述﹕
# Lines added by netman, # for enabling DHCP routing on multi-nics environement: echo "Adding IP routing for DHCP server..." route add -host 255.255.255.255 dev eth0 route add -host 255.255.255.255 dev eth2 |
這樣﹐當機器啟動的時候﹐DHCP 的路由就設定好了。然而﹐現在新版的 Linux 看來似乎無需再擔心這個問題了﹐假如您發現 DHCP 未能成功提供服務的話﹐再考慮使用這個辦法吧。
最後﹐您要做的﹐就是重新啟動 DHCP 服務﹕
/etc/rc.d/init.d/dhcpd start |
檢查一下 /var/log/messages 有沒有錯誤信息﹐有則做出適當修改﹐再來嘗試啟動 dhcpd 。當沒有錯誤出現之後﹐您就可以執行 setup --> System services --> 確定﹕[ * ] dhcpd 。
在某些場合中﹐我們或許會運用到 IP Alias 來連接同一物理網段上的其它子網路。假如您要在 alias 上面提供 DHCP 服務﹐請要留意一點﹕您只能為一張界面提供一個 sub-net 的服務﹐就算界面上面捆綁了好幾個 alias 也一樣。
設定也是蠻簡單的啦﹕
在我的測試中﹐/etc/dhcpd.conf 不是最重要的﹐關鍵還是要確定 ip alias 已經成功啟動﹐而且 routing 一定要設定好。
下面是我初步整理出來的流程(不肯定事實是否如此)﹕
當 DHCP 成功啟動後在發放 offer 的時候﹕
如果看我的範例﹐會是這樣﹕
default-lease-time 259200; max-lease-time 777600; option domain-name "siyongc.domain"; ## 下面我將原有界面 (eth0) 之 sub-net 註解起來 #subnet 192.168.100.0 netmask 255.255.255.0 { # range 192.168.100.30 192.168.100.50; # range 192.168.100.121 192.168.100.230; # option broadcast-address 192.168.100.255; # option routers 192.168.100.23; # option domain-name-servers 192.168.0.23, 139.175.10.20, 168.95.1.1; #} ## 這才是 alias ( eth0:0 , 192.168.1.23/24 ) 所在 sub-net 的設定﹕ subnet 192.168.1.0 netmask 255.255.255.0 { range 192.168.1.30 192.168.1.50; option broadcast-address 192.168.1.255; option routers 192.168.1.23; option domain-name-servers 192.168.1.23, 168.95.1.1; } |
要測試 DHCP 是否工作﹐最好是設定 DHCP 客戶端了。還不簡單﹐找一台在同一個網路的 Linux 機器﹐將它的界面轉成使用 DHCP 就是了。您先確定客戶端那邊裝有 dhcpcd 套件﹐然後只需修改 /etc/sysconfig/network-scripts/ifcfg-eth0 這個檔案就行﹕
DEVICE="eth0" ONBOOT="yes" BOOTPROTO="dhcp" IPADDR= NETMASK= BROADCAST= NETWORK= |
然後執行 ifdown eth0 和 ifup eth0 將界面重新啟動﹐再執行 ifconfig 您就知道 DHCP 是否運作了。
如果您不用 script 修改﹐那您可以用手工的命令來啟動或關閉界面﹕
ifconfig eth0 down dhcpcd eth0 dhcpcd -k eth0 |
第一個 dhcpcd 命令是嘗試讓 eth0 透過 dhcp 取得 IP 設定﹐而第二個命令則釋放 dhcp 的設定﹐也就是關閉界面。您如果有興趣看看 dhcpcd 命令的其它參數和功能﹐請 man dhcpcd 慢慢看吧。
如果您使用的是 Windows 系統﹐那麼請到 控制台 --> 網路 --> ‘TCP/IP -> 網路卡’--> IP 位址 --> 自動取得 IP 位址 --> 確定 --> 確定 --> 重新啟動機器﹕
當登錄之後﹐執行﹕ 開始 --> 執行 --> winipcfg --> 尚有資訊 --> 更新﹐這樣就可以驗證 DHCP 的設定了。您可以在 DHCP 伺服器那端改動設定(例如租約時間)﹐重新啟動 dhcpd 服務後﹐再回來可以按“更新”看看新設定是否生效﹖
host myclient { hardware ethernet 00:E0:C5:E4:02:EE; deny booting; } |
這裡﹐我要感謝『我本善良』兄提供這個方法。
透過 DHCP 可以簡化大量的 IP 設定工作﹐因為只需在 server 上設定就好﹐無需跑到每一台機器上亂忙一通﹐實在是網路管理員的一大利器﹗
如果您的網路夠大﹐那可能會跨好幾個子網路﹐而且各子網路在物理連線上都是相互分隔﹑透過 router 連接的。我們都知道 DHCP 的運作初期主要靠廣播形式進行﹐如果經過 router 的話﹐是沒辦法將廣播送到另外的子網路去的。這樣的話﹐您或許需要在每一個子網路上面設定獨立的 DHCP server﹐然而﹐您是否想將所有設定都集中在單一的伺服器上呢﹖
答案是﹕可以的﹐但需要借助 DHCP RELAY 功能。只要您的系統裝有 dhcp 套件﹐裡面就帶有 dhcrelay 工具了﹐所以不用擔心。但是在我的實作上﹐花了一整天都搞不定﹐後來臨睡覺前收到朋友 Song 兄 的建議﹐第二天起來﹐一試就成功了﹗故事浪漫﹑場面感人﹑過程曲折﹑情節離奇﹑主角神勇 ....
好開心哦~~~ 您是否被比這個故事吸引了呢﹖是否也想玩玩看呢﹖是的話﹐就不要錯過下面的精彩內容了。
大家或許已經在“”中看過我家裡面的網路環境了﹕
然而﹐正因為這個環境的緣故﹐竟然讓我浪費了一天時間﹗前面所教的設定﹐都在我那台 rh71 的機器上進行﹐它同時也作為 3 個子網路的 gateway 。為了測試﹐我先將 rh71 的 dhcpd 服務停掉﹐然後將整個 dhcpd.conf 設定檔原封不動的搬到 mdk 上面﹐並且成功的啟動 dhcpd 服務。
然後我在 rh71 上啟動 dhcp-relay 功能﹐很簡單﹕
dhcrelay -i eth1 -i eth2 192.168.100.24 |
先解釋一下這個命令吧﹕如果機器上有多張界面﹐採用 -i 參數則讓 dhcp relay 僅向指定的界面提供 DHCP 服務﹔如果沒有 -i 參數﹐則向所有界面提供服務。因為我的 eth0 和新的 DHCP server (mdk) 同一個網路﹐所以無需為 eth0 提供 relay﹐於是我就用 -i 向 eth1 和 eth2 連接的網路提供服務而已。
不管您有沒有指定界面﹐您必須指定 DHCP server 的 IP 位址或主機名稱﹐可以用空白鍵分隔而羅列多台伺服器。
好了﹐我原本以為這樣設定就可以跑到另外的子網路那邊測試了。誰知道怎麼弄都不行﹐不管 client 那邊用 windows 還是 linux 都失敗。我在所有的機器上打開 tcpdump 來抓封包﹐發現另外那兩個界面(10.0.1.1 和 10.0.1.131) 一直在送 192.168.100.24 的 arp 查詢﹐而且一直都失敗﹐更可恨的是﹐在它的 arp table 上面本來就有這個記錄了﹗搞不明白為什麼還要查詢﹐但又不在正確的界面上送﹐而且﹐在 mdk 上面卻沒收到半個封包﹐別說 dhcp discover 了(順利的應該是這個)﹐連 arp query 的也沒收到﹗
那我開始懷疑是 dhcrelay 的問題了﹐因為我將它的 process 關閉之後﹐就不會出現 arp 問題了﹐但當然囉﹐client 那邊也不可能獲得 dhcp offer 。於是耗了大半天上網找資料﹐isc﹑google﹑openfind 都翻遍了﹐過濾出來的文章只有很少提到這個問題﹐而且有介紹 dhcp relay 的文章都說得很輕鬆﹐似乎他們都沒有任何問題似的﹗
此刻﹐突然記得朋友 Song 兄曾經在新聞組上提到過 dhcp relay 的文章(雖然我找不回來是哪篇﹖)﹐於是在黑暗中燃起一線希望﹐寫了封信去問他。Song 兄 很快就回信了﹐並給了我一些意見﹐我也一一照辦了﹐但還是不行~~~ >_<
於是﹐我也將這個測試丟下了﹐先將 remote boot (也就是後面的文章) 寫起來再說。哈~~ Song 兄 這位朋友真夠意思﹐既然為著我的事情念念不忘﹐在睡覺前來了一封 email﹐叫我不要在 rh7.1 上執行 dhcrelay﹐因為不知道是否因為它同是 router 的關係﹐云云。嗯﹐這時候我的文章寫得正濃﹐也沒急著試﹐於是就將測試放到第二天了。
(鏡頭移到床頭燈﹐然後突然熄滅... 接下來畫面上以打字體伴隨打字聲陸續顯示出“第 二 天”這幾個字....)
我於是將 acer 這台 notebook 接到 10.0.1.128/27 這個子網路去﹐將 rh 7.1 的 dhcrelay 關閉﹐然後在 lp64 上面執行﹕dhcrelay 192.168.100.24 (之前我當然是 ping 過可以連線的)。然後轉到 client 上﹐然後... 奇跡就出現了﹗雖然 arp query 還是會送﹐但卻能正確的從 rh71 這台 gateway 上獲得 reply ﹐當然﹐我的 dhcp client 也能成功的抓到 server 的分配﹗﹗這個從 tcpdump 和 server 的 log 上面就可以得到驗證﹐然後再修改一下設定﹐測試用 host 發放固定 IP 也沒問題~ 呵~~~ 太開心啦﹗(真可恨旁邊沒人給我 give me five! )
故事講完了。 ^_^
怎樣﹖是否意尤未盡還想玩玩更勁爆的呢﹖ 想的話就繼續囉~~~
記得曾經答應過網友要寫關於 remote boot 的文章﹐現在應該是付諸行動的時候了。說實在﹐要設定 remote boot 並不容易﹐除了要非常了解 DHCP 運作和設定之外﹐您還必須知道 Linux 核心設定和整個檔案系統架夠﹐還有開機和關機程序。
好了﹐廢話不多說﹐先看看我整理出來的步驟吧﹕
server-identifier 192.168.100.23; # 在多張網路卡的時候可以加上﹐可不設 default-lease-time 864000; max-lease-time 1296000; use-host-decl-names on; # 這行要加上 shared-network siyongc { # 這是 share-network 範例﹐可以不設(參考前述) option domain-name "siyongc.domain"; subnet 192.168.100.0 netmask 255.255.255.0 { range 192.168.100.30 192.168.100.50; range 192.168.100.121 192.168.100.230; option broadcast-address 192.168.100.255; option routers 192.168.100.23; option domain-name-servers 192.168.0.23, 139.175.10.20, 168.95.1.1; host kennynb { hardware ethernet 00:90:CC:10:A8:8C; fixed-address 192.168.100.21; } group { # 這是 group 範例﹐一定要設 default-lease-time -1; # 將租約時間設為無限 next-server 192.168.100.23; # 作為 boot server 的位址 # option dhcp-class-identifier "PXEClient"; # 這個很奇怪(請參考後述)﹗ option vendor-encapsulated-options 01:04:00:00:00:00; # 這行我不甚了解 host acer { # 這個 host 名稱和 /tftpboot 的 client 目錄名稱要一致 hardware ethernet 00:D0:59:26:DD:A9; fixed-address 192.168.100.20; option broadcast-address 192.168.100.255; option option-135 "linux"; # 這會尋找 /tftpboot/linux.bpb 檔 filename "bpbatch"; # 這是用來初始化 bootp 的批次檔 } } } } |
servcie dhcpd restart |
service tftp { disable = no socket_type = dgram protocol = udp wait = yes user = root server = /usr/sbin/in.tftpd server_args = -s /tftpboot } |
service xinetd restart |
mkdir /tftpboot cp bpb-exe.tar.gz /tftpboot cd /tftpboot tar zxvf bpb-exe.tar.gz cp bpbatch.P bpbatch |
註﹕如果您使用 RedHat 預設的 tftp 服務﹐那一定要複製或改名 bpbatch.P 檔為 bpbatch 。
set CacheNever="ON" linuxboot "bzImage" "root=/dev/nfsroot nfsroot=192.168.100.23 ip=192.168. 100.20:192.168.100.23:192.168.100.23:255.255.255.0:acer.siyongc.domain:eth0:" |
注意﹕最後兩行是因為熒幕寬度限制顯示為兩行﹐您一定要寫成單行﹐而且不能用 \ 符號跳脫 Enter 寫為兩行﹗
基本上上﹐關於 IP 的設定格式如下﹕
ip=
註﹕目前的設定是﹕ Server IP 為 192.168.100.23 ﹐而 Client 的 IP 為 192.168.100.20﹐且沒有設定 'autoconf' 。
Networking options ---> [*] IP: kernel-level configuration support [*] DHCP support [*] BOOTP support [*] RARP support Network device support ---> Ethernet (10 or 100Mbit) ---> <*> EtherExpressPro/100 support <*> PCI NE2000 support # 或是您所使用的網路卡﹐一定要編為內建﹗ Filesystems ---> <*> Kernel automounter support Network File Systems ---> <*> NFS filesystem support [*] Root file system on NFS |
make dep make clean make bzImage mknod /dev/nfsroot b 0 255 cd arch/i386/boot/ /usr/sbin/rdev bzImage /dev/nfsroot # 修改核心用﹐我不確定是否必須。 cp bzImage /tftpboot |
假如您需要針對客戶端主機編譯模組或其它功能﹐請按需自己進行。
127.0.0.1 localhost.localdomain localhost 192.168.100.23 rh71.siyongc.domain rh71 192.168.100.20 acer.siyongc.domain acer |
mkdir /tftpboot/acer cd /tftpboot/acer cp -a /bin . cp -a /boot . cp -a /dev . cp -a /etc . cp -a /lib . cp -a /opt . cp -a /sbin . cp -a /root . cp -a /var . mkdir home mkdir mnt mkdir proc mkdir tmp mkdir usr chmod 1777 tmp |
要注意哦﹐我這裡是一個偷懶的辦法。如前述﹐您最好真的在一台樣板 client 機器上設定一個完整的系統﹐然後再複製到 server 端的相應目錄去。您一定要確定作為 client 系統的目錄名稱﹐必須和 dhcpd.conf 中所指定的 host name 要一致。
/tftpboot 192.168.100.*(rw,no_root_squash) /tftpboot/acer 192.168.100.20(rw,no_root_squash) /home 192.168.100.*(rw,no_root_squash) /usr 192.168.100.*(rw,no_root_squash) |
/usr/sbin/exportfs -a # 或是﹕ service nfs stop service nfs start |
HOSTNAME: acer.siyongc.domain fstab: 192.168.100.23:/tftpboot/acer / nfs defaults 0 0 192.168.100.23:/home /home nfs defaults 0 0 192.168.100.23:/usr /usr nfs defaults 0 0 none /proc proc defaults 0 0 none /dev/pts devpts gid=5,mode=620 0 0 resolv.conf: nameserver 192.168.100.23 nameserver 168.95.1.1 sysconfig/network: NETWORKING=yes HOSTNAME=acer.siyongc.domain GATEWAY=192.168.100.23 GATEWAYDEV=eth0 NISDOMAIN=chen sysconfig/network-scripts/ifcfg-eth0: DEVICE=eth0 BOOTPROTO=dhcp ONBOOT=no |
cd /tftpboot/acer/etc rm dhcpd.conf echo "" > exports cd rc.d/rc6.d rm *netfs* rm *killall |
說老實的﹐我不是很了解系統的關機程序﹐我只是發現如果不刪除這些檔的話﹐在關機的時候或許會當住。我不知道是什麼原因﹐但我想應該可以對系統作更仔細的調整來解決這個問題。如果您研究出方法的話﹐那最好 告訴我。謝謝﹗
就這樣﹐您就可以在沒有磁碟上的機器上安裝 Linux 系統了﹗是否太棒了呢~ ^_^ 如果您碰到問題﹐那請小心檢查您的打字準確性。其中最重要的是 server 端的 dhcpd.conf 和 linux.bpb 檔。其它的﹐當然也需要您具備一定的知識﹐例如 nfs﹑kernel﹑和開機﹑關機程序等等。
我當初也是花了很多時間才測試起來﹐還專門為了它花 NT$1,400 買了張 Intel 的 eepro100 網路卡﹗不過﹐可笑的是我竟然不能用它成功啟動﹐反而用 notebook 內建的網路卡(也是 eepro100 )弄起來了﹗換用 3Com 的 905cTX 又可以﹗怎一個怪字了得﹖
我用 tcpdump 抓封包的結果﹐發現用那片 Intel 網卡啟動的話﹐會一直嘗試 4011 這個 udp port ﹐而獲得 port unreachalbe 的 icmp 錯誤﹐後來看文件說﹕4011 只在 proxy dhcp 的情況下使用﹐但事實上在這個網路環境中﹐無需設定 proxy 啊~~ anyway﹐我到 intel 網站下載了 pxelinux 的設定工具﹐也發現不將 proxy mode 打開的話﹐就一直碰到 icmp 的錯誤而失敗﹐如果將 proxy mode 打開﹐則獲得 "missed or bad menu file" 的錯誤。
這個問題困繞了我好幾天﹐花了很多時間找資料和嘗試設定﹐後來竟然是用最原始的‘逐段/逐行註解法’搞定的﹗就是將 /etc/dhcpd.conf 中下面這行註解起來就可以了﹕
# option dhcp-class-identifier "PXEClient"; |
我發現兩張 Intel 所採用的 Boot Agent 版本不一樣﹕在 notebook 上的版本是 2.6 ﹔而 desktop 使用的是 3.0.03 。將前述句子註解後﹐並不影響 2.6 版本的啟動。
我覺得設定 remote boot 不是件容易的事情﹐最花時間的是當初找文件的階段﹐我曾經閱讀過如下這些網站資料﹕
不過﹐您要小心其中的一些陷阱﹐例如在 Remote-Boot HOWTO 文章中﹐關於 dhcpd.conf 的 options-155 事實上應該是 options-135 ﹐然而這一個數字之差﹐卻花了我兩天的 research 時間﹗朋友﹐我希望這裡的 tips 能幫您省下這樣的冤枉時間和努力﹗
DHCP 設定應該是蠻簡單的﹐如果一旦設定好了﹐要改動的時候並不多。難點是第一次將它跑起來而已。
至於其它技巧﹐就需要您自己慢慢摸索了。