无忧启动论坛

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

[发布] UEFI下利用ixpe远程加载isoboot直接启动PE光盘镜像

    [复制链接]
61#
发表于 2019-9-12 16:47:50 | 只看该作者
本帖最后由 lhb9900 于 2019-9-12 17:28 编辑

当没有imgboot.cfg文件    grub2   imgboot   不能启动ISO   isoboot 能启动ISO


解决方法

set imgboot_file=my.iso

          if [ 'efi' == $grub_platform -a "$grub_cpu" == "x86_64" ]; then
           menuentry "用imgboot64.efi直接启动${imgboot_file}"  --hotkey="${i}" --class iso{
                                   echo (正在后台加载文件,请等待。。)
          chainloader ($root)/Boot/grub/imgboot.efi -dev auto -file ${imgboot_file}
    }
    fi
   
    if [ 'efi' == $grub_platform -a "$grub_cpu" == "i386" ]; then
               menuentry "用imgboot32.efi直接启动${imgboot_file}"  --hotkey="${i}" --class iso{
                                   echo (正在后台加载文件,请等待。。)
          chainloader ($root)/Boot/grub/imgboot32.efi -dev auto -file ${imgboot_file}
    }
   fi
回复

使用道具 举报

62#
发表于 2019-9-12 18:09:32 | 只看该作者
本帖最后由 lhb9900 于 2019-9-12 18:13 编辑

我通过GRUB2列出别的分区的ISO
请问GRUB2带驱动号(hd0,msdos3)/my.iso的路径如何转换给imgboot.efi
比如列的文件作为变量

chainloader ($root)/Boot/grub/imgboot.efi -dev auto -file ${imgboot_file}
回复

使用道具 举报

63#
发表于 2019-9-12 18:14:15 | 只看该作者
CentOS尚不支持
回复

使用道具 举报

64#
 楼主| 发表于 2019-9-12 22:53:15 来自手机 | 只看该作者
linux光盘镜像用grub2直接可以启动,这个小工具主要是帮助启动pe光盘镜像。确实不支持grub2的分区号。感谢反馈。
回复

使用道具 举报

65#
发表于 2019-9-27 17:26:40 | 只看该作者
1.微软官网说明win10不求uefi
2.我最近的试验WDS+http+IIS375M的PEISO仅4-8秒传输。
启动文件关系很大。建议试一试lpxelinux.0

点评

顺便说一下,除了Linux必要文件,剩下的都是基于Server08R2,没有第三方。http+IIS+wds  详情 回复 发表于 2019-9-27 17:28
回复

使用道具 举报

66#
发表于 2019-9-27 17:28:59 | 只看该作者
hanzsim 发表于 2019-9-27 17:26
1.微软官网说明win10不求uefi
2.我最近的试验WDS+http+IIS375M的PEISO仅4-8秒传输。
启动文件关系很大。 ...

顺便说一下,除了Linux必要文件,剩下的都是基于Server08R2,没有第三方。http+IIS+wds
回复

使用道具 举报

67#
发表于 2019-10-13 08:43:45 | 只看该作者
我得先向楼主到个歉,前几天没去认真了解用途就随便评论了。早上试验了,虽然没完全成功,原因一会儿另说,但这这是好东西,太棒了。
我使用的纯Windows Server 2012r2做的pxe服务器,dhcp,http,wds作为pxe服务组件。pxe客户机是7代U的本,ipxe版本30f9,32-64efi。成功现在了iso,启动时Press any key boot from CD...这应该是ISO内的efi文件没搞对,一会整这个。说明你这个作品能用。
关键是速度,wimboot速度即使使用http也慢,比legacy下memdisk慢很多,而你的这个很快,我曾经用过的最快的是sysLinux的legacy,http下我的pe刚才三次测试是33秒,37秒,37秒。你的方式三次是37秒37秒35秒。几乎不相上下!膜拜
回复

使用道具 举报

68#
发表于 2019-10-13 08:51:29 | 只看该作者
遗憾的是,ipxe现在经常出问题,我以前自己编译过的现在新机器都不能用了,用了一些网友编译的也出各种各样的问题。如果没问题,配http绝对是最快的。真正维护工作量大的话,效率很重要。所以,尽量用http是一个方面,另一方面我服务器端不用第三方,只用Server原生功能。回头我再试试ipxe能不能适配单位的9代CPU的电脑,7代目前没问题,9代黑屏。
回复

使用道具 举报

