由于要使用網絡通訊,所以不可避免的要用到dhcp。理想的網絡通訊方式是下面3種都要支持:
1,接入已有網絡。這便要求可以作為dhcp客戶端。
2,作為DHCP服務器,動態分配IP。
3,指定固定IP
第3種情況沒有什么好說的,簡單說下前2種情況。
使用步驟:
(1)在內核的網絡項里面把DHCP配置上;
(2)在busybox里面把[*]udhcp server(udhcpd)
[*]udhcp client(udhcpc)都選上。
udhcpd就是終端設備作為DHCP服務器
udhcpc就是終端設備作為DHCP客戶端
busybox里面對dhcp都已經給出例子了,
[zhh@localhost busybox-1.14.1]$ ls ./examples/udhcp/
sample.bound? sample.deconfig? sample.nak? sample.renew? sample.script? simple.script? udhcpd.conf
比如使用udhcpc時
就可以直接把simple.script拿來使用,改不改名字都可以,busybox里面默認的目錄文件是/usr/share/udhcpc/default.script
可以查看下幫助
# udhcpc --help
BusyBox v1.14.1 (2010-01-22 10:35:16 CST) multi-call binary
Usage: udhcpc [-Cfbnqtvo] [-c CID] [-V VCLS] [-H HOSTNAME] [-i INTERFACE]
[-p pidfile] [-r IP] [-s script] [-O dhcp-option]... [-P N]
-V CLASSID????? Vendor class identifier
-i INTERFACE??? Interface to use (default: eth0)
-H,-h HOSTNAME? Client hostname
-c CLIENTID???? Client identifier
-C????????????? Suppress default client identifier
-p file???????? Create pidfile
-r IP?????????? IP address to request
-s file???????? Run file at DHCP events (default /usr/share/udhcpc/default.script)
-t N??????????? Send up to N request packets
-T N??????????? Try to get a lease for N seconds (default 3)
-A N??????????? Wait N seconds (default 20) after failure
-O OPT????????? Request DHCP option OPT (cumulative)
-o????????????? Do not request any options (unless -O is also given)
-f????????????? Run in foreground
-b????????????? Background if lease is not immediately obtained
-S????????????? Log to syslog too
-n????????????? Exit with failure if lease is not immediately obtained
-q????????????? Quit after obtaining lease
-R????????????? Release IP on quit
-P N??????????? Use port N instead of default 68
-a????????????? Use arping to validate offered address
#
這樣就很好理解了。
下面就說說使用udhcpd,同樣可以直接把busybox自帶的udhcpd.conf作為參考,怎么設置該文件就不詳述了,去參考相關文檔即可。看看udhcpd怎么使用
# udhcpd --help
BusyBox v1.14.1 (2010-01-22 10:35:16 CST) multi-call binary
Usage: udhcpd [-fS] [-P N] [configfile]
DHCP server
-f????? Run in foreground
-S????? Log to syslog too
-P N??? Use port N instead of default 67
幫助一目了然。
我使用的時候直接
#udhcpd /etc/udhcpd.conf
即可。
還有一個租約文件要簡要說說,使用udhcpd時會要求建立一個租約文件,按照提示創建一個就行了,它起什么作用呢?就是為了記錄客戶端所獲得的IP,如果沒有租約文件,則會重新給客戶端分配一個新IP,如果有,則使用原先分配的IP。
?
例如:udhcpc -i wlan0是獲取wlan0的ip地址,如果想獲取之后直接退出,添加 -q參數,即:udhcpc -q -i wlan0
?
udhcpc切換到后臺:
它自帶參數可以實現該功能。如下:
?? udhcpc -b -i eth0 -p /var/run/udhcpc.pid -R
解釋一下,-b就是切換到后臺指令,-i是指定使用哪個網絡接口,雙網卡的時候一定要使用它來指定eth0? or ?eth1。
對于 -R參數,其實也很重要,在關閉udhcpc時,可以向dhcpserver發送release取消租約。
?
udhcpc scripts
Here's some debian scripts I wrote for udhcpc 0.9.6. I wanted to make it easy to run local scripts for DHCP changes so I created /etc/udhcpc.d. All the /usr/share/udhcpc/default.* scripts have been merged into /etc/udhcpc.d/S50default. S99local is an example script that patches resolv.conf and calls a DNS update script.
/etc/init.d/udhcpc
/etc/udhcpc.script
/etc/udhcpc.d/S50default
/etc/udhcpc.d/S99local
?
http://udhcp.busybox.net/README.udhcpc
udhcp client (udhcpc)
--------------------
The udhcp client negotiates a lease with the DHCP server and notifies
a set of scripts when a leases is obtained or lost.
command line options
-------------------
The command line options for the udhcp client are:
-c, --clientid=CLIENTID Client identifier
-H, --hostname=HOSTNAME Client hostname
-h, Alias for -H
-f, --foreground Do not fork after getting lease
-b, --background Fork to background if lease cannot be
immediately negotiated.
-i, --interface=INTERFACE Interface to use (default: eth0)
-n, --now Exit with failure if lease cannot be
immediately negotiated.
-p, --pidfile=file Store process ID of daemon in file
-q, --quit Quit after obtaining lease
-r, --request=IP IP address to request (default: none)
-s, --script=file Run file at dhcp events (default:
/usr/share/udhcpc/default.script)
-v, --version Display version
If the requested IP address cannot be obtained, the client accepts the
address that the server offers.
udhcp client scripts
-------------------
When an event occurs, udhcpc calls the action script. The script by
default is /usr/share/udhcpc/default.script but this can be changed via?
the command line arguments. The three possible arguments to the script?
are:
deconfig: This argument is used when udhcpc starts, and
when a leases is lost. The script should put the interface in an
up, but deconfigured state, ie: ifconfig $interface 0.0.0.0.
bound: This argument is used when udhcpc moves from an
unbound, to a bound state. All of the paramaters are set in
enviromental variables, The script should configure the interface,
and set any other relavent parameters (default gateway, dns server,?
etc).
renew: This argument is used when a DHCP lease is renewed. All of
the paramaters are set in enviromental variables. This argument is
used when the interface is already configured, so the IP address,
will not change, however, the other DHCP paramaters, such as the
default gateway, subnet mask, and dns server may change.
nak: This argument is used with udhcpc receives a NAK message.
The script with the deconfig argument will be called directly
afterwards, so no changes to the network interface are neccessary.
This hook is provided for purely informational purposes (the
message option may contain a reason for the NAK).
The paramaters for enviromental variables are as follows:
$HOME - The set $HOME env or "/"
$PATH - the set $PATH env or "/bin:/usr/bin:/sbin:/usr/sbin"
$1 - What action the script should perform
interface - The interface this was obtained on
ip - The obtained IP
siaddr - The bootp next server option
sname - The bootp server name option
boot_file - The bootp boot file option
subnet - The assigend subnet mask
timezone - Offset in seconds from UTC
router - A list of routers
timesvr - A list of time servers
namesvr - A list of IEN 116 name servers
dns - A list of DNS server
logsvr - A list of MIT-LCS UDP log servers
cookiesvr - A list of RFC 865 cookie servers
lprsvr - A list of LPR servers
hostname - The assigned hostname
bootsize - The length in 512 octect blocks of the bootfile
domain - The domain name of the network
swapsvr - The IP address of the client's swap server
rootpath - The path name of the client's root disk
ipttl - The TTL to use for this network
mtu - The MTU to use for this network
broadcast - The broadcast address for this network
ntpsrv - A list of NTP servers
wins - A list of WINS servers
lease - The lease time, in seconds
dhcptype - DHCP message type (safely ignored)
serverid - The IP of the server
message - Reason for a DHCPNAK
tftp - The TFTP server name
bootfile - The bootfile name
additional options are easily added in options.c.
note on udhcpc's random seed
---------------------------
udhcpc will seed its random number generator (used for generating xid's)
by reading /dev/urandom. If you have a lot of embedded systems on the same
network, with no entropy, you can either seed /dev/urandom by a method of
your own, or doing the following on startup:
ifconfig eth0 > /dev/urandom
in order to seed /dev/urandom with some data (mac address) unique to your
system. If reading /dev/urandom fails, udhcpc will fall back to its old
behavior of seeding with time(0).
signals accepted by udhcpc
-------------------------
udhcpc also responds to SIGUSR1 and SIGUSR2. SIGUSR1 will force a renew state,
and SIGUSR2 will force a release of the current lease, and cause udhcpc to
go into an inactive state (until it is killed, or receives a SIGUSR1). You do
not need to sleep between sending signals, as signals received are processed
sequencially in the order they are received.
compile time options
-------------------
options.c contains a set of dhcp options for the client:
name[10]: The name of the option as it will appear in scripts
flags: The type of option, as well as if it will be requested
by the client (OPTION_REQ)
code: The DHCP code for this option
?實現DHCP自動獲取IP地址?
分類: LINUX
前提:系統已經實現DNS(即使用pingwww.baidu.com測試時能ping通)。
1.?在內核中添加以下選項:
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命令時出現如下錯誤:
~ # udhcpc
udhcpc (v0.9.9-pre) started
udhcpc[208]: udhcpc (v0.9.9-pre) started
?
FATAL: couldn't listen on socket, Address family not supported by protocol
udhcpc[208]: FATAL: couldn't listen on socket, Address family not supported by protocol
2.? Busybox中添加以下選項:
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命令。
3.?建相關配置文件
從busybox的examples/udhcp/下copy? simple.script文件到開發板/usr/share/udhcpc/下,并重命名為default.script,udhcp_0.9.8cvs20050303.orig.tar.gz中也有這樣的文件。
[root@localhost root]# vi usr/share/udhcpc/default.script
#!/bin/sh
?
# udhcpc script edited by Tim Riker <Tim@Rikers.org>
?
[ -z "$1" ] && echo "Error: should be called from udhcpc" && exit 1
?
RESOLV_CONF="/etc/resolv.conf"
[ -n "$broadcast" ] && BROADCAST="broadcast $broadcast"
[ -n "$subnet" ] && NETMASK="netmask $subnet"
?
case "$1" in
? ? ? ? deconfig)
? ? ? ? ? ? ? ? /sbin/ifconfig $interface 0.0.0.0
? ? ? ? ? ? ? ? ;;
?
? ? ? ? renew|bound)
? ? ? ? ? ? ? ? /sbin/ifconfig $interface $ip $BROADCAST $NETMASK
?
? ? ? ? ? ? ? ? if [ -n "$router" ] ; then
? ? ? ? ? ? ? ? ? ? ? ? echo "deleting routers"
? ? ? ? ? ? ? ? ? ? ? ? while route del default gw 0.0.0.0 dev $interface ; do
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? :
? ? ? ? ? ? ? ? ? ? ? ? done
? ? ? ? ? ? ? ? ? ? ? ? for i in $router ; do
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? route add default gw $i dev $interface
? ? ? ? ? ? ? ? ? ? ? ? done
? ? ? ? ? ? ? ? fi
?
? ? ? ? ? ? ? ? echo -n > $RESOLV_CONF
? ? ? ? ? ? ? ? [ -n "$domain" ] && echo search $domain >> $RESOLV_CONF
? ? ? ? ? ? ? ? for i in $dns ; do
? ? ? ? ? ? ? ? ? ? ? ? echo adding dns $i
? ? ? ? ? ? ? ? ? ? ? ? echo nameserver $i >> $RESOLV_CONF
? ? ? ? ? ? ? ? done
? ? ? ? ? ? ? ? ;;
esac
?
exit 0
?
4.?重啟開發板,執行udhcpc就可自動獲取IP地址了,以下是執行udhcpc的輸出信息:
?
~ # udhcpc
udhcpc (v0.9.9-pre) started
udhcpc[228]: udhcpc (v0.9.9-pre) started
?
Sending discover...
udhcpc[228]: Sending discover...
?
Sending select for 192.168.1.109...
udhcpc[228]: Sending select for 192.168.1.109...
?
Lease of 192.168.1.109 obtained, lease time 86400
udhcpc[228]: Lease of 192.168.1.109 obtained, lease time 86400
?
deleting routers
route: SIOC[ADD|DEL]RT: No such process
adding dns 192.168.0.1
~ # ping www.baidu.com
PING www.a.shifen.com (220.181.38.4): 56 data bytes
64 bytes from 220.181.38.4: icmp_seq=0 ttl=52 time=1219.0 ms
[1] + Stopped? ? ? ? ? ? ? ? ? ? ping www.baidu.com
?
5.?如果是雙網卡必須用參數指明
例:udhcpc? -i? eth1?
?Linux下hosts、host.conf、resolv.conf的區別
分類: LINUX
這三個文件都位于 /etc/目錄下,在這里區分一下
1.hosts文件.
和Windows系統下的host的文件相類似,就是一個文本文件,里面存放一些IP和域名的對應關系。
2.host.conf. #解析器查詢順序配置文件
例:vi /etc/host.conf
order hosts bind 表示先查詢本地hosts文件,如果沒有結果,再嘗試查找BIND dns服務器。
3. resolv.conf
配置Linux系統DNS服務器的配置文件:
vi /etc/resolv.conf
nameserver 192.168.0.1
nameserver 202.99.96.68