嵌入式linux通过DHCP自动获取IP地址
(2016-05-06 16:42:17)
标签:
linuxdhcp |
分类: Linux |
虽然还不太懂,但先记录摸索过程,后续懂了再来完善。
1.编译内核选项
在内核中添加以下选项:
Networking
说明:若没选<* > Packet
socket, [ * ] Network packet filtering (replaces
ipchains)
# 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.编译udhcpc
Busybox中添加以下选项:
Networking Utilities
--->
若busybox没编译相应选项,也可从网上下载相应文件,用arm-linux交叉编译得到udhcpd,udhcpc命令copy到usr/sbin下就可以了。
我从
3.建相关配置文件
在文件/usr/share/udhcpc/default.script下编写脚本程序
#!/bin/sh
exec run-parts -a
"$1" /etc/udhcpc.d
在/etc/udhcpc.d/50default文件中编写如下代码:
#!/bin/sh
# udhcpc script edited by Tim Riker
[ -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"
# return 0 if root is mounted on a network filesystem
root_is_nfs() {
}
have_bin_ip=0
if [ -x /sbin/ip ]; then
fi
case "$1" in
esac
exit 0
4./etc/rc5.d中有一个关于网络的启动文件,当嵌入式Linux启动时会进入rc5.d文件执行(因为inittab文件中The default runlevel=5)。其中网络启动脚本S01networking如下:
root@am335x-evm:/etc/rc5.d# cat S01networking
#!/bin/sh
#
### BEGIN INIT INFO
#
Provides:
#
Required-Start:
#
Required-Stop:
#
Default-Start:
#
Default-Stop:
# Short-Description: Raise network interfaces and configure them
### END INIT INFO
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
if ! [ -x /sbin/ifup ]; then
fi
case "$1" in
esac
exit 0
执行此脚本和执行 /etc/init.d/networking是一样的,包括start|stop|restart|force-reload。
其中,ifup -a
会执行/etc/network/interfaces程序(If given to
/etc/network/interfaces下的程序如下所示,应该是声明和启动各种类型的网卡。我这里使用eth0,初始声明为静态static,后面根据配置参数在选择是动态分配dhcp还是静态分配static。
root@am335x-evm:/etc/rc5.d# cat /etc/network/interfaces
# /etc/network/interfaces -- configuration file for ifup(8), ifdown(8)
# The loopback interface
auto lo
iface lo inet loopback
# Wireless interfaces
iface wlan0 inet dhcp
iface tiwlan0 inet dhcp
iface atml0 inet dhcp
# Wired or wireless interfaces
auto eth0
iface eth0 inet static
#
iface eth1 inet dhcp
# Ethernet/RNDIS gadget (g_ether)
# ... or on host side, usbnet and random hwaddr
iface usb0 inet dhcp
# Bluetooth networking
iface bnep0 inet dhcp
#dns-nameservers 114.114.114.114 8.8.8.8
可直接在此文件中配置动态分配dhcp和静态分配static,以及DNS等。配置方法如下:
http://os.51cto.com/art/201003/186914.htm
Ø
auto eth0
iface eth0 inet dhcp
Ø
auto
iface
address
gateway
netmask
#network
#broadcast
我根据用户配置文件来选择动态还是静态,当选择动态dhcp分配时,使用如下命令:
root@am335x-evm:/etc/rc5.d# udhcpc -b -i eth0 -p /var/run/udhcpc.Rpid
udhcpc (v1.22.1) started
Sending discover...
Sending select for 188.188.181.175...
Lease of 188.188.181.175 obtained, lease time 86400
/etc/udhcpc.d/50default: Adding DNS 202.96.209.5
/etc/udhcpc.d/50default: Adding DNS 202.96.209.133
注:解释一下,-b就是切换到后台指令,-i是指定使用哪个网络接口,双网卡的时候一定要使用它来指定eth0
udhcpc -R -q 退出DHCP并且释放IP地址。
root@am335x-evm:/etc/rc5.d# udhcpc -R -q
udhcpc (v1.22.1) started
Sending discover...
Sending select for 188.188.181.175...
Lease of 188.188.181.175 obtained, lease time 86400
/etc/udhcpc.d/50default: Adding DNS 202.96.209.5
/etc/udhcpc.d/50default: Adding DNS 202.96.209.133
Unicasting a release of 188.188.181.175 to 188.188.181.1
Sending release...
Entering released state
系统启动后,当用户选择静态分配IP时,使用ifconfig和route来设置IP地址、掩码地址和网关地址,并在/etc/resolv.conf文件中写入dns解析地址,这样就可以ping通百度了。
echo nameserver 114.114.114.114 > /etc/resolv.conf
echo nameserver 8.8.8.8 >> /etc/resolv.conf
ifconfig eth0 $gateway_ip netmask $gateway_mk
route add default gw $gateway_gw
参考文章:
http://os.51cto.com/art/201003/186914.htm

加载中…