使用DHCP,爲開發板自動分配IP地址

由於要使用網絡通訊,所以不可避免的要用到dhcp。理想的網絡通訊方式是下面3種都要支持:

1,接入已有網絡。這便要求可以作爲dhcp客戶端,自動獲取Ip。

2,作爲DHCP服務器,動態分配IP。

3,指定固定IP

第3種情況沒有什麼好說的,簡單說下前2種情況。

使用步驟:

(1)在內核的網絡項裏面把DHCP配置上,

    Networking --->
    Networking support  
    Networking options --->
           Packet socket                 //添加.配置CONFIG_PACKET
          [ * ]     IP: DHCP support         //添加
          [ * ] Network packet filtering (replaces ipchains) --->  //添加,後面子選項可不選,配置CONFIG_NETFILTER

說明:若沒選 Packet socket, [ * ] Network packet filtering (replaces ipchains) --->選項,在執行udhcpc命令時出現如下錯誤:

   [root@(none) /]# udhcpc -f
   udhcpc (v1.13.2) started
   eth0: link up, 100Mbps, full-duplex, lpa 0x41E1
   udhcpc: socket: Address family not supported by protocol


(2)在busybox裏面把[*]udhcp server(udhcpd)

                          [*]udhcp client(udhcpc)都選上。

    udhcpd就是終端設備作爲DHCP服務器 ;udhcpc就是終端設備作爲DHCP客戶端

    若busybox沒編譯相應選項,也可從網上下載相應文件,用arm-linux交叉編譯得到udhcpd,udhcpc命令copy到usr/sbin下就可以了。


 

1>編譯Busybox,使make menuconfig,添加以下選項:

Networking Utilities --->
udhcp Server/Client --->
       [ ] udhcp Server (udhcpd)       //在此不作服務端,故不選。生成udhcpd命令
udhcp Client (udhcpc)       //生成udhcpc命令                               
       [ ] Lease display utility (dumpleases)                        
       [ ] Log udhcp messages to syslog (instead of stdout)        
       [ ] Compile udhcp with noisy debugging messages
若busybox沒編譯相應選項,也可從網上下載相應文件,用arm-linux交叉編譯得到udhcpd,udhcpc命令copy到usr/sbin下就可以了。

說明:有種方法說是從網上下的udhcp_0.9.8cvs20050303.orig.tar.gz文件,解壓後修改Makefile文件,
在19行添加CROSS_COMPILE=arm-linux-  
註釋12行的COMBINED_BINARY=1,
否則不生成udhcpc命令。

注:使用0.9.8版本的udhcp貌似也不行,重新編譯Busybox1.9.2版本。

2>使用Busybox下的simple.script,/usr/share/udhcpc/下,並重命名爲default.script,修改default.script中RESOLV_CONF="/etc/resolv.conf"爲RESOLV_CONF="/tmp/resolv.conf"

說明:從網上下了幾個default.script貌似無法使用,提示無法找到default.script文件,使用上面的方法較好。由於 使用Cramfs文件系統,etc目錄不可寫,運行udhcp.c時會提示無法創建resolv.conf

3>將生成的udhcpc複製到開發板/sbin下,在控制檯下運行udhcpc即可,很快就可以從DHCP SERVER獲得IP地址。但是有個問題,開發板可以獲得IP地址,在路由器裏也可以看到分配地址了,問題是一使用PING命令,不管是PC 機PING 開發板,還是開發板PING PC 機,就會造成開發板死機。試了好多方法,檢查ROUTE,檢查ARP,修改Default.script ,始終無法解決。

 

 

1>使用udhcpc時 ,就可以直接把simple.script拿來使用,busybox裏面默認的目錄文件是/usr/share/udhcpc/default.script(改下名)

可以查看下幫助

# udhcpc --help

#udhcpc -f

udhcpc 之後需要關閉網卡,之後需要送重開網卡使用命令

ifconfig eth0 down
ifconfig eht0 up

之後就能正常工作了,

