无忧启动论坛

 找回密码
 注册
搜索
系统gho:最纯净好用系统下载站广告联系 微信:wuyouceo QQ:184822951
查看: 34859|回复: 119

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

    [复制链接]
发表于 2019-6-10 14:45:12 | 显示全部楼层 |阅读模式
本帖最后由 dido0379 于 2019-9-12 12:55 编辑

要求镜像必须支持UEFI启动

用到的文件在附件中

        因为我的工作经常要启动各种pe,在uefi下本地或者ipxe远程启动PE的iso镜像文件不怎么方便,每次都要解压出来用wimboot来启动,所以一直想找一个工具能在UEFI本地或者ipxe远程直接启动iso镜像文件(本地启动iso镜像文件只找到XORBOOT可以用),后来看了这个教程http://www.lab-z.com/stu132rd/于是有了上面那个东西。
        再经过一段时间的修改,总算可以不用ramdiskdxe了,因为ramdiskdxe.efi在较新的已经包含了此驱动的UEFI BIOS上面无法工作。并且先要载入内存需要占用更多的内存和时间。
        现在也可以用efishell载入或者grub2来载入isoboot,并且加入了一个简单的配置文件,可以在配置文件第一行里面写上iso文件的路径。
        配置文件只支持一行,指出iso文件的路径,可以是相对路径如"..\123\test.iso"或者"567.iso",也可以是绝对路径如"\abc\zxc\test2.iso"。
        如果没有配置文件,那么isoboot会在自己所在目录查找iso文件,用找到的第一个iso文件来启动。
        所以ipxe的菜单可以写成两行
                initrd         ${xieyi}://${next-server}/test.iso
                chain          ${xieyi}://${next-server}/isoboot.efi
       
        用grub2的话类似这样"chainloader /123/isoboot.efi"就可以了。
        另外我没有在真实机器上面测试,只在Q启动测试器和VMWARE里面测试过。有条件的朋友可以把测试结果反馈到这里。但是我可能不会有进一步的需求来修改了,所以把源代码也放在这里。有需要的可以自己修改。

        6月29日 重做驱动部分,已兼容铭瑄B150,华硕B250,华硕B450,附件已更新

        7月6日 添加命令行参数支持,这样就可以用同一个isoboot.efi文件启动不同文件夹或者相同文件夹下的不同的iso文件,grub2菜单可以写成
                chainloader /zxc/isoboot.efi 123/test.iso(相对路径)或者
                chainloader /zxc/isoboot.efi  /abc/test.iso(绝对路径),附件已更新。
        7月7日 在使用中发现有的iso镜像把内置2.8M大小的bootimage的扇区数设置成了1个扇区(800字节)导致不能启动。改为读取内置bootimage引导区的扇区数。并且限定为最小2.8M(0x1680个扇区)。
        7月9日 调整了驱动安装顺序和策略,命令行增加了-mem,-wait n,可以按键取消倒计时,通过了少量的测试,附件已更新。

        9月12日 ,imgboot发布,包含isoboot的所有功能,增加32位版本,兼容UEFI2.0固件,增加对硬盘分区的识别,允许镜像不在imgboot所在分区。用法见压缩包中的配置文件。

isoboot.rar

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

MyRamDisk.rar

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

源代码

imgboot61.rar

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

评分

参与人数 8无忧币 +40 收起 理由
wuxin9712 + 5
cckp + 5 很给力!
rabbired + 5 很给力!
lhb9900 + 5 赞一个!
282198284 + 5 大神能否改成支持IMG的,硬盘格式最好,软.
wintoflash + 5
ksafei + 5 赞一个!
有阴也有阳 + 5 很给力!

查看全部评分

 楼主| 发表于 2019-7-6 14:11:32 | 显示全部楼层
本帖最后由 dido0379 于 2019-8-8 00:26 编辑

以前用grub4dos,map命令启动pe.iso真是方便。这两年一直在找能简单的在UEFI下直接启动pe.iso镜像的东西,边学边做总算完成了。

评分

参与人数 1无忧币 +5 收起 理由
wuxin9712 + 5

查看全部评分

回复

使用道具 举报

 楼主| 发表于 2019-7-7 14:40:17 | 显示全部楼层
熄灭的烟 发表于 2019-7-7 13:29
ipxe不是早在N年前就支持UEFI启动ISO了吗,是我穿越回5年前看到你发的这篇文章吗?

我是真的没找到。
回复

使用道具 举报

 楼主| 发表于 2019-7-8 10:43:49 | 显示全部楼层
wintoflash 发表于 2019-7-7 19:02
FileDiskBlockIo.c文件中,
第317行,388行,441行

感谢大佬指出,这造成了指针定位错误。更正后已重新上传了附件。
回复

