无忧启动论坛

标题: 如何跳过begin pxe scan……原因是条件菜单 [打印本页]

作者: bfgxp    时间: 2013-12-2 16:56
标题: 如何跳过begin pxe scan……原因是条件菜单
本帖最后由 bfgxp 于 2014-8-3 18:02 编辑

最近版本的grldr启动时会有begin pxe scan……揭示在一些机子上会停留3秒左右,我不需要pxe,如何关闭啊?
今天又发现一台本本停留时间过长,于是照C大的说明进入单步模式,发现是条件菜单在查寻文件是否存在时很费时间。
这应该是本本的硬盘响应慢造成的。

也就是说即使没有这条信息,这时也会黑屏好几秒才能出菜单。

新版grldr与之前版本的区别仅仅是多了这么一条信息,在出菜单的时间上没有差别

作者: 不点    时间: 2013-12-2 17:08
不一定是 PXE 的原因。有可能是你的菜单有毛病,遇到 buggy BIOS 了。
作者: viptks    时间: 2013-12-2 17:51
不点 发表于 2013-12-2 17:08
不一定是 PXE 的原因。有可能是你的菜单有毛病,遇到 buggy BIOS 了。

不点老大,有没有命令关掉?虽然很快消失,平时不想看到
作者: bfgxp    时间: 2013-12-2 20:24
菜单上来一看
  1. color 0x06 0x67 0x06 0x09 0x8f 0x0d
  2. timeout 4
  3. default 0
  4. call Fn.0 0x40000 "!BAT\necho -P:0000 $[0000]\t\t\t\t\t\t\t\t\t\0" && initscript (md)0x200+1
  5. find --set-root --ignore-floppies --ignore-cd /boot/ntboot/ntboo
  6. command --set-path=()/boot/ntboot/
  7. font /boot/unifont.hex.gz
  8. graphicsmode -1 800:1600 600:900 24:32
  9. BGAutoChange /boot/bg/
  10. write 0x8274 0x2001
  11. terminal --font-spacing=1:5
  12. menuset 20 30 10 10 0 0
  13. debug off

  14. hotkey [R] reboot
  15. hotkey [S] halt
  16. #title --------------VHD系统启动菜单--------------
  17. #clear

  18. iftitle [find --ignore-floppies --ignore-cd /vhdos/win8x/ins.lst] 安装Win8(VHDX)\n 安装win8系统
  19. if exist (hd0,0)/boot/bcd && cat --length=0 (hd0,0)/boot/bcd ! run copybcd.img
  20. if %@retval%>=0xa000 || run copybcd.img
  21. NTBOO nt6=/vhdos/win8x/win8.vhdx
  22. boot

  23. iftitle [find --ignore-floppies --ignore-cd /vhdos/win8x/ins.lst && if 2 >= 3 ! find --ignore-floppies --ignore-cd /vhdos/win8x/CreateDifference.cmd] 启动Win8PE手动创建差分VHDX\n 进pe环境,手动执行“/vhdos/win8x/CreateDifference.cmd”,待差分vhdx生成后,重启即可正常进入win8(vhdx)系统了。
  24. run win8pe.iso
  25. boot

  26. iftitle [find --ignore-floppies --ignore-cd /vhdos/win81x64/ins.lst] 安装win81x64\n 安装win81x64系统
  27. if exist (hd0,0)/boot/bcd && cat --length=0 (hd0,0)/boot/bcd ! run copybcd.img
  28. if %@retval%>=0xa000 || run copybcd.img
  29. NTBOO nt6=/vhdos/win81x64/win81.vhd
  30. boot

  31. iftitle [find --ignore-floppies --ignore-cd /vhdos/win8/ins.lst] 安装win8\n 安装win8系统
  32. if exist (hd0,0)/boot/bcd && cat --length=0 (hd0,0)/boot/bcd ! run copybcd.img
  33. if %@retval%>=0xa000 || run copybcd.img
  34. NTBOO nt6=/vhdos/win8/win8.vhd
  35. boot

  36. iftitle [find --ignore-floppies --ignore-cd /vhdos/win7/ins.lst] 安装Win7\n 安装win7系统
  37. if exist (hd0,0)/boot/bcd && cat --length=0 (hd0,0)/boot/bcd ! run copybcd.img
  38. if %@retval%>=0xa000 || run copybcd.img
  39. NTBOO nt6=/vhdos/win7/win7.vhd
  40. boot

  41. iftitle [find --ignore-floppies --ignore-cd /vhdos/xp/ins.lst] 安装xp\n 安装xp系统
  42. NTBOOT vboot=/vhdos/xp/xp.vhd
  43. boot

  44. iftitle [find --ignore-floppies --ignore-cd /vhdos/03/ins.lst] 安装03\n 安装03系统
  45. NTBOOT vboot=/vhdos/03/03.vhd
  46. boot

  47. iftitle [find --ignore-floppies --ignore-cd /vhdos/win8x/CreateDifference.cmd && if 2 >= 3 ! find --ignore-floppies --ignore-cd /vhdos/win8x/win8_CHILD.vhdx] 启动Win8(VHDX)\n 启动win8系统
  48. NTBOO nt6=/vhdos/win8x/win8_CHILD.vhdx
  49. boot

  50. iftitle [find --ignore-floppies --ignore-cd /vhdos/win8x/CreateDifference.cmd && if 2 >= 3 ! find --ignore-floppies --ignore-cd /vhdos/win8x/win8_CHILD_BAK.vhdx] 秒速还原Win8(VHDX)\n 密码:vhdos
  51. password --md5 $1$/$Rj/i9kBHUng4xx3Blt6mP0
  52. find --set-root --ignore-floppies --ignore-cd /vhdos/win8x/win8_CHILD.vhdx
  53. dd if=()/vhdos/win8x/win8_CHILD_BAK.vhdx of=()/vhdos/win8x/win8_CHILD.vhdx
  54. NTBOO nt6=/vhdos/win8x/win8_CHILD.vhdx
  55. boot

  56. iftitle [find --ignore-floppies --ignore-cd /vhdos/win81x64/ins.lst && if 2 >= 3 ! find --ignore-floppies --ignore-cd /vhdos/win81x64/win81_CHILD.vhd] 启动win81x64\n 启动win81x64系统
  57. NTBOO nt6=/vhdos/win81x64/win81_CHILD.vhd
  58. boot

  59. iftitle [find --ignore-floppies --ignore-cd /vhdos/win81x64/ins.lst && if 2 >= 3 ! find --ignore-floppies --ignore-cd /vhdos/win81x64/win81_CHILD_BAK.vhd] 秒速还原win81x64\n 密码:vhdos
  60. password --md5 $1$/$Rj/i9kBHUng4xx3Blt6mP0
  61. find --set-root --ignore-floppies --ignore-cd /vhdos/win81x64/win81_CHILD.vhd
  62. dd if=()/vhdos/win81x64/win81_CHILD_BAK.vhd of=()/vhdos/win81x64/win81_CHILD.vhd
  63. NTBOO nt6=/vhdos/win81x64/win81_CHILD.vhd
  64. boot

  65. iftitle [find --ignore-floppies --ignore-cd /vhdos/win8/ins.lst && if 2 >= 3 ! find --ignore-floppies --ignore-cd /vhdos/win8/win8_CHILD.vhd] 启动win8\n 启动win8系统
  66. NTBOO nt6=/vhdos/win8/win8_CHILD.vhd
  67. boot

  68. iftitle [find --ignore-floppies --ignore-cd /vhdos/win8/ins.lst && if 2 >= 3 ! find --ignore-floppies --ignore-cd /vhdos/win8/win8_CHILD_BAK.vhd] 秒速还原win8\n 密码:vhdos
  69. password --md5 $1$/$Rj/i9kBHUng4xx3Blt6mP0
  70. find --set-root --ignore-floppies --ignore-cd /vhdos/win8/win8_CHILD.vhd
  71. dd if=()/vhdos/win8/win8_CHILD_BAK.vhd of=()/vhdos/win8/win8_CHILD.vhd
  72. NTBOO nt6=/vhdos/win8/win8_CHILD.vhd
  73. boot

  74. iftitle [find --ignore-floppies --ignore-cd /vhdos/win7/ins.lst && if 2 >= 3 ! find --ignore-floppies --ignore-cd /vhdos/win7/win7_CHILD.vhd] 启动Win7\n 启动Win7系统
  75. NTBOO nt6=/vhdos/win7/win7_CHILD.vhd
  76. boot

  77. iftitle [find --ignore-floppies --ignore-cd /vhdos/win7/ins.lst && if 2 >= 3 ! find --ignore-floppies --ignore-cd /vhdos/win7/win7_CHILD_BAK.vhd] 秒速还原Win7\n 密码:vhdos
  78. password --md5 $1$/$Rj/i9kBHUng4xx3Blt6mP0
  79. find --set-root --ignore-floppies --ignore-cd /vhdos/win7/win7_CHILD.vhd
  80. dd if=()/vhdos/win7/win7_CHILD_BAK.vhd of=()/vhdos/win7/win7_CHILD.vhd
  81. NTBOO nt6=/vhdos/win7/win7_CHILD.vhd
  82. boot

  83. iftitle [find --ignore-floppies --ignore-cd /vhdos/xp/ins.lst && if 2 >= 3 ! find --ignore-floppies --ignore-cd /vhdos/xp/xp_CHILD.vhd] 启动xp\n 启动xp系统
  84. NTBOOT vboot=/vhdos/xp/xp_CHILD.vhd
  85. boot

  86. iftitle [find --ignore-floppies --ignore-cd /vhdos/xp/ins.lst && if 2 >= 3 ! find --ignore-floppies --ignore-cd /vhdos/xp/xp_CHILD_BAK.vhd] 快速还原xp\n 密码:vhdos
  87. password --md5 $1$/$Rj/i9kBHUng4xx3Blt6mP0
  88. revhdxp
  89. boot

  90. iftitle [find --ignore-floppies --ignore-cd /vhdos/03/ins.lst && if 2 >= 3 ! find --ignore-floppies --ignore-cd /vhdos/03/03_CHILD.vhd] 启动03\n 启动03系统
  91. NTBOOT vboot=/vhdos/03/03_CHILD.vhd
  92. boot

  93. iftitle [find --ignore-floppies --ignore-cd /vhdos/03/ins.lst && if 2 >= 3 ! find --ignore-floppies --ignore-cd /vhdos/03/03_CHILD_BAK.vhd] 快速还原03\n 密码:vhdos
  94. password --md5 $1$/$Rj/i9kBHUng4xx3Blt6mP0
  95. revhd03
  96. boot

  97. iftitle [find --ignore-floppies --ignore-cd /vhdos/vbuntufix/vbuntufix.vhd] 启动vbuntu\n 启动vbuntu
  98. find --set-root --ignore-floppies --ignore-cd /vhdos/vbuntufix/vbuntufix.vhd
  99. uuid ()
  100. kernel /vhdos/vbuntufix/vmlinuz root=UUID=%?% vloop=/vhdos/vbuntufix/vbuntufix.vhd vlooppart=p1 quiet splash
  101. initrd /vhdos/vbuntufix/initrd.img
  102. boot

  103. iftitle [find --ignore-floppies --ignore-cd /vbuntufix/vbuntufix.vhd] 启动vbuntu\n 启动vbuntu
  104. find --set-root --ignore-floppies --ignore-cd /vbuntufix/vbuntufix.vhd
  105. uuid ()
  106. kernel /vbuntufix/vmlinuz root=UUID=%?% vloop=/vbuntufix/vbuntufix.vhd vlooppart=p1 quiet splash
  107. initrd /vbuntufix/initrd.img
  108. boot

  109. iftitle [find --ignore-floppies --ignore-cd /ntldr] 启动原xp/03\n 启动硬盘中原有的xp或03系统
  110. run /ntldr
  111. boot

  112. iftitle [find --ignore-floppies --ignore-cd /Windows/en-US/bootfix.bin] 启动原Win7/win8\n 启动硬盘中原有的Win7/win8系统
  113. ntboot nt6
  114. boot

  115. iftitle [find --ignore-floppies --ignore-cd /boot/imgs/win8pe.iso] 启动win8pe\n 启动Win8pe维护工具
  116. run win8pe.iso
  117. boot

  118. iftitle [find --ignore-floppies --ignore-cd /boot/imgs/win03pe.iso] 启动win03pe\n 启动Win03pe维护工具
  119. run win03pe.iso
  120. boot

  121. iftitle [find --ignore-floppies --ignore-cd /boot/imgs/maxdos.img] 启动maxdos\n 启动maxdos维护工具
  122. run maxdos.img
  123. boot
