无忧启动论坛

 找回密码
 注册
搜索
系统gho:最纯净好用系统下载站广告联系 微信:wuyouceo QQ:184822951
查看: 4135|回复: 17
打印 上一主题 下一主题

[已解决]请教PXE环境加载压缩镜象文件的效率问题

[复制链接]
跳转到指定楼层
1#
发表于 2010-6-30 07:17:21 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
以 PXE 启动 WinPE 为 例:

一、服务器上的PE镜象文件有以下三种形式
winpe.img    46M    NTFS压缩
winpe.img    62M    FAT32
winpe.gz      32M    FAT32 + GZip压缩

二、GRUB 启动菜单
  1. #title 0. 启动 Windows PE
  2. #pxe keep
  3. #chainloader --force (pd)/startrom.0

  4. title 1. 启动 Windows PE (NTFS压缩)
  5. map --mem --unsafe-boot (pd)/ntfs/WinPE.img (hd0)
  6. map --hook
  7. chainloader (hd0,0)/wxpe/setupldr.bin

  8. title 2. 启动 Windows PE (FAT32)
  9. map --mem --unsafe-boot (pd)/fat32/WinPE.img (hd0)
  10. map --hook
  11. chainloader (hd0,0)/wxpe/setupldr.bin

  12. title 3. 启动 Windows PE (FAT32 + GZip)
  13. map --mem --unsafe-boot (pd)/WinPE.gz (hd0)
  14. map --hook
  15. chainloader (hd0,0)/wxpe/setupldr.bin
复制代码
三、通过客户机PXE启动发现:
1、加载46M的NTFS压缩格式的PE,启动速度最快
2、加载62M的FAT32格式PE,启动速度次之
3、加载32M GZIP压缩的PE,完毕后继续会加载62M数据,启动速度最慢?

一般来说,加载文件的大小对速度成反比,但为什么加载32M经过GZIP的PE,会比加载没有压缩的62M PE慢呢?

pseudo 提示,grub4dos对GZIP压缩文件要传输两次,并给出了解决的的办法,详细请看 分享:pxe启动映像文件压缩传输。新版本的GRUB,增加了 no_decompression 内部控制变量,可以关闭自动解压后直接传输。zhaohj 在本帖写出了实现的方法。

四、修改Grub启动菜单第三项如下,终于启动速度达到了最快。
  1. title 3. 启动 Windows PE (FAT32 + GZip)
  2. write 0x82a4 1
  3. map --mem=0x8000 (pd)/WinPE.gz (rd)
  4. write 0x82a4 0
  5. map (rd)+1 (hd0)
  6. map --hook
  7. chainloader (hd0,0)/wxpe/setupldr.bin
复制代码

[ 本帖最后由 lee88889999 于 2010-7-1 09:34 编辑 ]
2#
发表于 2010-6-30 09:37:52 | 只看该作者
加载映像文件都是需要时间的,当然是文件小速度就快,无论是从本地还是从pxe服务端加载都一样

如果从本地硬盘map /xxxx.xxx (hd0)的话速度比map --mem快许多,我有一个1.7g的vhd,如果是从pxe服务端通过网络加载的话,map和map --mem的时间是一样的
回复

使用道具 举报

3#
发表于 2010-6-30 09:46:38 | 只看该作者
如果不特别处理,GZip压缩的文件,grub4dos要传输两次,你可以看tftpd32的日志。
早期的解决方法例如 分享:pxe启动映像文件压缩传输
现在grub4dos功能增强,处理起来更简单了。
回复

使用道具 举报

4#
 楼主| 发表于 2010-6-30 09:47:21 | 只看该作者

回复 #2 yueyezhan 的帖子

可能我把意思说明得不够明白,我的疑惑是,为什么加载GZIP压缩的文件(32M),要读取两次,导致比直接加载没有压缩过的文件(62M),还要慢?
回复

使用道具 举报

5#
 楼主| 发表于 2010-6-30 10:13:20 | 只看该作者
原帖由 pseudo 于 2010-6-30 09:46 发表
如果不特别处理,GZip压缩的文件,grub4dos要传输两次,你可以看tftpd32的日志。
早期的解决方法例如 分享:pxe启动映像文件压缩传输
现在grub4dos功能增强,处理起来更简单了。

你的帖子看过了,非常感谢。
可否举例说明一下现在新的方法。
回复

使用道具 举报

6#
发表于 2010-6-30 10:23:52 | 只看该作者
原帖由 lee88889999 于 2010-6-30 10:13 发表

