优化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中的兼容问题,还是修改后的传输参数造成的。
---------------------
作者:whoo
来源:CSDN
原文:https://blog.csdn.net/whoo/article/details/8571550
版权声明:本文为博主原创文章,转载请附上博文链接!

原文地址:https://www.cnblogs.com/studio313/p/9857342.html

时间: 2024-11-13 09:27:51

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

Dubbo_异常_Service启动时默认将方法注册到内网IP

一.背景 一般Dubbo服务都是通过内网调用,Dubbo服务启动时默认会将服务注册到内网IP,消费端就无法从外网访问. 二.解决过程 1.Linux的hosts中设置外网IP a) 通过hostname命令得到机器名 b) 通过vim /etc/hosts设置机器名对应的外网IP 127.0.0.1  localhost  localhost.localdomain 外网IP VM_31_182_centos (这里VM_31_182_centos为主机名,默认在第一行,需要移到第二行外网IP后

APP启动时白屏优化及multidex优化

参考 https://juejin.im/post/5d95f4a4f265da5b8f10714b https://blog.csdn.net/suyimin2010/article/details/80635579 https://www.cnblogs.com/whycxb/p/9312914.html 问题说明 当打开一个Activity时,如果这个Activity所属Application还没有在运行,系统会为这个Activity的创建一个进程(每开启一个进程都会有一个Applicat

iLO4外网访问时不能启动控制台

iLO4外网访问时仅仅打开443接口是不够的,还需要开启80端口才能运行控制台(Remote Console). 为了安全起见,先把 80,443,17990 端口修改为其它端口(Administration -> Access Settings),再通过路由器映射出去就能可以.

pxe网络启动安装

一:自动化的完成部署 (1)workstation机器配置: Workstation 网络适配器:nat模式 配置网络:自动获取 192.168.96.0/24 192.168.96.2 Dns:8.8.8.8 8.8.4.4 配置完成之后 l 虚拟网络编辑器,使用dhcp服务(去掉勾好) l hostname---------workstation.example.com l 关闭网络防火墙firewalld----不自启 l 关闭上下文selinux---disabled l mkdir  

PXE+Kickstart+Apach+DHCP+TFTP实现无人值守安装,centos6.5

目标:实现无人值守安装 环境:centos6.5 组件:默认PXE,Kickstart.Apache.TFTP.DHCP PXE:PXE(Pre-boot Execution Environment,预启动执行环境) 是一种引导方式,网卡中必须要有 PXE Client,PXE 协议可以使计算机通过网络启动.此协议分为 Client端和 Server 端,而PXE Client则在网卡的 ROM 中,当计算机引导时,BIOS 把 PXE Client 调入内存中执行,然后由 PXE Client

STM32物联网之TFTP文件传输

感言:专注物联网应用开发,分享物联网技术经验. 软件平台:IAR6.5 TCP/IP协议栈:LWIP1.4.1 硬件平台:STM32F103C8T6有线通信板(点击这里可以购买) 1.TCP/IP协议栈LWIP 1.1.LWIP认识 LWIP是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈,是Light Weight (轻型)IP协议,有无操作系统的支持都可以运行.LWIP提供三种API,分别是RAW API.LWIP API .BSD API.其

【Android端 APP 启动时长获取】启动时长获取方案及具体实施

一.什么是启动时长? 1.启动时长一般包括三种场景,分别是:新装包的首次启动时长,冷启动时长.热启动时长 冷启动 和 热启动 : (1)冷启动:当启动应用时,后台没有该程序的进程,此时启动的话系统会分配一个新的进程给应用. (2)热启动:程序的进程依然存在,启动时通过已有进程启动进入到Activity显示页面的,就是热启动,或者从Android官网来看我们获取到的其实是温启动时长,就是Activity不存在的情况. (3)新装包的启动时长: 新装包的启动时长,预估是最长的,并且在5.0以下及5.

Linux centos PXE无人值守安装 DHCP+TFTP+HTTPD+Kickstart

网络模式: NAT模式(共享主机的IP地址) DHCP / TFTP IP:192.168.220.137 HTTP / FTP / NFS IP:192.168.220.137 环境搭建: yum install -y tftp-server dhcp system-config-kickstart httpd xinetd syslinux 1.挂载ISO文件,复制光盘全部内容至http 的根目录/var/www/html/ 下 mkdir /mnt/cdrom mount /dev/cdr

tomcat启动时JVM内存大小,以免出现内存溢出

问题: 主要是2个内存溢出的错误. 首先是:java.lang.OutOfMemoryError: Java heap space 其次是:java.lang.OutOfMemoryError: PermGen space 最终解决办法[我是4G内存,请适当修改大小]: [Windows]在catalina.bat的第一行增加: set JAVA_OPTS=-Xms512m -Xmx900m -XX:PermSize=128M -XX:MaxNewSize=256m -XX:MaxPermSiz