复制代码

作者: 不点    时间: 2013-12-3 06:07
正常情况下,pxe 的探测所花费的时间应该是 0.00000001 秒,可以认为根本不花费时间。

你的菜单确实有一句是花费时间的,那就是 font 命令加载一个比较大的 字体文件。

你试试看,注释掉 font 命令,我估计就不会有问题了。

另外,外部命令也有可能花费时间,通过试验(即,老办法,注释掉它),你可以确定外部命令是不是花费了很多时间。

找问题要找病根,不能被假象迷惑。
作者: 不点    时间: 2013-12-3 08:17
另外我想提醒一下 chenall,我记得原来是在 pxe_scan 之前显示信息,之后是立即抹掉信息。 可是后来采纳了 daven 的一个补丁,就把这 “抹掉信息” 的代码弄掉了,因此信息没有抹掉,显示出来,让用户感到不舒服。这是很细节的问题,我们做工作就应该本着 “切实为用户负责”、“精益求精” 的态度,这样才能得到用户的肯定,这样才能让工作有成效、有意义。既然工作已经做了,就应该做好。工作如果不做好,那就等于白做了,浪费了宝贵的时间和精力。我认为,在能力所及的范围内,不做则已,一旦做了,就必须做好。如果做的 “半好不好” 的,那还不如干脆放弃算了。