你的帖子看过了,非常感谢。
可否举例说明一下现在新的方法。

那个帖子里已经提到一个新的解决方法。
回复

使用道具 举报

7#
 楼主| 发表于 2010-6-30 16:01:06 | 只看该作者

回复 #6 pseudo 的帖子

对GRUB研究得很少,一时也翻不到相关的资料,不知道no_decompression这个内部变量该怎么设。
no_decompression =1
或 set no_decompression = 1
是否MAP之前执行就行了,或是MAP的参数?
总之一塌糊涂,先用老的办法吧。
回复

使用道具 举报

8#
发表于 2010-6-30 16:20:04 | 只看该作者
0x82a4值为0时启用压缩
0x82a4值为1时禁用压缩
如:
write 0x82a4 1
map --mem=0xb000 /SRS_F6/SRS_F6.IMG (rd)    ;注,此IMG是GZ压缩的
write 0x82a4 0
map (rd)+1 (hd0)
map --hook

这对于大文件还是很有用的。

[ 本帖最后由 zhaohj 于 2010-7-7 10:50 编辑 ]
回复

使用道具 举报

9#
发表于 2010-6-30 17:40:08 | 只看该作者
原帖由 pseudo 于 2010-6-30 09:46 发表
如果不特别处理,GZip压缩的文件,grub4dos要传输两次,你可以看tftpd32的日志。
早期的解决方法例如 分享:pxe启动映像文件压缩传输
现在grub4dos功能增强,处理起来更简单了。



一直在用HANEWIND+GRLDR,没发现GZ文件要传两次的情形,三五十M的东西要是传两次的话感觉肯定很明显的。刚试用过TFTPD32,也没发现GZ要传两次。

TFTPD32的日志:

