无忧启动论坛

 找回密码
 注册
搜索
系统gho:最纯净好用系统下载站广告联系 微信:wuyouceo QQ:184822951
楼主: 2011yaya2007777
打印 上一主题 下一主题

[原创] GRUB4DOS for UEFI

    [复制链接]
211#
发表于 2023-1-4 19:06:56 | 显示全部楼层
2011yaya2007777 发表于 2023-1-4 18:18
我还看了一下外部命令,没有loadslic。没注意有slic。应当支持吧。没有测试。286958你可以试试啊。

https://github.com/chenall/grubutils/blob/master/g4eext/slic.c
回复

使用道具 举报

212#
发表于 2023-1-5 09:36:29 | 显示全部楼层
286958 发表于 2023-1-5 09:05
我在命令行输入slic slic.bin提示no such command:slic
输入slic也一样提示  no such command:slic

你把外部命令放哪了?
回复

使用道具 举报

213#
发表于 2023-1-5 10:07:52 | 显示全部楼层
286958 发表于 2023-1-5 09:59
/efi/grub/ext 目录下就有slic

你得先设置好外部命令文件夹的路径才行。
要么就用绝对路径 /efi/grub/ext/slic
回复

使用道具 举报

214#
发表于 2023-3-11 20:37:04 | 显示全部楼层
2023-03-11 (a1ive)
Linux 6.2 将已废弃的 EFI Handover Protocol 设为可选项:
    https://github.com/torvalds/linu ... 58ab51853cf106afb6a
因此放弃使用 EFI Handover Protocol 启动 Linux,改用 LoadFile2 提供 initrd 加载功能。
此更新会带来不兼容,请注意:
  不再支持 x64 UEFI 下启动 32 位内核 (或者反过来)。
  不再支持 ntloader v1 版本,请使用 ntloader v2 版本。(下载
========
本次改动应该可以解决在某些电脑上用 kernel 命令启动 ntloader 时出现的问题。
========
我偷懒了一下,目前 kernel 命令实际上就是 chainloader 命令。将来可能会添加对 wimboot 的支持。
回复

使用道具 举报

215#
发表于 2023-3-14 10:17:10 | 显示全部楼层
efi分支 builtins.c 10854行附近
https://github.com/chenall/grub4 ... 2/builtins.c#L10854
  1.       if (to_code == from_code)
  2.         /* If TO is equal to FROM, delete the entry.  */
  3.         grub_memmove ((char *) &ascii_key_map[i],
  4.                       (char *) &ascii_key_map[i + 1],
  5.                       sizeof (unsigned int) * (KEY_MAP_SIZE - i));
  6.       else
  7.                 ascii_key_map[i].from_code = from_code;
  8.                 ascii_key_map[i].to_code = to_code;
  9.     }
复制代码

  1. else
  2.                 ascii_key_map[i].from_code = from_code;
  3.                 ascii_key_map[i].to_code = to_code;
复制代码

是不是要加上花括号
  1. else
  2. {
  3.                 ascii_key_map[i].from_code = from_code;
  4.                 ascii_key_map[i].to_code = to_code;
  5. }
复制代码

如果是的话我一并改了。
回复

使用道具 举报

216#
发表于 2023-3-14 14:52:59 | 显示全部楼层
本帖最后由 wintoflash 于 2023-3-14 15:05 编辑
sunsea 发表于 2023-3-14 14:44
话说现在G4E能用做光盘上启动用途嘛?如果能的话怎么生成ISO?(要是能grldr和G4E双启动就好了)

能。
创建一个img(软盘镜像,无分区表),格式化成FAT。
创建\EFI\BOOT\
把g4e efi文件放进去
\EFI\BOOT\BOOTX64.EFI
\EFI\BOOT\BOOTIA32.EFI
找个生成双启iso的脚本,把uefi启动文件换成这个img就行了。
仅供参考
  1. mkisofs -l -R -hide-joliet boot.catalog -b grldr -no-emul-boot -allow-lowercase -boot-load-size 4 -boot-info-table -eltorito-alt-boot -e efi.img -no-emul-boot -o grubfm.iso build