用户报告问题,我们是欢迎的。用户使用我们的软件,就是承认我们的工作。报告问题是对我们提出更高的要求。我们在权衡之后、在力所能及的情况下,应该响应用户的报告,尽量满足用户的合理要求。

补丁的作者 daven 可能没去仔细看,或者没留意 “回车” 和 “换行” 的不同意义,所以就删除了后面的 printf 的代码。这类错误好像还有很多,而且可能涉及好几个文件,chenall 可以再检查一下,看看别处有没有类似的错误。

回车符 “\r” 是回到同一行的行首,而换行符 “\n” 则是走到下一行。grub4dos 的内部打印驱动代码会自动在每个换行符 "\n" 之前添加一个回车符 "\r",所以,换行符 "\n" 的实际效果就是 “回车并换行”。但回车符 \r 仅仅是回车而已,不会去执行换行的操作。

嗯,我找到了,修改发生在 r347,请看附件上载的图片。

左边(修改前)是正确的,右边(经过 r347 修改后)是错误的。

注意:begin pxe scan ... 信息的尾部还有意添加了空格,这空格也不是多余的,不应该删掉。空格是想抹掉以前显示的信息,不然的话,begin pxe scan ... 的后面就可能残留着以前的信息。注意,以前可能在显示信息后用 \r 回车符直接回到行首,而信息的内容是存在的。所以,begin pxe scan ... 语句本身还起到了抹掉前面残留信息的作用。