Rcvd DHCP 发现 Msg 为 IP 0.0.0.0, Mac 00:19:21:C9:7E:17 [30/06 17:36:54.687]
DHCP: 建议的地址 192.168.3.201 [30/06 17:36:54.703]
Rcvd DHCP Rqst Msg 为 IP 0.0.0.0, Mac 00:19:21:C9:7E:17 [30/06 17:36:56.718]
应答先前分配的地址 [30/06 17:36:56.718]
Read 请求,为文件 <GRLDR>,模式 octet [30/06 17:36:56.734]
OACK: <tsize=234852,> [30/06 17:36:56.734]
正在使用本地端口 1646 [30/06 17:36:56.750]
对等返回错误 <TFTP Aborted> -> 正在中止传输 [30/06 17:36:56.781]
Read 请求,为文件 <GRLDR>,模式 octet [30/06 17:36:56.781]
正在使用本地端口 1647 [30/06 17:36:56.796]
<GRLDR>: 发送 459 blks, 234852 bytes in 0 s. 0 blk resent [30/06 17:36:56.953]
Read 请求,为文件 </GRLDR>,模式 octet [30/06 17:36:57.750]
OACK: <tsize=234852,> [30/06 17:36:57.796]
正在使用本地端口 1648 [30/06 17:36:57.843]
对等返回错误 <TFTP Aborted> -> 正在中止传输 [30/06 17:36:57.921]
Read 请求,为文件 </GRLDR>,模式 octet [30/06 17:36:57.968]
正在使用本地端口 1649 [30/06 17:36:58.015]
Read 请求,为文件 </grub/menu_lock.lst>,模式 octet [30/06 17:36:58.093]
OACK: <tsize=2176,> [30/06 17:36:58.109]
正在使用本地端口 1650 [30/06 17:36:58.140]
对等返回错误 <TFTP Aborted> -> 正在中止传输 [30/06 17:36:58.187]
Read 请求,为文件 </grub/menu_lock.lst>,模式 octet [30/06 17:36:58.203]
正在使用本地端口 1651 [30/06 17:36:58.234]
Read 请求,为文件 </grub/menu_lock.lst>,模式 octet [30/06 17:36:58.296]
OACK: <tsize=2176,> [30/06 17:36:58.328]
正在使用本地端口 1652 [30/06 17:36:58.343]
对等返回错误 <TFTP Aborted> -> 正在中止传输 [30/06 17:36:58.406]
Read 请求,为文件 </grub/menu_lock.lst>,模式 octet [30/06 17:36:58.421]
正在使用本地端口 1653 [30/06 17:36:58.453]
<grub\menu_lock.lst>: 发送 5 blks, 2176 bytes in 0 s. 0 blk resent [30/06 17:36:58.515]
Read 请求,为文件 </grub/BackGrnd.gz>,模式 octet [30/06 17:36:58.531]
OACK: <tsize=77538,> [30/06 17:36:58.562]
正在使用本地端口 1654 [30/06 17:36:58.593]
对等返回错误 <TFTP Aborted> -> 正在中止传输 [30/06 17:36:58.640]
Read 请求,为文件 </grub/BackGrnd.gz>,模式 octet [30/06 17:36:58.656]
正在使用本地端口 1655 [30/06 17:36:58.703]
<grub\BackGrnd.gz>: 发送 152 blks, 77538 bytes in 0 s. 0 blk resent [30/06 17:36:58.796]
Read 请求,为文件 </grub/BackGrnd.gz>,模式 octet [30/06 17:36:58.906]
OACK: <tsize=77538,> [30/06 17:36:58.937]
正在使用本地端口 1656 [30/06 17:36:58.968]
对等返回错误 <TFTP Aborted> -> 正在中止传输 [30/06 17:36:59.015]
Read 请求,为文件 </grub/BackGrnd.gz>,模式 octet [30/06 17:36:59.046]
正在使用本地端口 1657 [30/06 17:36:59.078]
<grub\BackGrnd.gz>: 发送 152 blks, 77538 bytes in 0 s. 0 blk resent [30/06 17:36:59.171]
Read 请求,为文件 </grub/BackGrnd.gz>,模式 octet [30/06 17:36:59.203]
正在使用本地端口 1658 [30/06 17:36:59.234]
<grub\BackGrnd.gz>: 发送 152 blks, 77538 bytes in 0 s. 0 blk resent [30/06 17:36:59.359]
Read 请求,为文件 </grub/FONTS.gz>,模式 octet [30/06 17:36:59.375]
OACK: <tsize=146993,> [30/06 17:36:59.390]
正在使用本地端口 1659 [30/06 17:36:59.406]
对等返回错误 <TFTP Aborted> -> 正在中止传输 [30/06 17:36:59.453]
Read 请求,为文件 </grub/FONTS.gz>,模式 octet [30/06 17:36:59.468]
正在使用本地端口 1660 [30/06 17:36:59.500]
<grub\FONTS.gz>: 发送 288 blks, 146993 bytes in 0 s. 0 blk resent [30/06 17:36:59.625]
Read 请求,为文件 </grub/FONTS.gz>,模式 octet [30/06 17:36:59.859]
OACK: <tsize=146993,> [30/06 17:36:59.875]
正在使用本地端口 1661 [30/06 17:36:59.906]
对等返回错误 <TFTP Aborted> -> 正在中止传输 [30/06 17:36:59.937]
Read 请求,为文件 </grub/FONTS.gz>,模式 octet [30/06 17:36:59.968]
正在使用本地端口 1662 [30/06 17:36:59.984]
<grub\FONTS.gz>: 发送 288 blks, 146993 bytes in 1 s. 0 blk resent [30/06 17:37:00.109]
Read 请求,为文件 </grub/FONTS.gz>,模式 octet [30/06 17:37:00.140]
正在使用本地端口 1663 [30/06 17:37:00.156]
<grub\FONTS.gz>: 发送 288 blks, 146993 bytes in 0 s. 0 blk resent [30/06 17:37:00.281]
Read 请求,为文件 </grub/BackGrnd.gz>,模式 octet [30/06 17:37:00.312]
OACK: <tsize=77538,> [30/06 17:37:00.328]
正在使用本地端口 1664 [30/06 17:37:00.343]
对等返回错误 <TFTP Aborted> -> 正在中止传输 [30/06 17:37:00.390]
Read 请求,为文件 </grub/BackGrnd.gz>,模式 octet [30/06 17:37:00.406]
正在使用本地端口 1665 [30/06 17:37:00.437]
<grub\BackGrnd.gz>: 发送 152 blks, 77538 bytes in 0 s. 0 blk resent [30/06 17:37:00.515]
Read 请求,为文件 </grub/BackGrnd.gz>,模式 octet [30/06 17:37:00.546]
正在使用本地端口 1666 [30/06 17:37:00.562]
<grub\BackGrnd.gz>: 发送 152 blks, 77538 bytes in 0 s. 0 blk resent [30/06 17:37:00.687]
Read 请求,为文件 </grub/BackGrnd.gz>,模式 octet [30/06 17:37:00.703]
OACK: <tsize=77538,> [30/06 17:37:00.718]
正在使用本地端口 1667 [30/06 17:37:00.750]
对等返回错误 <TFTP Aborted> -> 正在中止传输 [30/06 17:37:00.796]
Read 请求,为文件 </grub/BackGrnd.gz>,模式 octet [30/06 17:37:00.812]
正在使用本地端口 1668 [30/06 17:37:00.843]
<grub\BackGrnd.gz>: 发送 152 blks, 77538 bytes in 0 s. 0 blk resent [30/06 17:37:00.921]
Read 请求,为文件 </grub/BackGrnd.gz>,模式 octet [30/06 17:37:00.953]
正在使用本地端口 1669 [30/06 17:37:00.968]
<grub\BackGrnd.gz>: 发送 152 blks, 77538 bytes in 1 s. 0 blk resent [30/06 17:37:01.093]
Read 请求,为文件 </grub/HongSonEx.IMG>,模式 octet [30/06 17:37:05.078]
OACK: <tsize=9437184,> [30/06 17:37:05.109]
正在使用本地端口 1670 [30/06 17:37:05.140]
对等返回错误 <TFTP Aborted> -> 正在中止传输 [30/06 17:37:05.203]
Read 请求,为文件 </grub/HongSonEx.IMG>,模式 octet [30/06 17:37:05.218]
正在使用本地端口 1671 [30/06 17:37:05.250]
Read 请求,为文件 </grub/IMAGES/~03PE.gz>,模式 octet [30/06 17:37:10.734]
OACK: <tsize=35150829,> [30/06 17:37:10.765]
正在使用本地端口 1672 [30/06 17:37:10.796]
对等返回错误 <TFTP Aborted> -> 正在中止传输 [30/06 17:37:10.859]
Read 请求,为文件 </grub/IMAGES/~03PE.gz>,模式 octet [30/06 17:37:10.890]
正在使用本地端口 1673 [30/06 17:37:10.921]
<grub\HongSonEx.IMG>: 发送 18432 blks, 9437184 bytes in 6 s. 0 blk resent [30/06 17:37:11.734]
等待应答块 #2 超时 [30/06 17:37:13.093]
等待应答块 #2 超时 [30/06 17:37:13.296]
<grub\IMAGES\~03PE.gz>: 发送 68654 blks, 35150829 bytes in 21 s. 0 blk resent [30/06 17:37:31.140]
Read 请求,为文件 </grub/IMAGES/~03PE.gz>,模式 octet [30/06 17:37:31.171]
正在使用本地端口 1674 [30/06 17:37:31.203]
<grub\IMAGES\~03PE.gz>: 发送 68654 blks, 35150829 bytes in 21 s. 1 blk resent [30/06 17:37:52.687]
回复

