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

    作为一名IT人士,一般的计算机维护当然不好意思找别人。 于是自己用pxelinux搭了个网络启动环境,可以启动各种WinPE,以供折腾电脑系统,刷新固件的需要。

 

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

 

   于是就这么凑错了几年。。。

 

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

 

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

 

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

   赶紧把这俩参数仔仔细细的查清楚了,立刻加到bootmgr的bcd里面。

   启动一试, 效果非常显著!!

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

 

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

 

安装程序 Ramdisk 选项
---------------------
标识符                  {ramdiskoptions}
ramdisksdidevice        boot
ramdisksdipath          \BOOT\BOOT.SDI
ramdisktftpblocksize    40960
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中的兼容问题,还是修改后的传输参数造成的。

 

 

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(乱弹,bootmgr,PXE,pxelinux,TFTP,网络启动)