69#
发表于 2019-10-13 12:01:38 | 只看该作者
怀疑press any key 是imgboot造成的,已经试了4个pe了,都有

点评

好吧,事实证明我又错了,找了个网友的无提示iso模板,成功了。  详情 回复 发表于 2019-10-13 12:13
回复

使用道具 举报

70#
发表于 2019-10-13 12:13:29 | 只看该作者
hanzsim 发表于 2019-10-13 12:01
怀疑press any key 是imgboot造成的,已经试了4个pe了,都有

好吧,事实证明我又错了,找了个网友的无提示iso模板,成功了。
回复

使用道具 举报

71#
发表于 2019-10-14 19:23:34 | 只看该作者
楼主在吗?grub2.02和2.04chainloader都是不读镜像,从chainloader传的参数指定的镜像在服务器端可以看见根本没有请求这个镜像,不论TFTP还是http。不带参数的情况下,服务器端也可以看见没有请求imgboot.cfg。而ipxe的BIOS和uefi工作却是正常。看看是什么原因?

点评

确实imgboot接受不了远程文件路径,远程启动的话只能启动ipxe的initrd过来的镜像,这样可以当成本地镜像启动。  详情 回复 发表于 2019-10-20 15:54
回复

使用道具 举报

72#
发表于 2019-10-14 21:58:26 | 只看该作者
楼上比我水啊,话说楼主的作品不是用在本地启动的吗,网启有万能的ipxe来sanboot或bootmgrfw.efi不用?

点评

网启,本地解决方案太多了。想整一个支持http的。微软的efi只支持TFTP。而wimboot又太慢,才找到了楼主这种iso启动的。原来晚上BIOS下用sysLinux的,可以memdisk,但efi不行。楼主这种方法ipxe不黑屏就很完美。还想  详情 回复 发表于 2019-10-15 04:59
回复

使用道具 举报

73#
发表于 2019-10-15 04:59:15 | 只看该作者
江南一根葱 发表于 2019-10-14 21:58
楼上比我水啊,话说楼主的作品不是用在本地启动的吗,网启有万能的ipxe来sanboot或bootmgrfw.efi不用?

网启,本地解决方案太多了。想整一个支持http的。微软的efi只支持TFTP。而wimboot又太慢,才找到了楼主这种iso启动的。原来晚上BIOS下用sysLinux的,可以memdisk,但efi不行。楼主这种方法ipxe不黑屏就很完美。还想试试grub2
回复

使用道具 举报

74#
发表于 2019-10-15 08:03:12 | 只看该作者
楼上自身原因,千兆环境,400m的pe,efi下微软的十几秒,wimboot不超过五秒

点评

好像是2年多以前试验的wimboot,速度比map慢30%。过几天再试试看是不是改善了。这个ISOboot很不错,ipxe下顶级速度。只是ipxe黑屏过。这几天没试验,服务器坏了一台,1天才确定了阵列卡坏了,把硬盘也搞坏了。先弄服  详情 回复 发表于 2019-10-16 19:56
兄弟,如果只是一两台,我3个U盘两个移动硬盘足够使了。我部门4×48。。。  详情 回复 发表于 2019-10-16 19:50
回复

使用道具 举报

75#
发表于 2019-10-16 19:50:34 | 只看该作者
江南一根葱 发表于 2019-10-15 08:03
楼上自身原因,千兆环境,400m的pe,efi下微软的十几秒,wimboot不超过五秒

兄弟,如果只是一两台,我3个U盘两个移动硬盘足够使了。我部门4×48。。。

点评

不算多,我有时候一天要搞定一百五十多台,bios下的话,网启g4d再来调用ipxe来wimboot能加速很多,  详情 回复 发表于 2019-10-16 19:56
回复

使用道具 举报

76#
发表于 2019-10-16 19:56:20 | 只看该作者
江南一根葱 发表于 2019-10-15 08:03
楼上自身原因,千兆环境,400m的pe,efi下微软的十几秒,wimboot不超过五秒

好像是2年多以前试验的wimboot,速度比map慢30%。过几天再试试看是不是改善了。这个ISOboot很不错,ipxe下顶级速度。只是ipxe黑屏过。这几天没试验,服务器坏了一台,1天才确定了阵列卡坏了,把硬盘也搞坏了。先弄服务器了。
回复

使用道具 举报

77#
发表于 2019-10-16 19:56:29 | 只看该作者
hanzsim 发表于 2019-10-16 19:50
兄弟,如果只是一两台,我3个U盘两个移动硬盘足够使了。我部门4×48。。。