复制代码
回复

使用道具 举报

217#
发表于 2023-3-14 16:15:07 | 显示全部楼层
sunsea 发表于 2023-3-14 16:05
EFI现在还是以加载一个软盘镜像来启动这样为主的嘛?没有BIOS时代的非模拟启动了?


这里所说的“软盘镜像”只是种便于理解的说法。跟什么1.44MB 软盘,dos,引导扇区,模拟启动之类的毫无关系。
是个含有FAT文件系统和efi文件的磁盘镜像就行,跟u盘启动要求一样。
你主板的uefi支持ntfs的话那ntfs格式也行。主板支持iso9660的话连这个镜像都省了(比如vbox)。
我说“不带分区表"也不是绝对的。带分区表的普通硬盘镜像也行。就是grub4dos在map启动它的时候不高兴。
回复

使用道具 举报

218#
发表于 2023-3-19 13:48:47 | 显示全部楼层
2023-03-19
尝试支持 iPXE wimboot。
grub4dos-for_UEFI-2023-03-19
http://grub4dos.chenall.net/down ... or_UEFI-2023-03-19/
需要使用修改的 wimboot:
(源码) https://github.com/grub4dos/wimboot
wimboot.zip (46.6 KB, 下载次数: 44)
BCD 等文件 (仅供参考):
bootmgfw.zip (1.19 MB, 下载次数: 62)
测试菜单 (仅供参考):
  1. title Wimboot
  2. find --set-root /EFI/grub/wimboot | set x=
  3. kernel /EFI/grub/wimboot
  4. find --set-root /winpe.wim
  5. initrd @bootmgfw.efi=%x%/EFI/grub/bootmgfw.efi
  6. initrd @bcd=%x%/EFI/grub/bcd
  7. initrd @boot.sdi=%x%/EFI/grub/boot.sdi
  8. initrd @wgl4_boot.ttf=%x%/EFI/grub/wgl4_boot.ttf
  9. initrd @aaaa.bat=%x%/EFI/grub/start.bat
  10. initrd @boot.wim=/winpe.wim
复制代码

评分

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

查看全部评分

回复

使用道具 举报

219#
发表于 2023-3-22 13:11:05 | 显示全部楼层
2011whp 发表于 2023-3-22 12:04
注入的 aaaa.bat    需 pecmd调用下
或者直接 当传递文本参数

我知道。这个就是用来测试注入是否成功的。
回复

使用道具 举报

220#
发表于 2023-4-1 09:42:56 | 显示全部楼层
本帖最后由 wintoflash 于 2023-4-1 09:46 编辑
2011yaya2007777 发表于 2023-3-30 15:57
ubuntu-18.04.6-desktop-amd64.iso启动分析

方法1.
1. 方法1与方法2都是加载ISO内启动软盘镜像中的bootx64.efi,但是一个成功另一个失败。
方法2加载的(0xff),好像kernel不认识。
如果使用以下方法:
chainloader (0xff)/efi/boot/bootx64.efi boot=casper iso-scan/filename=/boot/imgs/ubuntu-18.04.6-desktop-amd64.iso noprompt noeject
kernel反馈:打不开\boot\imgs\ubuntu-18.04.6-desktop-amd64.iso
或许是kernel根本不理会UEFI建立的设备,而是抛弃UEFI环境,直接加载自己的驱动,然后探测有那些存在的设备,其中有没有传入指定的设备存在?
或许是kernel根本不理会UEFI建立的VenHw(EBE35AD9-40F5-AADE-0B919A46BF4b)/CDROM(1,11c,B40)这样类型的设备,
而只认PciRoot(0)/Pci(1,1)/Ata(S,M,0)/CDROM(1,11c,B40)这样类型的设备?

操作系统调用 BS->ExitBootServices 之后,所有的 UEFI 启动服务就都不能用了,BlockIo,GOP 之类的所有这些 Protocol 也不能用了。
操作系统是用自带的驱动自己探测,并读写硬盘的。
(0xff)/efi/boot/bootx64.efi 是 GRUB2 的 EFI 文件。你给它传参数是没用的,要直接传给内核。
2.方法3失败,是传入的参数缺失或是不正确?我觉得这是启动linux最麻烦的地方,每个分支的都不一样,而且同一分支的不同序号也不同。