使用道具 举报

 楼主| 发表于 2019-7-8 10:48:14 | 显示全部楼层
ksafei 发表于 2019-7-7 18:41
0707版引导的兼容性有提高,但在30秒倒计时后需重新手动再次加载菜单才能正常启动。能否改成0706版那样一次 ...

感谢反馈,已将错误等待时间改为3秒,附件已更新。

点评

感谢楼主的好作品。测试中刚好用到2个不同引导模式ISO详细反馈如下: 1)0706版:a.iso 启动正常 b.iso 失败(字符闪过) 2)0707版:a.iso 需2次引导 b.iso 需2次引导 3)0708版:a.iso 需2次引导  详情 回复 发表于 2019-7-8 12:10
回复

使用道具 举报

 楼主| 发表于 2019-7-8 13:13:15 | 显示全部楼层
本帖最后由 dido0379 于 2019-7-8 13:25 编辑
wintoflash 发表于 2019-7-8 11:32
楼主啊,我对这个很感兴趣,昨天和前天都在尝试把这个移植成grub2的模块,不过目前还没有成功。

请问一 ...


那个NoBootStartAddr和NoBootSize按我的设想是代表传统启动映像的,后来发现传统映像在UEFI下面没用,所以就没管了,FindPartitionInFile里面有个错误是找到其中一个就返回EFI_SUCCESS,已经改成了必须找到UEFI启动映像才返回EFI_SUCCESS。
我的代码写得很难看(除了抄来的部分 ),写的时候也没考虑重用性,移植估计要费一番功夫。要是能成功移植成一个GRUB2的模块就太好了。
回复

使用道具 举报

 楼主| 发表于 2019-7-8 13:17:34 | 显示全部楼层
ksafei 发表于 2019-7-8 12:10
感谢楼主的好作品。测试中刚好用到2个不同引导模式ISO详细反馈如下:
1)0706版:a.iso  启动正常     ...

能说一下2次引导的过程吗?还有这两个光盘的区别。

点评

1.面上看不出两个ISO启动文件的区别,导出引导文件如下: a.bif b.bif 2.用chainloader命令菜单引导,为便于查找问题故用0707版截图 表现:第一次运行菜单会出现如下提示,然后返回菜单界面,再次运  详情 回复 发表于 2019-7-8 16:14
回复

使用道具 举报

 楼主| 发表于 2019-7-8 17:37:41 | 显示全部楼层
本帖最后由 dido0379 于 2019-7-8 17:56 编辑
ksafei 发表于 2019-7-8 16:14
1.面上看不出两个ISO启动文件的区别,导出引导文件如下:
a.bif


可能是驱动部分的安装策略兼容性不好,我得想一想再改。最好将a.iso传给我试一下。谢谢你的测试。

点评

由于网络限制,我无法访问ftp页面。 此PE为 @大漠孤鹰大侠的Win10PE, https://pan.baidu.com/s/142U73dt5ygIvnGoUWD9oKQ (m359 ),辛苦你了  详情 回复 发表于 2019-7-8 17:52
回复

使用道具 举报

 楼主| 发表于 2019-7-9 18:35:27 | 显示全部楼层
ksafei 发表于 2019-7-8 16:14
1.面上看不出两个ISO启动文件的区别,导出引导文件如下:
a.bif

9月9日版本isoboot载入大漠孤鹰pe在铭瑄h110上一次通过了,另外加了两个命令行参数,麻烦你测试一下了。

点评

测试新版以及参数-mem均启动正常,再次感谢楼主  详情 回复 发表于 2019-7-9 19:42
回复

使用道具 举报

 楼主| 发表于 2019-7-9 18:39:42 | 显示全部楼层