不算多,我有时候一天要搞定一百五十多台,bios下的话,网启g4d再来调用ipxe来wimboot能加速很多,
efi下的话,"魔"改bcd后tftp速度甚至能跑满带宽

点评

如果能用ipxe,就完全可以直接用ipxe远程启动再用楼主这个文件启动ISO了。何必还要先启g4d再转ipxe再核心wimboot呢。网启有专门服务器,哪怕是普通机器充当,所有多存几个iso远远比拆出wim方便。反倒是U盘拆出wim外  详情 回复 发表于 2019-10-23 05:27
回复

使用道具 举报

78#
 楼主| 发表于 2019-10-20 15:54:39 | 只看该作者
hanzsim 发表于 2019-10-14 19:23
楼主在吗?grub2.02和2.04chainloader都是不读镜像,从chainloader传的参数指定的镜像在服务器端可以看见根 ...

确实imgboot接受不了远程文件路径,远程启动的话只能启动ipxe的initrd过来的镜像,这样可以当成本地镜像启动。
回复

使用道具 举报

79#
发表于 2019-10-20 22:29:00 | 只看该作者
dido0379 发表于 2019-10-20 15:54
确实imgboot接受不了远程文件路径,远程启动的话只能启动ipxe的initrd过来的镜像,这样可以当成本地镜像 ...

膜拜!!!
回复

使用道具 举报

80#
发表于 2019-10-23 05:27:25 | 只看该作者
江南一根葱 发表于 2019-10-16 19:56
不算多,我有时候一天要搞定一百五十多台,bios下的话,网启g4d再来调用ipxe来wimboot能加速很多,
ef ...

如果能用ipxe,就完全可以直接用ipxe远程启动再用楼主这个文件启动ISO了。何必还要先启g4d再转ipxe再核心wimboot呢。网启有专门服务器,哪怕是普通机器充当,所有多存几个iso远远比拆出wim方便。反倒是U盘拆出wim外挂模块更好。而事实是某些特殊情况U盘使用wimboot加载速度不及bios上map iso速度的1/2。我是不喜欢用wimboot。
回复

使用道具 举报

81#
发表于 2019-10-23 05:29:09 | 只看该作者
dido0379 发表于 2019-10-20 15:54
确实imgboot接受不了远程文件路径,远程启动的话只能启动ipxe的initrd过来的镜像,这样可以当成本地镜像 ...

可惜了,要是g4d或linux能用就美了。目前我用过的机器里linux网启兼容性最好。再次感谢你的作品。
回复

使用道具 举报

82#
发表于 2019-10-23 09:25:34 | 只看该作者
读取文件的速度和wimboot无关,wimboot只不过启动时多了个过程,要慢也是慢那两三秒,
不过日常环境中屎用我都是秒启
回复

使用道具 举报

83#
发表于 2019-10-25 19:10:07 | 只看该作者
试了一下,UEFI下还是有办法调用grub2的函数的。

