嵌入式linux中的dhcp服务器

时间:2021-08-17 19:57:30

嵌入式系统下,用开发板建立dhcp服务器


1.重新编译内核,添加对dhcp的支持
2.busybox是否带有dhcp的应用,如无,则需要重新编译busybox,或者直接下一个独立的也可。
3.dhcp服务器在etc目录下的配置文件,udhcpd.conf 需要配置这个文件,包括分配的ip,dns等。

我的文件系统中直接具有dhcp的软件,分别为udhcpd和udhcpc,前者是服务器端的,后者是用作客户端的,这样就可以直接配置udhcpd.conf了。参考busybox中的examples,配置好udhcpd.conf,然后执行

udhcpd -fS /etc/udhcpd.conf

就可以启动dhcp服务器了,当然,中间也碰到了一个小问题,这时udhcpd在执行的时候提示没有一个叫做udhcpd.leases的文件,这个只要在相应的文件夹下直接创建以下即可。

一切顺利的话,就可以看到开发板为pc分配ip,gw和dns了!

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

 

**************dhcp
开发板上使用的udhcpc udhcpd两个工具都可以从busybox里面直接编译得来
PC上使用的dhcp工具可以使用 sudo  apt-get install udhcpc
                                                 sudo apt-get install udhcpd

用PC做udhcpd服务器,开发板从PC获取ip(反过来是一样的)
PC上: sudo vi /etc/udhcpd.conf
udhcpd.conf在busybox里面有一个原型: busybox-1.14.2/examples/udhcp/udhcpd.conf
修改三个地方:start/end/option dns

start   192.168.4.200   #default: 192.168.0.20
end     192.168.4.254   #default: 192.168.0.254
//分配ip的区间
#Examles
opt dns 192.168.1.2 192.168.1.10
option  subnet  255.255.255.0
opt router  192.168.1.2
opt wins    192.168.1.10
option  dns 192.168.4.127   # appened to above DNS servers for a total of 3
option  domain  local
option  lease   864000
//option  dns 192.168.4.127做服务器的机器的ip地址

用网线把PC和开发板连接起来。
好了之后  sudo udhcpd
开发板上运行    udhcpc  这样就可以从PC获取ip

 

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

由于要使用网络通讯,所以不可避免的要用到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。
  •  

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

    嵌入式Linux系统下使用DHCP,为开发板自动分配IP地址

    嵌入式linux中的dhcp服务器1、首先确认Linux内核编译生成时选择了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命令时出现如下错误:
    ~ # 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

    嵌入式linux中的dhcp服务器2.编译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版本。

    嵌入式linux中的dhcp服务器3、使用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

      

    嵌入式linux中的dhcp服务器4、将生成的udhcpc复制到开发板/sbin下,在控制台下运行udhcpc即可,很快就可以从DHCP SERVER获得IP地址。但是有个问题,开发板可以获得IP地址,在路由器里也可以看到分配地址了,问题是一使用PING命令,不管是PC 机PING 开发板,还是开发板PING PC 机,就会造成开发板死机。试了好多方法,检查ROUTE,检查ARP,修改Default.script ,始终无法解决。

     

    嵌入式linux中的dhcp服务器花了一整天时间,总算完全解决了。

    1、先是怀疑busybox的问题,OK,开发板上原来移植的是1.9.2 版本,上网找找了发现最新有1.14.0 版本的,详细移植见另一篇文章

    2、Busybox1.9.2 版本貌似是有问题,udhcpc 之后,通过ifconfig 查看IP 信息可以看到广播地址Bcast有问题,始终是255.255.255.255,正确应该是192.168.1.255(网段为192.168.1),使用Busybox1.14.0就没有这个问题了,但问题是PING 仍然无法使用。

    3、偶然情况下发现udhcpc 之后需要关闭网卡,之后再重开网卡使用命令

    ifconfig eth0 down
    ifconfig eht0 up

    之后就能正常工作了,还有问题是无法PING本机,设置回环地址就可以了

    ifconfig lo 127.0.0.1