用dnsmasq做PXE引导dhcp、tftp调测记录

启动讨论 grub/grub2/syslinux/grub4dos/Lilo
回复
xstarcd
帖子: 28
注册时间: 2008-11-21 17:18

用dnsmasq做PXE引导dhcp、tftp调测记录

#1

帖子 xstarcd » 2009-05-11 1:14

dnsmasq PXE调测记录
2009-05-10

一、安装

代码: 全选

apt-get install dnsmasq
二、配置

代码: 全选

sudo vi /etc/dnsmasq.conf
原有内容均已加#号注释,在最后添加以下设置即可:

代码: 全选

#-----------------------------------------------------------------------
dhcp-range=192.168.1.50,192.168.1.150,255.255.255.0,12h
dhcp-option=3,192.168.1.1
expand-hosts
domain=myhome.cn
#dhcp-option=44,192.168.1.3
#dhcp-boot=pxelinux.0
dhcp-boot=pxelinux.0,boothost,192.168.1.3	#syslinux启动文件名、tftp服务器IP,与上面注释的两行含义相同
enable-tftp
tftp-root=/home/tftp-root		#注意:tftp-root目录、上级目录以及其中所有文件,需要为dnsmasq用户开放read权限,否则tftp会报权限错误。
#-----------------------------------------------------------------------

三、服务启停
取消自启支服务:

代码: 全选

sudo update-rc.d -f dnsmasq remove
手工启停服务(服务方式启动,运行用户为dnsmasq权限):

代码: 全选

sudo service dnsmasq stop|start|restart
或非服务方式启动,运行用户为root,可直接在console看到dhcplog,便于调测:

代码: 全选

sudo dnsmasq -d --log-dhcp
(调测通过后,若换成以服务方式启动,PXE启动时报tftp权限权限出错,估计为上面提到的逐级目录均需要为dnsmasq用户开可访问权限[r-x]问题。)


四、为Windows PXE安装修正路径符号、文件名大小写问题
问题:
1、windows 路径是\,故tftp 要能识别并在服务端转化为/
2、windows 安装光盘的文件是小写,但是向 tftp 发的文件请求有的大写,有的小写,没有统一起来,tftp要能识别
3、由于dnsmasq不支持rules进行替换,只能其tftp.c源代码进行修改,并重新出dnsmasq执行文件进行替换。

修改:
1、下载源文件dnsmasq-2.47.tar.gz,解开后找到src/tftp.c,找到check_tftp_fileperm函数,把处理逻辑由找不到文件即return NULL;改为替换\->/、文件名转换小写后再试一遍(据说Windows安装文件均为小写文件名,若不是,需要事先将安装文件全转换小写)。
2、修改完成后执行make编译生成dnsmasq
3、覆盖:

代码: 全选

	sudo service dnsmasq stop
	cp /usr/sbin/dnsmasq /usr/sbin/dnsmasq.default
	cp src/dnsmasq /usr/sbin/
	sudo service dnsmasq start
4、附:修改代码diff tftp.c tftp_default.c

代码: 全选

279c279
<   char *packet = daemon->packet, *namebuff = daemon->namebuff,*pt;
---
>   char *packet = daemon->packet, *namebuff = daemon->namebuff;
289c289
<   /*---old default code---
---
>   
302,338c302
< 		  */
< 
< //for windows:path \ to /,file name to lowercase...Change by XStar 2009.05.10
< //-----------------------------------------------------------------
<   if ((fd = open(namebuff, O_RDONLY)) == -1)
<     {
<       if (errno == ENOENT)
< 	{
< 	//--------tolower and try again
< 	  pt = namebuff;
< 	  while(*pt !=0)  {
< 	  	*pt = *pt=='\\'?'/':*pt;
< 		*pt = tolower(*pt);
< 		pt++;	}
< 	
< 	  if ((fd = open(namebuff, O_RDONLY)) == -1)
< 	    {
< 	      if (errno == ENOENT)
< 		{
< 		  *len = tftp_err(ERR_FNF, packet, _("file %s not found"), namebuff);
< 		  return NULL;
< 		}
< 	      else if (errno == EACCES)
< 		goto perm;
< 	      else
< 		goto oops;
< 	    }
< 	//--------
< 	}
<       else if (errno == EACCES)
< 	goto perm;
<       else
< 	goto oops;
<     }
< //-----------------------------------------------------------------
< //change end.
< 
---
>   
5、修改后测试

代码: 全选

sudo vi /etc/dnsmasq.conf
将pxelinux.0改为大写:

代码: 全选

dhcp-boot=PXELINUX.0,boothost,192.168.1.3	#syslinux
测试仍可正常获取pxelinux.0进行引导。

注意:因为文件名修改小写时是按全路径修改的,必须保证文件存放的路径(从根目录开始至tftp-root目录,以及下面的子目录)、文件名全为小写。
xstarcd
帖子: 28
注册时间: 2008-11-21 17:18

Re: 用dnsmasq做PXE引导dhcp、tftp调测记录

#2

帖子 xstarcd » 2009-05-18 17:07

synce与samba可能存在冲突,同步时主机无法自动获得IP,直接sudo dhclient eth1就可以了。
头像
lucky_yjw
帖子: 129
注册时间: 2009-07-17 20:57

Re: 用dnsmasq做PXE引导dhcp、tftp调测记录

#3

帖子 lucky_yjw » 2009-08-12 23:43

image文件的具体制作呢?
本科农民工:
钱少,事多,离家远....
位微,权轻,责任重....
新建的个人网站
头像
冲浪板
论坛版主
帖子: 7513
注册时间: 2007-05-06 8:19

Re: 用dnsmasq做PXE引导dhcp、tftp调测记录

#4

帖子 冲浪板 » 2009-08-13 15:05

mtftp好像总失败....
回复