如果無法PING本機,設置迴環地址就可以了

ifconfig lo 127.0.0.1

 

/************PC上使用udhcpc*****************************

從使用的角度來說,無線網卡最好用DHCP動態獲取IP地址,在LINUX下使用DHCP獲取地址有幾種方法,在桌面機LINUX一種是配置網卡的 啓動腳本。即修改/etc/sysconfig/networks-scripts/ifg-XXXX(後面是設備名)。如wlan0的設備就是 ifconfig-wlan0.第一塊網卡就是 ifg-eth0,

靜態IP的配置文件如下 

DEVICE=eth0

BOOTPROTO=none

BROADCAST=192.168.0.255

IPADDR=192.168.0.146

NETMASK=255.255.255.0

NETWORK=192.168.0.0

ONBOOT=yes

USERCTL=no

PEERDNS=no

TYPE=Ethernet

如果用動態IP則修改成

DEVICE=eth0

BOOTPROTO=dhcp # 以後的配置均失效。

BROADCAST=192.168.0.255

IPADDR=192.168.0.146

NETMASK=255.255.255.0

NETWORK=192.168.0.0

ONBOOT=yes

USERCTL=no

PEERDNS=no

TYPE=Ethernet

然後ifconfig eth0 down ,再打開ifconfig eth0 up即可申請IP。

*****************************************************/

 

2> 使用udhcpd,同樣可以直接把busybox自帶的udhcpd.conf作爲參考,按要求配置一下udhcpd.config文件。

    可以查看下幫助

    # udhcpd --help

運行的時候直接#udhcpd -fs /etc/udhcpd.conf


還有一個租約文件(udhcpd.leases)要簡要說說,使用udhcpd時會要求建立一個租約文件,按照提示創建一個就行了,它起什麼作用呢?就是爲了記錄客戶端所獲得的IP,如果沒有租約文件,則會重新給客戶端分配一個新IP,如果有,則使用原先分配的IP。

 

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

另外,摘抄ifconfig用法文章

ifconfig 命令由超級用戶使用,用來配置所有的網絡接口參數。也可以被用來重新定義一個接口的IP地址或其它的操作參數。

一、檢查網絡接口

例如:

*檢查所有網絡接口的狀態:

# ifconfig –a
lo0: flags=849<UP,LOOPBACK,RUNNING,MULTICAST>; mtu 8232
inet 127.0.0.1 netmask ff000000
le0: flags=863<UP,BROADCAST,NOTRAILERS,RUNNING,MULTICAST>;
mtu 1500 inet 128.50.1.2 netmask ffff0000 broadcast 128.50.255.255
ether 8:0:20:75:6e:6f

*檢查一個接口的狀態:

# ifconfig le0
le0: flags=863<UP,BROADCAST,NOTRAILERS,RUNNING,MULTICAST>;
mtu 1500 inet 128.50.1.2 netmask ffff0000 broadcast 128.50.255.255
ether 8:0:20:75:6e:6f

各字段含義:
lo0,le0——網絡接口的設備名
Flags——網絡接口狀態的數字表示方式,狀態變量已經在包中定義,將在後來討論。
MTU——MTU用來定義包的存儲片
Inet——接口的Internet 地址
netmask——掩碼應用於網絡層包的輸入和輸出。掩碼被用來定義哪些值是用來表示網絡地址的位。
Broadcast——廣播地址,用來發送信息到所有主機。
Ether——由ARP使用的以太網地址(MAC)

—狀態段
UP——這個標誌指出這個接口是開放的,可以發送和接收數據。
DOWN——相反的,這個標誌指出這個接口是關閉的,也就是說,此時不能爲主機發送和轉發包。
NOTRAILERS——這個標誌指出了一個報文尾不包括以太幀的尾部。報文尾是在Berkerley Unix系統中使用的把信息頭加到包尾的一種方式。在Solaris2.x系統中已經不支持。
RUNNING——這個標誌指出,該接口已經被系統識別。
MULTICAST——這表示接口支持多路傳送地址。
BROADCAST——這表示接口支持廣播地址。