方法三是正确的。报错是找不到 initrd。原因是你用的 Ubuntu 版本太老了。用 Ubuntu 22.04 就没问题。
老的 linux 内核,支持 EFI Handover,不支持 LoadFile2。新的 linux 内核,支持 LoadFile2,不支持 EFI Handover。
以前 G4E 用的是 EFI Handover,现在用的是 LoadFile2。
回复

使用道具 举报

221#
发表于 2023-4-3 21:00:08 | 显示全部楼层
chen463 发表于 2023-4-3 20:01
请教各位前辈大大,我使用2023.3.29-G4D_UEFI版,在启动 Windows 系统时,17-18-21项都无法成功启动,是我操 ...

Windows系统文件夹在哪个分区,就传递哪个分区的 UUID。
17-18-21项都无法成功启动

反馈的内容要具体。
=========
如果系统启用了 Hyper-V / Bitlocker 之类的东西,就没法用这些第三方启动。
回复

使用道具 举报

222#
发表于 2023-4-3 22:14:07 | 显示全部楼层
chen463 发表于 2023-4-3 21:33
title 使用外部命令 NTBOOT 启动 Windows 系统\n (hd1,2)
map --mem --no-hook /efi/grub/ext/NTBOOT (h ...

"失败" 具体是怎么个失败法?
回复

使用道具 举报

223#
发表于 2023-4-4 20:50:02 | 显示全部楼层
chen463 发表于 2023-4-4 10:07
另外后学实机重复开关机操作,发现ROOT会有互换的现象,接下来(方案1)菜单uuid(hdx,y)操作就会出现问题。 ...
另外后学实机重复开关机操作,发现ROOT会有互换的现象,接下来(方案1)菜单uuid(hdx,y)操作就会出现问题。

你应该用 find --set-root 查找标志文件来确定磁盘分区号,比如
  1. find --set-root /Windows/System32/notepad.exe
  2. uuid ()
复制代码
回复

使用道具 举报

224#
发表于 2023-4-4 20:51:56 | 显示全部楼层
liuzhaoyzz 发表于 2023-4-4 15:32
感觉大佬的解释不太对呢?从时间逻辑上看不太对,因为2023-03-11放弃使用 EFI Handover Protocol 启动  ...

你太死板了。要看他具体的报错:
提示如下:
[      3.290560] ---[ end Kernel panic - not syncing: vfs: unable to mount root fs on unknown-block(0,0) ]  

他的机器上 map 是没有问题的。


回复

使用道具 举报

225#
发表于 2023-4-6 19:08:52 | 显示全部楼层
本帖最后由 wintoflash 于 2023-4-6 19:15 编辑
liuzhaoyzz 发表于 2023-4-6 15:10
EFI Handover Protocol/Loadfile2看了你的介绍似乎以后在linux内核方面是只能二选一是吧?

那么对于g4 ...
EFI Handover Protocol/Loadfile2看了你的介绍似乎以后在linux内核方面是只能二选一是吧?

对于 Linux 来说,它可以同时支持这两种。
对于 bootloader 来说,我们有办法知道一个内核是否支持 EFI Handover Protocol。但是,我们没办法知道一个内核是否支持 LoadFile2。

那么对于g4e,对于我们这样子的最终用户,我们期待的是不改菜单(或者少量修改),未来用最新版g4e/grub2能否自动适配两种protocol?能否兼容启动新老版本的linux内核(太老的内核除外)?理论上是否有可行性?

那不如像 GRUB2 一样,全部通过 32 位传统协议启动,什么版本的都支持。
“理论上” 自动适配(甚至支持非常老的内核)是可行的。但是很复杂,我很懒,不想费这个脑子来写。
对于你们最终用户来说,要么用最新版内核,要么自己给 G4E 提交补丁加上这些功能,要是还不服就憋着。
回复

使用道具 举报

226#
发表于 2023-4-29 13:59:19 | 显示全部楼层
2011yaya2007777 发表于 2023-4-29 07:40
ubuntu-18.04.6,内核版本20d,使用 EFI Handover Protocol 可以成功启动,但是使用 LoadFile2 失败。
u ...
可否使用内核版本作为分界,>20e 时使用 LoadFile2?

不行。
正常情况下,用
  1. kernel (hdx,y)/xxx/vmlinuz xxx initrd=/xxx/initrd.img
  2. initrd (hdx,y)/xxx/initrd.img
复制代码

就可以保证能启动。
* 正常情况指的是正规安装的 Linux,kernel 和 initrd 都位于 FAT 分区里面。
回复

使用道具 举报

227#
发表于 2023-5-7 10:40:46 | 显示全部楼层
liuzhaoyzz 发表于 2023-5-7 10:03
这个用于ipxe启动的菜单menu.lst,应该放在哪里?(pd)\EFI\grub\menu.lst?
好像找不到菜单啊?(pd)\men ...

"iPXE wimboot" 指的是 iPXE 组织的 wimboot 项目,与网启无关。
回复

使用道具 举报

228#
发表于 2023-5-7 11:53:50 | 显示全部楼层
本帖最后由 wintoflash 于 2023-5-7 12:04 编辑
2011yaya2007777 发表于 2023-5-7 10:54
我觉得现阶段仍然需要同时支持Handover协议和Loadfile2协议(不支持Handover协议内核版本

逻辑似乎有误。是否支持 Handover 是可以判断出来的
  1. struct linux_kernel_header
  2. {
  3.   ...
  4.   unsigned short version;                // 协议版本
  5.   ...
  6. #define LINUX_XLF_KERNEL_64 (1<<0) // 64位内核
  7. #define LINUX_XLF_CAN_BE_LOADED_ABOVE_4G (1<<1)
  8. #define LINUX_XLF_EFI_HANDOVER_32 (1<<2) // 支持 EFI32 Handover
  9. #define LINUX_XLF_EFI_HANDOVER_64 (1<<3) // 支持 EFI64 Handover
  10. #define LINUX_XLF_EFI_KEXEC (1<<4)
  11.   unsigned short xloadflags;
  12.   ...
  13.   unsigned int handover_offset; // Handover 入口,没有那就不支持 Handover
  14. } __attribute__ ((packed));
复制代码

伪代码:

  1. struct linux_kernel_header lh;
  2. grub_read (kernel, filemax, ...);
  3. memcpy (&lh, kernel, sizeof (lh));
  4. ...
  5. if (lh.version < 0x020b)
  6.   goto LoadFile2Boot;
  7. if (!lh.handover_offset)
  8.   goto LoadFile2Boot;
  9. if (IS_UEFI_32 && (lh.xloadflags & LINUX_XLF_KERNEL_64) && !(lh.xloadflags & LINUX_XLF_EFI_HANDOVER_32))
  10.   goto LoadFile2Boot;
  11. if (IS_UEFI_64 && !(lh.xloadflags & LINUX_XLF_KERNEL_64))
  12.   goto LoadFile2Boot;
  13. goto EfiHandoverBoot;
复制代码


回复

使用道具 举报

229#
发表于 2023-5-7 13:44:22 | 显示全部楼层
本帖最后由 wintoflash 于 2023-5-7 13:47 编辑
2011yaya2007777 发表于 2023-5-7 12:19
我想知道,这样是判断uefi固件支持不支持,还是判断所加载的那个linux镜像的内核支持不支持?

根据 UEFI 位数判断内核是否支持。
回复

使用道具 举报

230#
发表于 2023-5-7 15:06:24 | 显示全部楼层
2011yaya2007777 发表于 2023-5-7 14:23
请教一个问题:
是不是说使用 EFI Handover Protocol 启动 Linux,
  支持 x64 UEFI 下启动 32 位内核  ...

只要linux内核开了对应的选项(EFI Mixed Mode),就可以。
回复

使用道具 举报

231#
发表于 2023-5-7 15:52:34 | 显示全部楼层
2011yaya2007777 发表于 2023-5-7 15:45
IS_UEFI_xx  这是当前 EFI 环境。
lh.xloadflags 这是允许启动的内核位?比如 h.xloadflags=4,允许启动 ...

这是伪代码。
判断uefi位数,用#ifdef宏就行了。
xloadflags是按位表示内核的一些特性的。
回复

使用道具 举报

232#
发表于 2023-5-7 15:58:58 | 显示全部楼层
2011yaya2007777 发表于 2023-5-7 15:45
IS_UEFI_xx  这是当前 EFI 环境。
lh.xloadflags 这是允许启动的内核位?比如 h.xloadflags=4,允许启动 ...

struct linux_kernel_header 就是linux内核的文件头。xloadflags就是它给bootloader提供的信息,告诉bootloader它有哪些特性。
回复

使用道具 举报

233#
发表于 2023-5-10 22:08:05 | 显示全部楼层
本帖最后由 wintoflash 于 2023-5-10 22:09 编辑
liuzhaoyzz 发表于 2023-5-10 22:04
我用的前面发的12.5.7.

g4e也是要map --hook的呀

不需要。g4e 执行 map --hook 命令其实啥都没做。
回复

使用道具 举报

234#
发表于 2023-5-10 22:12:14 | 显示全部楼层
GRUB2 官方也准备统一 UEFI 下 Linux 的启动方式了,统一用 LoadFile2 的那个方法。
https://lists.gnu.org/archive/ht ... 23-05/msg00037.html
回复

使用道具 举报

235#
发表于 2023-5-11 13:49:25 | 显示全部楼层
2011yaya2007777 发表于 2023-5-11 06:49
昨天推送了一个补丁,到今天 build-push 仍然没有反应。是 ubuntu-18.04 落伍了吗?

重试了好几次,还是没有反应。不知道是怎么回事。
回复

使用道具 举报

236#
发表于 2023-5-11 13:53:47 | 显示全部楼层
liuzhaoyzz 发表于 2023-5-10 22:23
统一用 LoadFile2 的那个方法?不准备兼容handover?

GRUB 2 官方从来就没有支持过 EFI Handover Protocol。
arm64 efi 等平台上用的都是 LoadFile2。x86 efi 用的都是传统 32 位协议 (和 BIOS 下一样)。

点评

grub2 EFI启动linux,你指的是2744楼说的第一种是吗? 1. 传统的 32 位启动协议 (32-bit Boot Protocol) 这种方式下 Linux 接管时,已经退出了 UEFI 启动服务,Linux 获取不到 UEFI 系统表指针,因此 Linux  详情 回复 发表于 2023-5-11 16:55
回复

使用道具 举报

237#
发表于 2023-5-11 17:37:01 | 显示全部楼层
liuzhaoyzz 发表于 2023-5-11 16:55
grub2 EFI启动linux,你指的是2744楼说的第一种是吗?

1. 传统的 32 位启动协议 (32-bit Boot Proto ...

是的。
回复

使用道具 举报

238#
发表于 2023-5-12 12:18:45 | 显示全部楼层
liuzhaoyzz 发表于 2023-5-12 12:11
那grub2统一用loadfile2协议,不是不能启动老版本的linux了吗?
应该会做兼容性处理吧?

会的。
回复

使用道具 举报

239#
发表于 2023-5-12 19:27:02 | 显示全部楼层
@yaya
https://github.blog/changelog/20 ... removed-by-12-1-22/
GitHub Actions 今年四月底终止了对 Ubuntu 18.04 的支持。
回复

使用道具 举报

240#
发表于 2023-5-12 20:16:18 | 显示全部楼层
2011yaya2007777 发表于 2023-5-12 20:10
我一开始猜想就是18.04落伍了。今天换成20.04.6,又说gcc4.8找不到还是什么的,奇怪了,你不是打了支持gcc ...

没推送。
而且目前efi打上之后是有问题的。
回复

使用道具 举报

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

本版积分规则

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

闽公网安备 35020302032614号

GMT+8, 2024-5-1 13:10

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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