ARM-Linux配置DHCP自动获取IP地址

ARM-Linux配置DHCP自动获取IP地址

备注:
内核版本:2.6.30.9
busybox版本:1.15.2

PC Linux和开发板Linux的工作用户:root


1. 配置内核:
[*] Networking support  ---> 
 Networking options  ---> 
  <*> Packet socket 
  <*> Unix domain sockets 
  [*] TCP/IP networking
  [*]   IP: kernel level autoconfiguration 
  [*]     IP: DHCP support
  [*] Network packet filtering framework (Netfilter)  --->
2. 配置busybox:
Networking Utilities  --->
 [*] udhcp client (udhcpc)
3.建立配置文件:
从busybox的examples/udhcp/下copy  simple.script文件到开发板/usr/share/udhcpc/下,并重命名为default.script

4. 测试:
在命令台执行udhcpc,注意:必须确保局域网内存在DHCP服务器,否则udhcp执行失败。
在easy2440上面执行结果如下:
udhcpc (v1.15.2) started
Setting IP address 0.0.0.0 on eth0
Sending discover...
Sending select for 192.168.1.101...
Lease of 192.168.1.101 obtained, lease time 7200
Setting IP address 192.168.1.101 on eth0
Deleting routers
route: SIOCDELRT: No such process
Adding router 192.168.1.1
Recreating /etc/resolv.conf
 Adding DNS server 211.148.192.141
 Adding DNS server 210.21.196.6

5. 修改系统初始化配置文件,让开发板开机后自动获取IP地址:
修改/etc/init.d/rcS文件在适当位置添加命令: /sbin/udhcpc &

6. Enjoy it!

 


使用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

 

 

 

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 


  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值