优化pxe网启动时tftp的传输速度 --- 针对pxelinux和bootmgr

  原创地址:http://blog.csdn.net/whoo/article/details/8571550linux


   做为一名IT人士,通常的计算机维护固然很差意思找别人。 因而本身用pxelinux搭了个网络启动环境,能够启动各类WinPE,以供折腾电脑系统,刷新固件的须要。windows

 

    只是通常的网络启动都是基于tftp协议的,传输文件那叫一个慢。启动时光是加载映像文件就得几分钟,简直就像活在史前同样。 找了一圈方法,没辙。 好在这东西也就救急时用用,凑活凑活也行。服务器

 

   因而就这么凑错了几年。。。网络

 

   最近升级到win8了,为了维护环境,加了几个win7,win8的PE。 winxp的pe就在启动菜单上无比折腾(要到二进制文件里去改),win7也没好到哪儿去。可是新的bootmgr自己 提供了启动菜单,   为了简单起见,干脆放弃了在pxelinux里集成多个winpe的菜单了,直接单弄一个目录直接启动bootmgr。须要的时候切换下目录就好了,比强行改二进制文件,而后弄到pxelinux菜单上不知道轻松多少倍。ide

 

   好了,那就从bootmgr的菜单折腾起。过程比较无趣繁琐,一带而过:随便找个例子教程照着改;结果彷佛有时好使有时很差使,缘由不明;一怒之下把BCD的规范定义翻了个遍; 问题解决了,缘由也搞明白了;顺带着还有个意外的收获。性能

 

   这个意外的收获就是发如今BCD的定义中,有两个涉及到TFTP的参数,分别是 windows size 和 block size。当时一看到这两个参数就眼前一亮,要知道TFTP的传输性能弱,关隘全在这俩参数上。测试

   赶忙把这俩参数仔仔细细的查清楚了,马上加到bootmgr的bcd里面。字体

   启动一试, 效果很是显著!!优化

   默认的网络启动过程,网卡的使用率始终在10mbps如下徘徊,大部分状况下更低,一个3M大小的字体文件,都要拷贝好一下子。加上参数后,网卡的利用率马上飙升到40mbps上下,通常都不低于20Mbps。 网络加载速度一会儿快乐好几倍,不再用傻等了,很是之爽。ui

 

下面是个人 bcdedit /store bcd /enum all 的部分输出:

 

  1. 安装程序 Ramdisk 选项  

  2. ---------------------  

  3. 标识符                  {ramdiskoptions}  

  4. ramdisksdidevice        boot  

  5. ramdisksdipath          \BOOT\BOOT.SDI  

  6. ramdisktftpblocksize    40960  

  7. ramdisktftpwindowsize   100  

 

其中能够看到 block size 设成了 40K。window size 设成了 100。 

block size 设成 40k 是为了配合udp封包的优化,虽然理论上能够到63k左右(64k - 包头结构),稍微留点余量仍是比较稳妥的。 实际使用时,block size其实能够更大更随意,好比到1M大小,只是这是程序层的逻辑,到了UDP层仍是自动拆分了。 这个地方选40k纯属经验,并无对比过其余的数值并优化。

 

windows size 这个值其实比较随意,但只在较小的数值范围时,才知足正比关系(越大效率越高);超过必定的数值后,再大也没多大的意义了,并且效率有可能更低,甚至伴随更多的稳定性问题。

我一开始设置的是10,效果就很好了;后来为了对比下,就调成了100,发现100的效率跟10的效率,几乎没有啥区别,即使有提高,估计也就 百分之几顶多十几的提高。 其实这个地方10就足够了,我这儿是由于没啥区别,因此测试后没有改回来。

 

 

原谅我懒于编排文章结构,就这样吧:  以上是bootmgr的部分
------------------------------------------------ 分割线 ------------------------------------------------

如下是pxelinux的部分

 

 

 

上文说到bootmgr里面有两个很隐秘的参数,解决了网络传输性能的大问题。 可是这仅仅针对bootmgr才起做用;对于 基于 pxelinux 启动的部分,仍是老样子。

可是有了上文的成功案例的鼓励,就更加有了改造pxelinux的信心。

 

过程一样是无趣且冗长波折的,这里直接跳转到结果:

结果就是下载syslinux的源码,修改后从新编译---听起来有点麻烦,其实很是简单,尤为是Linux环境下,直接打make就行(其实还须要安装个uuid-dev的包,我没看README,结果找这个uuid.h找了半天,找到了才发现人README里写的很清楚)。

 

修改的地方有两处,都在 core/fs/pxe目录下:

对于 pxe.c, 找到 1408 这个字符串,改为 40960. 这是定义blocksize。

对于 pxe.h,找到  PKTBUF_SIZE 的定义,把 2048 改为 (1024*64)。 这里定义的是接受缓冲区的大小。

 

而后 

make

sudo make netinstall

就好了。

 

其实光make就好了,只是他的makefile写的不怎样,编译出来的文件都分散在各个目录里了,找起来很麻烦。 make netinstall 会把这些编译出来的文件,都拷贝到 /tftpdroot里,找起来就方便多了。因为是在根目录下建立/tftpdroot目录,因此须要sudo,若有已有目录且有权限,是没必要sudo的。

 

 

说下效果吧:

  一句话,很是棒!! 

  pxelinux 的这个部分实现得很是精简,只支持一个 block size参数,不支持window机制。但即使如此,他的效率仍高过了具有window机制的bootmgr。网卡利用率最高能够到60Mbps上下,最低也有20Mbps左右。相对于原来,简直是飞通常的速度!

 

 

再多啰嗦句:

  syslinux这里的默认值真的是很诡异 ,1408??这是数字一眼就让人想起modem的MTU。 问题是这个东东大部分是局域网用的,跟MTU有个毛关系啊。

  pxelinux在他的说明里,一再强调 所设置的 TFTPD服务器必定要支持 tsize 选项,不兼容没有tsize选项的tftpd。言下之意是pxelinux是比较新的,支持比较高级功能的。

可是他所设定的1408的block size,仅仅比最初始的恐龙时代的设定------512,多了一倍多而已,根本就是聊胜于无。

  仍是赶忙改了吧。

 

 

 

 

 

 

 最后,对于实在不想本身编译的同窗,我把个人编译结果放在这儿了。

http://download.csdn.net/detail/whoo/5054668 (注:这个包的blksize设为40k,对于有些机器来讲过大了,存在兼容性问题。在将blksize调整为16k以后,经测试速度几乎没有下降,而兼容性好了不少------手头可测试的设备都经过了,但有网友反馈仍有问题。 新的下载地址是这个 http://download.csdn.net/detail/whoo/5150778

 

 

补充下就是:个人各类测试中,pxelinux.0 是没问题的的。  可是gpxelinux.0在vmware中就报错。 通过一段时间的尝试后,我已经放弃gpxe这个东东了,因此未作进一步的测试,不清楚这一问题究竟是gpxe在vmware中的兼容问题,仍是修改后的传输参数形成的。