使用道具 举报

10#
发表于 2010-6-30 20:27:25 | 只看该作者
注意到其中有“发送”字样的行:
  1. <GRLDR>: 发送 459 blks, 234852 bytes in 0 s. 0 blk resent [30/06 17:36:56.953]
  2. <grub\menu_lock.lst>: 发送 5 blks, 2176 bytes in 0 s. 0 blk resent [30/06 17:36:58.515]
  3. <grub\BackGrnd.gz>: 发送 152 blks, 77538 bytes in 0 s. 0 blk resent [30/06 17:36:58.796]
  4. <grub\BackGrnd.gz>: 发送 152 blks, 77538 bytes in 0 s. 0 blk resent [30/06 17:36:59.171]
  5. <grub\BackGrnd.gz>: 发送 152 blks, 77538 bytes in 0 s. 0 blk resent [30/06 17:36:59.359]
  6. <grub\FONTS.gz>: 发送 288 blks, 146993 bytes in 0 s. 0 blk resent [30/06 17:36:59.625]
  7. <grub\FONTS.gz>: 发送 288 blks, 146993 bytes in 1 s. 0 blk resent [30/06 17:37:00.109]
  8. <grub\FONTS.gz>: 发送 288 blks, 146993 bytes in 0 s. 0 blk resent [30/06 17:37:00.281]
  9. <grub\BackGrnd.gz>: 发送 152 blks, 77538 bytes in 0 s. 0 blk resent [30/06 17:37:00.515]
  10. <grub\BackGrnd.gz>: 发送 152 blks, 77538 bytes in 0 s. 0 blk resent [30/06 17:37:00.687]
  11. <grub\BackGrnd.gz>: 发送 152 blks, 77538 bytes in 0 s. 0 blk resent [30/06 17:37:00.921]
  12. <grub\BackGrnd.gz>: 发送 152 blks, 77538 bytes in 1 s. 0 blk resent [30/06 17:37:01.093]
  13. <grub\HongSonEx.IMG>: 发送 18432 blks, 9437184 bytes in 6 s. 0 blk resent [30/06 17:37:11.734]
  14. <grub\IMAGES\~03PE.gz>: 发送 68654 blks, 35150829 bytes in 21 s. 0 blk resent [30/06 17:37:31.140]
  15. <grub\IMAGES\~03PE.gz>: 发送 68654 blks, 35150829 bytes in 21 s. 1 blk resent [30/06 17:37:52.687]