总结一下,就是说,chenall 不仅要恢复 printf ("\r                     \r"); 还要在 begin pxe scan ... 尾部增加空格。一行的打印字符总数不超过 79 个。如果在 begin pxe scan... 的开头处添加一个回车符 \r,那就更好了。

有必要再澄清一下,启动时的信息都在同一行显示,这些信息相当于 “调试信息”。所以,不能用换行符 \n,而只能用回车符 \r。想一想,如果都用换行符,显示的信息多了之后,那就会出现很多换行符,光标最后要到达屏幕的底部,就不美观了。遇到 Fatal 严重错误时,应该用换行符 \n,以便用户能够看到它,而不至于被抹掉(或被覆盖掉)。


begin_pxe_scan.JPG (14.12 KB, 下载次数: 148)

显示 r347 的更动

显示 r347 的更动

作者: chenall    时间: 2013-12-3 08:38
因为我之前的想法是让所有调试信息都显示出来方便查错..

现在看来有些多余的,回头我抽空检查一下,让那些看起来不是很重要的信息一闪而过好了.或者加一个开关比如根据DEBUG的值来显示.
作者: bfgxp    时间: 2013-12-3 10:07
这个信息一般情况下都是一闪而过的,昨天在一台笔记本上停留了3秒左右。是别人的电脑,弄好就交给人家了。
可能是bios的bug。