二、網絡地址配置


——解決網絡接口故障

丟失,不完整,或不正確的配置網絡接口參數,將會引起連接失敗。如:一個主機可能拒絕掛接(mount)遠程文件系統,拒絕發送和接收郵件,拒絕執行打印任務,如果一個主機的接口配置錯誤的話。
爲了確保主機接口配置的正確,要檢查如下幾項:
所有的接口狀態是否爲UP
IP地址是否正確
子網掩碼是否正確
廣播地址是否正確

——重新配置網絡接口參數

* 允許一個網絡接口(Enable):

# ifconfig le0 up
# ifconfig le0
le0: flags=863<UP,BROADCAST,NOTRAILERS,RUNNING,MULTICAST>;
mtu 1500 inet 128.50.1.2 netmask ffff0000 broadcast 128.50.255.255
ether 8:0:20:75:6e:6f

*開放一個網絡接口(Disable):

# ifconfig le0 down
# ifconfig le0
le0: flags=863<BROADCAST,NOTRAILERS,RUNNING,MULTICAST>; mtu 1500
inet 128.50.1.2 netmask ffff0000 broadcast 128.50.255.255
ether 8:0:20:75:6e:6f

*關閉一個網絡接口(Close):

# ifconfig le0 unplumb
# ifconfig le0
ifconfig : SIOCGIFFLAGS:le0:no such interface

*打開一個網絡接口(Open):

# ifconfig le0 plumb
# ifconfig le0
le0:flags=842<BROADCAST,RUNNING,MULTICAST>; mtu 1500
inet 0.0.0.0 netmask 0
ether 8:0:20:75:6e:6f

*設置一個IP地址,允許接口但不允許 trailers:

# ifconfig le0 inet 128.50.1.2 –trailers up
# ifconfig le0
le0: flags=842<UP,BROADCAST,NOTRAILERS,RUNNING,MULTICAST>;
mtu 1500 inet 128.50.1.2 netmask ffff0000 broadcast 128.50.255.255
ether 8:0:20:75:6e:6f

*改變掩碼值和廣播值來正確的反映新的掩碼:

# ifconfig le0 netmask 255.255.255.0 broadcast +
# ifconfig le0
le0: flags=843<UP,BROADCAST,RUNNING,MULTICAST>; mtu 1500
inet 128.50.1.2 netmask ffffff00 broadcast 128.50.1.255
ether 8:0:20:75:6e:6f

*在正確的設置子網掩碼後改變所有的廣播地址:

# ifconfig –a
lo0: flags=849<UP,LOOPBACK,RUNNING,MULTICAST>; mtu 8232
inet 127.0.0.1 netmask ff000000
le0: flags=863<UP,BROADCAST,NOTRAILERS,RUNNING,MULTICAST>; mtu 1500
inet 128.50.1.5 netmask ffffff00 broadcast 128.50.255.255
ether 8:0:20:75:8b:59
le1: flags=842<BROADCAST,NOTRAILERS,RUNNING,MULTICAST>; mtu 1500
inet 128.50.3.6 netmask ffffff00 broadcast 128.50.255.255
ether 8:0:20:75:8b:59
# ifconfig –a broadcast +
# ifconfig –a
lo0: flags=849<UP,LOOPBACK,RUNNING,MULTICAST>; mtu 8232
inet 127.0.0.1 netmask ff000000
le0: flags=863<UP,BROADCAST,NOTRAILERS,RUNNING,MULTICAST>; mtu 1500
inet 128.50.1.5 netmask ffffff00 broadcast 128.50.1.255
ether 8:0:20:75:8b:59
le1: flags=842<BROADCAST,NOTRAILERS,RUNNING,MULTICAST>; mtu 1500
inet 128.50.3.6 netmask ffffff00 broadcast 128.50.3.255
ether 8:0:20:75:8b:59

--End--

發佈了9 篇原創文章 · 獲贊 3 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章