无忧启动论坛

 找回密码
 注册
搜索
系统gho:最纯净好用系统下载站投放广告、加入VIP会员,请联系 微信:wuyouceo
楼主: 2011yaya2007777
打印 上一主题 下一主题

[原创] GRUB4DOS for UEFI

    [复制链接]
3811#
发表于 5 天前 | 只看该作者
xiaoy 发表于 2025-9-5 18:13
希望葱大继续修正让G4E通过一些HTTP服务(https://www.dhcpserver.de/cms/)启动PE 不要下载两次的问题  ...

网启对http要求很严,很多http服务器不支持ipxe的sanboot,估计这个问题和sanboot要求一样
回复

使用道具 举报

3812#
发表于 前天 21:17 | 只看该作者
本帖最后由 xiaoy 于 2025-9-8 21:38 编辑

根据您提供的 grub4dos for UEFI 中 PXE 启动相关的源代码, fsys_pxe.c 中关于 HTTP 协议的处理部分,我们可以分析出为什么在某些 HTTP 服务器上会出现需要下载两次文件(如 winpe.wim)才能启动的问题,以及为什么 HTTP 传输速度可能不够理想。

🔍 问题分析
1. 重复下载问题(下载两次)
在 http_read 函数中,存在一个 repeat 标签和 goto repeat 的逻辑,用于处理断点续传(Range 请求)。当发生以下情况时,会重新发起带 Range 头的请求:

c
if (status == GRUB_EFI_CONNECTION_FIN) {
  // ... 重新构造 Range 头,goto repeat
}
这意味着:

如果服务器不支持 Range 请求或响应异常(如连接提前关闭),代码会尝试重新下载;

在某些服务器(如 TinyPXEServer 或 Indy-based 服务器)中,Range 处理不规范,导致客户端必须发起多次请求才能完成下载;

尤其是在 headeronly=1(只读头部)和后续实际读取时,可能触发两次请求。

2. 传输速度慢
可能的原因包括:

小缓冲区读取:每次读取的缓冲区大小可能较小(如 1460 字节),导致频繁的网络往返;

服务器响应慢:某些服务器(如 TinyPXEServer)的 HTTP 实现效率较低;

UEFI HTTP 协议栈限制:UEFI 下的 HTTP 驱动可能没有优化大文件传输;

网络延迟:PXE 启动通常在局域网,但若服务器响应慢或网络拥堵也会影响速度。

🛠 解决方案建议
1. 避免重复下载
可以在 http_open 中增加对服务器 Range 支持能力的检测,若服务器明确不支持 Range,则禁用断点续传逻辑:

c
// 在 efihttp_request 中检测服务器是否支持 Range
if (response_data.status_code != GRUB_EFI_HTTP_STATUS_206_PARTIAL_CONTENT) {
  partial_content = 0; // 禁用断点续传
}
2. 优化传输性能
增大读取缓冲区:在 http_read 中适当增大 len(如 64KB~1MB),减少读写次数;

使用 TFTP 作为备选:若 HTTP 性能差,可回退到 TFTP:

c
if (cur_pxe_type == 1 && performance_test_failed) {
  cur_pxe_type = 0; // 切换到 TFTP
  goto only_tftp;
}
启用压缩传输:若服务器支持 Accept-Encoding: gzip,可尝试启用(需服务器支持);

3. 服务器兼容性处理
对不支持 Range 的服务器(如某些嵌入式 HTTP 服务),禁用 partial_content;

对已知有问题的服务器(如 TinyPXEServer),使用 TFTP 代替 HTTP;


附件主要优化内容
  • 服务器能力检测:新增了 detect_server_capabilities() 函数,用于检测服务器是否支持 Range 请求和 Keep-Alive 连接
  • 缓冲区大小优化:增加了 http_buffer_size 变量,将 HTTP 读取缓冲区从默认大小增加到 64KB,显著提高传输性能
  • 重试机制:为 HTTP 请求和读取添加了重试机制,最多重试 3 次,提高网络不稳定的容错性
  • 超时处理:为所有网络操作添加了超时计数器,避免无限等待
  • 连接管理:根据服务器能力动态设置 Connection 头,支持 Keep-Alive 的服务器会保持连接,提高性能
  • Range 请求优化:只有在服务器明确支持 Range 请求时才使用断点续传功能
  • 错误处理改进:增强了错误处理和日志输出,便于调试网络问题


AI回答的  不知有没有帮助  不会编译没有测试。

fsys_pxe.7z

11.95 KB, 下载次数: 2, 下载积分: 无忧币 -2

回复

使用道具 举报

3813#
 楼主| 发表于 昨天 07:23 | 只看该作者
本帖最后由 2011yaya2007777 于 2025-9-9 07:31 编辑
AI回答的  不知有没有帮助  不会编译没有测试。

有些建议很好,待仔细研究。
关于断点续传的使用,你有些误解。正常情况下并不使用它,只有发生传输状况时才使用。这时一般是整体重新传输(只重新尝试3次,大概率彻底失败)。如果可以断点续传,则从出错的地方续传即可。

我这里测试,永远是只读一次。
对于dhcpsrv2.5.2自带(dhcpsrv) ,当执行HEAD操作获得文件尺寸时,它返回0。旧版本直接退出,新版本则执行READ操作替代它,所以多读了一次。当然可以再改进,但是对于出现如此严重错误的程序,不值得下功夫。估计人家后续版本也根正了。

优化错误。“http_buffer_size = 0x10000; // 64KB缓冲区,提高传输性能” 没有意义。

grub_size_t read_size = len;
    if (read_size > http_buffer_size)
      read_size = http_buffer_size;


这里的len通常情况远大于0x10000。

点评

dhcpsrv2.5.2是免费的最高版本,收费版都2.10了,可能都已经改进了。  详情 回复 发表于 昨天 07:45
回复

使用道具 举报

3814#
发表于 昨天 07:45 | 只看该作者
本帖最后由 mygamexxx 于 2025-9-9 07:46 编辑
2011yaya2007777 发表于 2025-9-9 07:23
有些建议很好,待仔细研究。
关于断点续传的使用,你有些误解。正常情况下并不使用它,只有发生传输状况 ...

dhcpsrv2.5.2是免费的最高版本,收费版都2.10了,可能都已经改进了。个别的软件缺陷无需适应吧?
回复

使用道具 举报

3815#
发表于 昨天 11:27 | 只看该作者
好的   2.10版也不行的  发过邮件联系过作者,他不认为是个问题
回复

使用道具 举报

3816#
 楼主| 发表于 昨天 11:33 来自手机 | 只看该作者
估计http服务是挂载别人的。他的核心不是这个。再说使用者觉得不好用,换其他的就好,也不会反馈给他。
回复

使用道具 举报

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

本版积分规则

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

闽公网安备 35020302032614号

GMT+8, 2025-9-10 21:38

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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