复制代码

GRLDR、menu_lock.lst、HongSonEx.IMG均只发送一次
BackGrnd.gz、FONTS.gz、BackGrnd.gz、~03PE.gz均发送多次

其中~03PE.gz至少多花21秒。

呵呵,我也不大懂。
回复

使用道具 举报

11#
发表于 2010-6-30 21:24:44 | 只看该作者
grldr                     229k  (20090620版本)
menu_lock.lst        3K
HongSonEx.IMG     9216K
~03PE.gz              34327K
回复

使用道具 举报

12#
发表于 2010-6-30 22:23:28 | 只看该作者
原帖由 zhaohj 于 2010-6-30 16:20 发表
0x82a4值为0时启用压缩
0x82a4值为1时禁用压缩
如:
write 0x82a4 1
map --mem /SRS_F6/SRS_F6.IMG (rd)    ;注,此IMG是GZ压缩的
write 0x82a4 0
map (rd)+1 (hd0)
map --hook

 这对于大文件还是很有 ...

我map --mem一个压缩的iso,到map (rd)+1 (hd0)这句就出错了
回复

使用道具 举报

13#
 楼主| 发表于 2010-7-1 03:18:46 | 只看该作者

回复 #8 zhaohj 的帖子

非常感谢 zhaohj 的指导, 原来Grub是这样设置内部变量的。
回复

使用道具 举报

14#
发表于 2010-7-1 08:20:45 | 只看该作者
原帖由 yueyezhan 于 2010-6-30 22:23 发表

我map --mem一个压缩的iso,到map (rd)+1 (hd0)这句就出错了


如果一个虚拟驱动器被指定为一个大于或等于0xA0 的驱动器号(即(hd32)),那么它将被视为是一个光盘。(即,是 2048 字节
的大扇区)。

ISO是光盘格式,改成map (rd)+1 (hd32) 或 map (rd)+1 (0xff)
回复

使用道具 举报

15#
发表于 2010-7-1 11:59:19 | 只看该作者
奇怪,论坛好像回档了,是我帖子里笔误,是在map (rd)+1 (0xff)这句出错了,按照昨天lee88889999回复我的这种写法没有出错
map --mem (pd)/nt5_iso/FIRADISK.IMA (fd0)
write 0x82a4 1
map --mem=0x8000 (pd)/nt5_iso/xpl.iso.gz (rd) && write (rd)+1 \x1F
write 0x82a4 0
map (rd)+1 (0xff)
map --hook
chainloader (0xff)
回复

使用道具 举报

16#
发表于 2010-7-7 10:59:58 | 只看该作者
后面不用&& write (rd)+1 \x1F

map --mem /NT5_ISO/FIRADISK.IMA (fd0)
write 0x82a4 1
map --mem=0xB000 /NT5_ISO/XPL.ISO.GZ (rd)
write 0x82a4 0
map (rd)+1 (0xff)
map --hook
chainloader (0xff)
回复

使用道具 举报

17#
发表于 2010-7-7 15:40:56 | 只看该作者
这个………… 先收藏起来……相信后面会有用的…………^_^
回复

使用道具 举报

18#
发表于 2010-7-7 19:42:31 | 只看该作者
原帖由 zhaohj 于 2010-7-7 10:59 发表
后面不用&& write (rd)+1 \x1F

map --mem /NT5_ISO/FIRADISK.IMA (fd0)
write 0x82a4 1
map --mem=0xB000 /NT5_ISO/XPL.ISO.GZ (rd)
write 0x82a4 0
map (rd)+1 (0xff)
map --hook
chainloader (0xff)



谢谢。这个菜单没问题了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|捐助支持|无忧启动 ( 闽ICP备05002490号-1 )

闽公网安备 35020302032614号

GMT+8, 2024-5-2 02:17

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表