不点的前半段话有点像毛 主 席的文章了
作者: 不点    时间: 2013-12-3 19:57
回复 chenall

在早期,这些信息都是显示出来的,每条信息占据一行。后来就有人提出,想要一个 “干净” 的屏幕,这才想到了这个解决办法。

这是有矛盾的:如果不显示信息,那么就不利于定位恶意 BIOS 的攻击。而如果显示一大堆信息,又不符合 “干净” 启动的要求。

折中一下,就想到了这个办法,而可以同时满足两种情况:在 BIOS 调用之前,打印信息。调用成功返回后,就立即抹掉信息。所有这些信息都是在屏幕的一行上进行显示:显示一条信息之后立即抹掉,再显示下一条信息,再抹掉,如此反复。

如果 BIOS 调用发生死机,则信息不可能被抹掉,因此用户可以看到屏幕的信息,并反馈给开发者。
如果 BIOS 调用没有死机,则信息很快就被抹掉,因此用户感觉不到屏幕上有信息显示,启动是 “干净” 的。

这种办法也使得我们可以不再发布一个单独的 “调试版”。可谓两全其美。这甚至比发布一个调试版更好。用户不愿意看到两个不同的版本。即使发生死机,普通用户也懒得去向开发者报告,更不能指望用户都去积极测试一个专门的“调试版”。但如果此时屏幕有信息,则用户有意无意地就很容易透露出来,开发者可以主动在网上搜索这些信息,于是就知道有没有问题了。这就把 “用户报告 bug” 变成了 “开发者搜索 bug 报告”,其效率当然就成倍增加了。在版本 0.4.2 之前,“死机” 问题很多。版本 0.4.3 的 “死机” 问题就减少了,而版本 0.4.4 的 “死机” 就很罕见了。现在的版本 0.4.5 干脆就没有见到死机了,用户的菜单只要正确,就不会有死机出现。很简单,google 搜索可以告诉这些情况。


作者: 不点    时间: 2013-12-3 20:24
回复 bfgxp

pxe_scan 的 BIOS 调用,基本可以认为,不可能消耗 3 秒。如果主板 BIOS 想攻击,那一定不止 3 秒,而是长达 5 分钟以上。如果 BIOS 不是想发动攻击,那它就不会消耗 3 秒。“碰巧遇到 bug” 的情况也是有的,但可能性很低。

可能性最大的,就是你的菜单里面的 font 命令,加载磁盘文件,在有些 “速度慢” 的机器上造成 3 秒的延迟。而这一点是根本不可能解决的,除非你设法减少字体文件的长度。访问磁盘是一个慢速操作。

作者: singel    时间: 2013-12-4 09:47
打个标记,收藏此贴
作者: xiaoy    时间: 2013-12-5 19:04
我也整了个菜单在一些慢点的电脑上经常显示这句,大概有一秒,速度快的电脑就没有看到 哈哈 还是希望关掉回显
作者: bfgxp    时间: 2013-12-9 10:21
不点 发表于 2013-12-3 20:24
回复 bfgxp

pxe_scan 的 BIOS 调用,基本可以认为,不可能消耗 3 秒。如果主板 BIOS 想攻击,那一定不止 ...

今天又把那个笔记本弄来了,注释掉了加载字体那一条,并且更新g4d到11.30的0.45C版,依然还是停留3秒左右。
作者: 不点    时间: 2013-12-9 10:33
除了 font 以外,条件 title 命令里面的 find ... 也要访问磁盘分区,可能正是它们造成了问题。

请用干净的默认菜单来测试,这才有说服力。否则什么也说不清。


作者: chenall    时间: 2013-12-9 16:34
启动GRLDR之后迅速按Insert键,进入单步调试模式,就可以很清楚的知道具体是哪个命令的原因了.

作者: ie    时间: 2014-6-26 23:24
这个菜单怎么打开的呀,找不到




欢迎光临 无忧启动论坛 (http://wuyou.net/) Powered by Discuz! X3.3