wintoflash 发表于 2019-7-8 18:35
楼主,使用今天(7.8)版本的isoboot.efi启动某iso会死机,使用7.6日的版本可以正常加载为虚拟盘(但是不能启 ...

再次更新了一下,等map模块可以用了,我这个就可以退休了。感谢w大。
回复

使用道具 举报

 楼主| 发表于 2019-7-9 18:41:19 | 显示全部楼层
江南一根葱 发表于 2019-7-8 19:49
vm试的grub2环境还是efishell下都报这个错。。

正常应该是这样的

感谢测试,前面有一个版本是有这个问题,附件已经更新了,麻烦有空再测试一下。

点评

现在下载的可以了,没啥报错,马上就能启  详情 回复 发表于 2019-7-9 19:18
回复

使用道具 举报

 楼主| 发表于 2019-7-28 12:47:53 | 显示全部楼层
本帖最后由 dido0379 于 2019-7-28 13:05 编辑
282198284 发表于 2019-7-21 22:41
能否改为支持img启动的,就是把img镜像模拟到内存盘中,启动img内存盘中的EFI\Boot\bootx64.efi


增加img启动可以的,但是内存盘生存期怎么才能延续到exitbootservice()之后需要解决,不解决这个问题也就只能启动wim打包的pe而已。就算将内存盘放到runtimeservicedata里面,进入系统也需要类似winblk或者firadisk之类的内存盘驱动才能访问,否则7b蓝屏是铁定的。ramos我不太了解,也不知道怎样才能给这些内存盘驱动传参数。

点评

要硬盘格式的才可以,您看一下能不能解决,就是要在这个内存硬盘上跑到7B蓝屏  详情 回复 发表于 2019-7-28 12:59
回复

使用道具 举报

 楼主| 发表于 2019-7-28 13:18:40 | 显示全部楼层
282198284 发表于 2019-7-28 12:59
要硬盘格式的才可以,您看一下能不能解决,就是要在这个内存硬盘上跑到7B蓝屏

也就是说将控制权交给img里面的bootx64.efi就完事?那7b怎么解决呢?

点评

7b后是P驱的事了  详情 回复 发表于 2019-7-28 13:27
回复

使用道具 举报

 楼主| 发表于 2019-8-4 21:05:06 | 显示全部楼层
lhb9900 发表于 2019-8-4 01:54
请教 initrd         ${xieyi}://${next-server}/test.iso   当test.iso超大时(深度Linux deepin.iso 2.26 ...

不太清楚
回复

使用道具 举报

 楼主| 发表于 2019-8-4 21:09:38 | 显示全部楼层
lhb9900 发表于 2019-8-4 13:58
不能支持centos.iso,centos.iso好像只持放在FAT32

是的,isoboot只支持fat32。

点评

建议 1、对boot*.efi启动文件路径作大小路径兼容 2、编译,一个x64、一个x86 创建内存盘4G以上(现在光盘很多都超2G)  详情 回复 发表于 2019-8-5 02:03
回复

使用道具 举报

 楼主| 发表于 2019-8-5 08:44:46 | 显示全部楼层
lhb9900 发表于 2019-8-5 02:03
建议
1、对boot*.efi启动文件路径作大小路径兼容
2、编译,一个x64、一个x86  创建内存盘4G以上(现在光 ...

这个工具只能用于启动PE光盘镜像

点评

我看你的源码,虚拟内存盘才给了2G  详情 回复 发表于 2019-8-5 09:01
回复

使用道具 举报

 楼主| 发表于 2019-8-6 10:13:36 | 显示全部楼层
lhb9900 发表于 2019-8-5 09:01
我看你的源码,虚拟内存盘才给了2G

感谢大佬指出,能帮个忙贴出错误位置吗,我知道有错误,就是找不到。

点评

这个我也看不懂,应该是在这个里面 MyRamDisk.h  详情 回复 发表于 2019-8-6 10:21
回复

使用道具 举报

 楼主| 发表于 2019-8-6 14:00:49 | 显示全部楼层
lhb9900 发表于 2019-8-6 10:21
这个我也看不懂,应该是在这个里面
MyRamDisk.h


谢谢,我再检查一下,另外已经加了一些功能,将名字改成了imgboot,可以支持硬盘镜像,不过还有些问题没有解决所以暂时没发出来。

点评

请问你的编译环境是怎么搭建的,有什么简单的方法吗!我这边想搭建EFI编译环境,但发现VS2019安装要几十GB的空间  详情 回复 发表于 2019-8-6 14:08

评分

参与人数 1无忧币 +10 收起 理由
l10x + 10 赞一个!

查看全部评分

回复

使用道具 举报

 楼主| 发表于 2019-9-12 13:28:40 | 显示全部楼层
更新了一下附件,imgboot可以下载了。
回复

使用道具 举报

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

使用道具 举报

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

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

点评

可惜了,要是g4d或linux能用就美了。目前我用过的机器里linux网启兼容性最好。再次感谢你的作品。  详情 回复 发表于 2019-10-23 05:29
膜拜!!!  详情 回复 发表于 2019-10-20 22:29
回复

使用道具 举报

 楼主| 发表于 2019-10-27 16:03:41 | 显示全部楼层
wintoflash 发表于 2019-10-25 19:10
试了一下,UEFI下还是有办法调用grub2的函数的。

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

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

点评

自己设计的。 话说loaded_image_protocol在低版本uefi下是不是不好用? 通过自己写的protocol传递cmdline是不是更靠谱?  详情 回复 发表于 2019-10-27 17:45
回复

使用道具 举报

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

本版积分规则

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

闽公网安备 35020302032614号

GMT+8, 2024-4-16 21:01

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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