大概就是写个grub2模块,安装一个protocol
  1. struct grub_efi_grub_protocol
  2. {
  3.   /* file */
  4.   grub_efi_status_t (*file_open) (grub_file_t *file, /* out */
  5.                                   const char *name,
  6.                                   enum grub_file_type type);
  7.   grub_efi_status_t (*file_open_w) (grub_file_t *file, /* out */
  8.                                     const grub_efi_char16_t *name,
  9.                                     enum grub_file_type type);
  10.   grub_efi_intn_t (*file_read) (grub_file_t *file /* in out */,
  11.                                 void *buf /* out */,
  12.                                 grub_efi_uintn_t len);
  13.   grub_efi_uint64_t (*file_seek) (grub_file_t *file /* in out */,
  14.                                   grub_efi_uint64_t offset);
  15.   grub_efi_status_t (*file_close) (grub_file_t *file /* in out */);
  16.   grub_efi_uint64_t (*file_size) (const grub_file_t file);
  17.   grub_efi_uint64_t (*file_tell) (const grub_file_t file);
  18.   /* command */
  19.   grub_efi_status_t (*execute) (const char *name, int argc, char **argv);
  20.   /* test */
  21.   void (*test) (void);
  22. };
  23. typedef struct grub_efi_grub_protocol grub_efi_grub_protocol_t;
  24. ......
  25. static grub_efi_status_t
  26. prot_file_open (grub_file_t *file, const char *name, enum grub_file_type type)
  27. {
  28.   *file = grub_file_open (name, type);
  29.   if (!*file)
  30.     return GRUB_EFI_NOT_FOUND;
  31.   return GRUB_EFI_SUCCESS;
  32. }

  33. static grub_efi_status_t
  34. prot_file_open_w (grub_file_t *file, const grub_efi_char16_t *name,
  35.                   enum grub_file_type type)
  36. {
  37.   grub_size_t s16_len = 0;
  38.   unsigned char *file_name = NULL;

  39.   s16_len = wcslen (name) + 1;
  40.   file_name = grub_malloc (s16_len);
  41.   if (!file_name)
  42.     return GRUB_EFI_OUT_OF_RESOURCES;
  43.   grub_utf16_to_utf8 (file_name, name, s16_len);
  44.   *file = grub_file_open ((char *)file_name, type);
  45.   grub_free (file_name);
  46.   if (!*file)
  47.     return GRUB_EFI_NOT_FOUND;
  48.   return GRUB_EFI_SUCCESS;
  49. }

  50. static grub_efi_intn_t
  51. prot_file_read (grub_file_t *file, void *buf, grub_efi_uintn_t len)
  52. {
  53.   return grub_file_read (*file, buf, len);
  54. }
  55. ......
  56. static grub_efi_grub_protocol_t grub_prot;
  57. static grub_efi_guid_t grub_prot_guid = GRUB_EFI_GRUB_PROTOCOL_GUID;

  58. static void
  59. grub_prot_init (void)
  60. {
  61.   grub_prot.file_open = prot_file_open;
  62.   grub_prot.file_open_w = prot_file_open_w;
  63.   grub_prot.file_read = prot_file_read;
  64. ......
  65.   grub_efi_boot_services_t *b;

  66.   b = grub_efi_system_table->boot_services;
  67.   efi_call_4 (b->install_protocol_interface,
  68.               &grub_efi_image_handle, &grub_prot_guid,
  69.               GRUB_EFI_NATIVE_INTERFACE, &grub_prot);
  70. }

  71. static void
  72. grub_prot_fini (void)
  73. {
  74.   grub_efi_boot_services_t *b;

  75.   b = grub_efi_system_table->boot_services;
  76.   efi_call_3 (b->uninstall_protocol_interface,
  77.               &grub_efi_image_handle, &grub_prot_guid, &grub_prot);
  78. }

  79. GRUB_MOD_INIT(grubprot)
  80. {
  81.   grub_prot_init ();
  82. }

  83. GRUB_MOD_FINI(grubprot)
  84. {
  85.   grub_prot_fini ();
  86. }
复制代码

点评

牛,那GRUB_PROTOCOL是本来就有还是w大你自己设计的?  详情 回复 发表于 2019-10-27 16:03
回复

使用道具 举报

84#
 楼主| 发表于 2019-10-27 16:03:41 | 只看该作者
wintoflash 发表于 2019-10-25 19:10
试了一下,UEFI下还是有办法调用grub2的函数的。

大概就是写个grub2模块,安装一个protocol

牛,那GRUB_PROTOCOL是本来就有还是w大你自己设计的?
回复

使用道具 举报

85#
发表于 2019-10-27 16:36:55 | 只看该作者
@wintoflash大的grub2+@dido0379大的isoboot可以实现在Secure Boot下引导任一分区ISO和WIM方式的PE,堪称完美。感谢两位大神
回复

使用道具 举报

86#
发表于 2019-10-27 17:45:33 | 只看该作者
dido0379 发表于 2019-10-27 16:03
牛,那GRUB_PROTOCOL是本来就有还是w大你自己设计的?

自己设计的。
话说loaded_image_protocol在低版本uefi下是不是不好用?
通过自己写的protocol传递cmdline是不是更靠谱?
回复

使用道具 举报

87#
发表于 2019-10-29 13:00:48 | 只看该作者
谢谢大神 正在发愁用memdisk,在efi模式下没法引导iso呢
回复

使用道具 举报

88#
发表于 2019-10-31 03:19:08 来自手机 | 只看该作者
非常好
回复

使用道具 举报

89#
发表于 2019-11-19 19:47:43 | 只看该作者
好东西一定要支持啊
回复

使用道具 举报

90#
发表于 2019-11-23 19:41:03 | 只看该作者
試一下
回复

使用道具 举报

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

本版积分规则

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

闽公网安备 35020302032614号

GMT+8, 2024-11-22 06:02

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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