无忧启动论坛

标题: G4E引导Archlinux内核6.2.1失败 [打印本页]

作者: sunsea    时间: 2023-3-7 09:13
标题: G4E引导Archlinux内核6.2.1失败
本帖最后由 sunsea 于 2023-3-13 08:17 编辑

如图,G4E版本是http://bbs.wuyou.net/forum.php?mod=redirect&goto=findpost&ptid=434037&pid=4804015&fromuid=416965 29楼版本。



引导Archlinux失败,内核版本6.2.1,疑似已经干掉了EFI Handover Protocol了,目前引导LTS版6.1.15内核还是正常的……
早就听说这个东西已经被废弃了,Google了一下似乎从6.2开始EFI Handover Protocol就彻底废弃了……


作者: wintoflash    时间: 2023-3-7 09:26
本帖最后由 wintoflash 于 2023-3-7 09:29 编辑

http://bbs.wuyou.net/forum.php?m ... 3224&fromuid=487838

目前可以用 chainloader 来启动内核,不过 initrd 要在同一 ESP 分区。
linux /xxx/vmlinuz XXX
initrd /xxx/initrd.img
转换为
chainloader /xxx/vmlinuz XXX initrd=/xxx/initrd.img

放弃 EFI Handover Protocol 的缺点就是 64 位 EFI 下不能启动 32 位内核了 (或者反过来)。
传统 32 位启动协议比较难支持,而且很多 EFI 相关的功能就报废了。
作者: 9527sss    时间: 2023-3-7 09:28
感谢分享
作者: sunsea    时间: 2023-3-7 10:21
本帖最后由 sunsea 于 2023-3-7 10:28 编辑
wintoflash 发表于 2023-3-7 09:26
http://bbs.wuyou.net/forum.php?m ... 3224&fromuid=487838

目前可以用 chainloader 来启动内核,不过  ...

好的感谢,不知道G4E是否有计划把kernel命令的实现机制改了……chainloader总感觉怪怪的……不过生产环境应该没人有64bit环境启动32bit需求。
以及有多个initrd该怎么写呢?(需要上微码更新)


作者: wintoflash    时间: 2023-3-7 11:23
不知道G4E是否有计划把kernel命令的实现机制改了

在考虑。主要是造成很多不兼容。
以及有多个initrd该怎么写呢?(需要上微码更新)

那就没办法了。还有initrd=后面路径用 / 还是 \ 我忘了。
作者: sunsea    时间: 2023-3-7 11:44
本帖最后由 sunsea 于 2023-3-7 11:56 编辑
wintoflash 发表于 2023-3-7 11:23
在考虑。主要是造成很多不兼容。

那就没办法了。还有initrd=后面路径用 / 还是 \ 我忘了。

生产环境应该32bit内核不是主流了吧。或者留一个切换参数,或者来个自动探测,优先EFI handover,不行再别的办法。kernel命令服务的是linux,那么也跟着主线走就是了……
作者: Hello学习    时间: 2023-3-7 12:07
学习学习
作者: yyz2191958    时间: 2023-3-7 12:12

感谢分享
作者: syzcz    时间: 2023-3-7 14:46
感谢分享经验
作者: sunsea    时间: 2023-3-7 15:20
妈呀,一个反馈问题的帖子怎么一个个都是感谢分享的,都是机器人么?
作者: panyf14    时间: 2023-3-7 17:34
学习了
作者: rchc08    时间: 2023-3-7 21:19
学习
作者: wintoflash    时间: 2023-3-7 22:17
本帖最后由 wintoflash 于 2023-3-7 22:19 编辑

grub4dos-for_UEFI-2023-03-07.7z (1.05 MB, 下载次数: 19)
试试,暂时删了 EFI Handover Protocol 相关的东西,使用 LoadFile2 Protocol 提供 initrd。
我用 Manjaro 测试加载多个 initrd 是可以的。
  1. title Manjaro (kernel)
  2. kernel /manjaro/vmlinuz-x86_64 misobasedir=manjaro misolabel=TEST driver=nonfree nouveau.modeset=0 i915.modeset=1 radeon.modeset=1
  3. initrd /manjaro/amd_ucode.img /manjaro/intel_ucode.img /manjaro/initramfs-x86_64.img

  4. title Manjaro (chainloader)
  5. chainloader /manjaro/vmlinuz-x86_64 misobasedir=manjaro misolabel=TEST driver=nonfree nouveau.modeset=0 i915.modeset=1 radeon.modeset=1 initrd=/manjaro/initramfs-x86_64.img
复制代码

==============
我没搞定 gcc 4.8 的安装,所以瞎改了一通之后用 GCC 10.4 编译的,可能有其他毛病。
作者: sunsea    时间: 2023-3-8 17:49
本帖最后由 sunsea 于 2023-3-8 17:51 编辑
wintoflash 发表于 2023-3-7 22:17
试试,暂时删了 EFI Handover Protocol 相关的东西,使用 LoadFile2 Protocol 提供 initrd。
我用 Manja ...

真机测试结果是直接死在configfile上。屏幕提示只有Will load external menu...没有Has entered the external menu...

内置菜单:
  1. debug 3
  2. find --set-root /EFI/grub/mydisk.sig
  3. echo Will load external menu...
  4. configfile /EFI/grub/menu.lst
  5. ########
复制代码


外置菜单:
  1. !BAT
  2. echo Has entered the external menu...
  3. terminal console
  4. debug 3
  5. echo set menu...
  6. setmenu --u
  7. setmenu --string=
  8. set prefix=%@root%
  9. echo loading graphics...
  10. font
  11. graphicsmode -1 1920
  12. splashimage /efi/grub/splash.hd.bmp.lzma
  13. font /efi/grub/unifont.hex.lzma

  14. echo 加载各种文件系统驱动,请稍后……
  15. #load /efi/grub/ntfs_x64_rw.efi
  16. #echo ntfs加载完成。
  17. #load /efi/grub/udf_x64.efi
  18. #echo udf加载完成。
  19. load /efi/grub/ext2_x64.efi
  20. echo ext加载完成。
  21. #load /efi/grub/iso9660_x64.efi
  22. #echo iso9660加载完成。
  23. #load /efi/grub/exfat_x64.efi
  24. #echo exfat加载完成。

  25. set sig_file=
  26. set wim_file=

  27. #设置中文菜单按键帮助
  28. setmenu --lang=zh
  29. #设置自动菜单编号
  30. setmenu --auto-num-on
  31. #设置日期时间
  32. #setmenu --string=215=65=0xffff66="date&time=yyyy-MM-dd HH:mm:ss"
  33. #设置菜单框
  34. #setmenu --box w=149 h=115 l=2

  35. default 1

  36. title -------启动菜单,不要选这里------
  37. find --set-root %sig_file%
  38. uuid %@root%
  39. kernel %prefix%/efi/grub/ntloader/ntloader uuid=%?% file=%wim_file% hires=1 minint=1
  40. initrd %prefix%/efi/grub/ntloader/initrd.lz1
  41. boot

  42. title 正常渠道启动Windows
  43. find --set-root /EFI/Microsoft/Boot/myharddisk.txt
  44. chainloader /EFI/Microsoft/Boot/bootmgfw.efi
  45. root %@root%
  46. boot

  47. title 加载本地Archlinux的Grub2菜单
  48. find --set-root /EFI/Microsoft/Boot/myharddisk.txt
  49. chainloader /EFI/arch/grubx64.efi
  50. root %@root%
  51. boot

  52. title 直入Archlinux 正常内核
  53. find --set-root /boot/intel-ucode.img
  54. uuid ()
  55. kernel /boot/vmlinuz-linux root=UUID=%?_UUID% rw splash loglevel=3 splash
  56. initrd /boot/intel-ucode.img /boot/initramfs-linux.img
  57. #chainloader /boot/vmlinuz-linux root=UUID=%?_UUID% rw splash loglevel=3 splash initrd=/boot/intel-ucode.img initrd=/boot/initramfs-linux.img
  58. #上面这句话好像能带多个initrd

  59. title 直入Archlinux 正常内核 恢复模式
  60. find --set-root /boot/intel-ucode.img
  61. uuid ()
  62. kernel /boot/vmlinuz-linux root=UUID=%?_UUID% rw single splash
  63. initrd /boot/intel-ucode.img /boot/initramfs-linux-fallback.img

  64. title 直入Archlinux LTS
  65. find --set-root /boot/intel-ucode.img
  66. uuid ()
  67. kernel /boot/vmlinuz-linux-lts root=UUID=%?_UUID% rw splash loglevel=3 splash
  68. initrd /boot/intel-ucode.img /boot/initramfs-linux-lts.img

  69. title 直入Archlinux LTS 恢复模式
  70. find --set-root /boot/intel-ucode.img
  71. uuid ()
  72. kernel /boot/vmlinuz-linux-lts root=UUID=%?_UUID% rw single splash
  73. initrd /boot/intel-ucode.img /boot/initramfs-linux-lts-fallback.img

  74. title HHH333 PE Win11 x64
  75. set sig_file=/BOOT/H3_1164.WIM
  76. set wim_file=%sig_file%
  77. fallback 0
  78. kernel


  79. title HHH333 PE Win10 x64
  80. set sig_file=/BOOT/H3_1064.WIM
  81. set wim_file=%sig_file%
  82. fallback 0
  83. kernel


  84. title HHH333 PE Win8.1 x64
  85. set sig_file=/BOOT/H3_8164.WIM
  86. set wim_file=%sig_file%
  87. fallback 0
  88. kernel


  89. title HHH333 PE Win8 x64
  90. set sig_file=/BOOT/H3_864.WIM
  91. set wim_file=%sig_file%
  92. fallback 0
  93. kernel


  94. title 0PE Win10 PE 64 (EFI)
  95. set sig_file=/0PE/0PENB.LZMA
  96. set wim_file=/efi/boot.wim
  97. fallback 0
  98. kernel



  99. title Grub2FM 万能文件管理与启动器 By a1ive
  100. map %prefix%/efi/grub/grubfm.iso (0xff)
  101. chainloader (0xff)
  102. boot

  103. title Sltiaz 便携Linux \n root密码root。用户tux,密码tux
  104. find --set-root /IMGs/slitaz-core64.iso
  105. map /IMGs/slitaz-core64.iso (0xff)
  106. chainloader (0xff)
  107. boot

  108. title StartOS (不保存数据) \n root密码:Loongson,其他普通用户如live均为live
  109. find --set-root /startos/boot/initramfs.img
  110. uuid ()
  111. kernel /startos/boot/vmlinuz squashfs=UUID=%?%:/startos/sfs ro splash _tmpfs=y
  112. initrd /startos/boot/initramfs-fallback.img

  113. title 试图查找本地的Windows x64并启动
  114. find --set-root /Windows/System32/Boot/winload.efi
  115. uuid %@root%
  116. kernel %prefix%/efi/grub/ntloader/ntloader uuid=%?% hires=1
  117. initrd %prefix%/efi/grub/ntloader/initrd.lz1
  118. boot


  119. title 试图查找本地的Windows 7 x64并启动(WIN7专用入口!)
  120. find --set-root /Windows/System32/Boot/winload.efi
  121. uuid %@root%
  122. kernel %prefix%/efi/grub/ntloader/ntloader uuid=%?% hires=1 win7
  123. initrd %prefix%/efi/grub/ntloader/initrd.lz1
  124. boot

  125. title H3PE 原版grub2菜单
  126. find --set-root /EFI/boot/g2bootx64.efi
  127. chainloader /EFI/boot/g2bootx64.efi
  128. boot

  129. title H3PE 原版grub4efi菜单
  130. find --set-root /EFI/boot/g4bootx64.efi
  131. configfile ()/EFI/grub/menu.lst

  132. title USM 启动Windows_11PE_64位_全能娱乐版(支持声、显、网卡)
  133. set sig_file=/boot/usm1pe6F.wim
  134. set wim_file=%sig_file%
  135. fallback 0
  136. kernel

  137. title USM 启动Windows_11PE_64位_精简维护版
  138. set sig_file=/boot/usm1pe6L.wim
  139. set wim_file=%sig_file%
  140. fallback 0
  141. kernel


  142. title USM 启动Windows_8PE__64位_全能娱乐版(支持声、显、网卡)
  143. set sig_file=/boot/usm8pe6F.wim
  144. set wim_file=%sig_file%
  145. fallback 0
  146. kernel


  147. title USM 启动Windows_8PE__64位_精简维护版
  148. set sig_file=/boot/usm8pe6L.wim
  149. set wim_file=%sig_file%
  150. fallback 0
  151. kernel

  152. title USM 启动Windows_7PE__64位_精简维护版
  153. set sig_file=/boot/USM7PE6L.WIM
  154. set wim_file=/boot/USM7PE6L.WIM win7
  155. fallback 0
  156. kernel

  157. title 查找Archlinux-monthly.iso并启动
  158. find --ignore-floppies --set-root /archlinux-monthly.iso
  159. uuid ()
  160. map /archlinux-monthly.iso (0xff)
  161. kernel (0xff)/arch/boot/x86_64/vmlinuz-linux img_dev="/dev/disk/by-uuid/%?_UUID%" img_loop="/archlinux-monthly.iso" earlymodules=loop
  162. initrd (0xff)/arch/boot/intel-ucode.img (0xff)/arch/boot/amd-ucode.img (0xff)/arch/boot/x86_64/initramfs-linux.img
  163. boot

  164. title 进入BIOS固件设置
  165. command %prefix%/efi/grub/ext/fwsetup

  166. title UEFI Shell
  167. chainloader /efi/grub/uefishell.efi

  168. title 退出grub4dos
  169. exit_g4d

  170. title 命令行
  171. commandline

  172. title 重启计算机
  173. reboot

  174. title 关闭计算机
  175. halt
复制代码

作者: wintoflash    时间: 2023-3-8 17:53
本帖最后由 wintoflash 于 2023-3-8 17:56 编辑
sunsea 发表于 2023-3-8 17:49
真机测试结果是直接死在configfile上。屏幕提示只有Will load external menu...没有Has entered the exte ...

你有gcc4.8环境吗?有的话可以打上压缩包里面的补丁自己编译试试(删掉configure里面那行我乱改的东西)
或者别用批处理,就用最简单的几个命令试试能不能启Linux。没问题的话我推github上去。
作者: sunsea    时间: 2023-3-8 17:56
wintoflash 发表于 2023-3-8 17:53
你有gcc4.8环境吗?有的话可以打上压缩包里面的补丁自己编译试试(删掉configure里面那行我乱改的东西)

显然是没有的(悲)
作者: sunsea    时间: 2023-3-8 18:08
wintoflash 发表于 2023-3-8 17:53
你有gcc4.8环境吗?有的话可以打上压缩包里面的补丁自己编译试试(删掉configure里面那行我乱改的东西)
...

手动命令行进linux成功了。干掉外置菜单的!BAT那一行也能顺利进入菜单。不过你的ntloader不打算更新一下吗?
作者: wintoflash    时间: 2023-3-8 20:40
sunsea 发表于 2023-3-8 18:08
手动命令行进linux成功了。干掉外置菜单的!BAT那一行也能顺利进入菜单。不过你的ntloader不打算更新一下 ...

那就好。
  1. 干掉外置菜单的!BAT那一行也能顺利进入菜单。
复制代码

这就有点奇葩了。得找熟悉GCC的埃及老哥研究一下。
  1. 不过你的ntloader不打算更新一下吗?
复制代码

原来搞的都忘光了,那得重新从wimboot改了。
作者: wintoflash    时间: 2023-3-11 11:59
sunsea 发表于 2023-3-8 18:08
手动命令行进linux成功了。干掉外置菜单的!BAT那一行也能顺利进入菜单。不过你的ntloader不打算更新一下 ...


ntloader 也更新了一下
https://github.com/grub4dos/ntloader/releases/tag/latest
没啥问题我就推送了
  1. title Windows PE
  2. find --set-root /winpe.wim
  3. uuid ()
  4. find --set-root /EFI/grub/ntloader
  5. kernel /EFI/grub/ntloader uuid=%?% file=/winpe.wim
  6. initrd /EFI/grub/initrd.lz1

  7. title Windows VHD
  8. find --set-root /ramos.vhd
  9. uuid ()
  10. find --set-root /EFI/grub/ntloader
  11. kernel /EFI/grub/ntloader uuid=%?% file=/ramos.vhd
  12. initrd /EFI/grub/initrd.lz1
复制代码

作者: sunsea    时间: 2023-3-11 20:19
wintoflash 发表于 2023-3-11 11:59
ntloader 也更新了一下
https://github.com/grub4dos/ntloader/releases/tag/latest
没啥问题我就推 ...

VHD没环境,带PE没有问题,应该没啥大问题。所以现在让人头疼的就一个事,尼玛怎么一句!BAT搞死机了……
作者: wintoflash    时间: 2023-3-11 20:21
sunsea 发表于 2023-3-11 20:19
VHD没环境,带PE没有问题,应该没啥大问题。所以现在让人头疼的就一个事,尼玛怎么一句!BAT搞死机了……

发布了 https://github.com/chenall/grub4dos/releases/tag/for_UEFI
GitHub 上的是用 GCC4.8 编译的,应该没这些奇怪问题。
作者: sunsea    时间: 2023-3-13 08:17
本帖最后由 sunsea 于 2023-3-13 08:33 编辑
wintoflash 发表于 2023-3-11 20:21
发布了 https://github.com/chenall/grub4dos/releases/tag/for_UEFI
GitHub 上的是用 GCC4.8 编译的, ...

!BAT行为正常了,感谢!所以尼玛怎么换了个GCC版本死在!BAT上了真的奇怪……以及我一直好奇,启动pe难道不传minint参数么……
作者: wintoflash    时间: 2023-3-13 09:39
sunsea 发表于 2023-3-13 08:17
!BAT行为正常了,感谢!所以尼玛怎么换了个GCC版本死在!BAT上了真的奇怪……以及我一直好奇,启动pe难道 ...
启动pe难道不传minint参数么

当然是要传递的。但是在不指定的情况下可以根据扩展名自动判断:
  1.   /* winpe mode
  2.    * default:
  3.    *      OS  - no
  4.    *      VHD - no
  5.    *      WIM - yes */
  6.   if (nt_cmdline->minint[0])
  7.     bcd_parse_bool (hive, BCDOPT_WINPE, nt_cmdline->minint);
  8.   else
  9.   {
  10.     if (nt_cmdline->type == BOOT_WIM)
  11.       bcd_parse_bool (hive, BCDOPT_WINPE, "yes");
  12.     else
  13.       bcd_parse_bool (hive, BCDOPT_WINPE, "no");
  14.   }
复制代码

作者: sunsea    时间: 2023-3-13 15:33
wintoflash 发表于 2023-3-8 20:40
那就好。

这就有点奇葩了。得找熟悉GCC的埃及老哥研究一下。

还有挺好奇chainloader途径加载linux内核走的是什么传参方式,我这试论坛里有人发的StartOS死机了(不过影响不大,主力不用这个,而且有点老了),但是chainloader就一直可以……
作者: wintoflash    时间: 2023-3-13 18:58
sunsea 发表于 2023-3-13 15:33
还有挺好奇chainloader途径加载linux内核走的是什么传参方式,我这试论坛里有人发的StartOS死机了(不过 ...

目前 Linux 镜像就是标准的 PE 格式 EFI Application,使用 kernel 和 chainloader 启动方法是一样的。
  1. static int
  2. kernel_func (char *arg, int flags)
  3. {
  4.   int ret = chainloader_func (arg, flags);
  5.   if (ret)
  6.     kernel_type = KERNEL_TYPE_LINUX;
  7.   return ret;
  8. }
复制代码

只是加载 initrd 的方式不一样。
chainloader 是让 kernel 自己通过 UEFI Simple FileSystem Protocol 找到 initrd。所以只能找到 FAT 分区里面的 initrd。
initrd 命令是安装 LoadFile2 Protocol,通过这个协议把 initrd 提供给 kernel。好处就是只要 GRUB 能读到 initrd 就行。

那个 StartOS 可能是内核比较老,不支持通过 LoadFile2 读 initrd,结果找不到 initrd 爆 kernel panic 了。
作者: sunsea    时间: 2023-3-13 19:02
本帖最后由 sunsea 于 2023-3-13 19:04 编辑
wintoflash 发表于 2023-3-13 18:58
目前 Linux 镜像就是标准的 PE 格式 EFI Application,使用 kernel 和 chainloader 启动方法是一样的。
...

感谢解释!不过我自己有ntfs和ext的驱动所以也没问题了hhhh
作者: 2011whp    时间: 2023-3-14 20:09
意思是 内核版本6.2.1的 Archlinux, 不支持legacy启动了
(或者说 支持的话 提供了 两个vmlinuz ,不是二合一的了? )

以下是 个人 瞎猜vmlinux的开发,没有调用EFI Handover Protocol的语名了,或者说它已经是 efi字节码程序,不 是混合的了



作者: sunsea    时间: 2023-3-14 20:19
2011whp 发表于 2023-3-14 20:09
意思是 内核版本6.2.1的 Archlinux, 不支持legacy启动了
(或者说 支持的话 提供了 两个vmlinuz ,不是二 ...

legacy BIOS方式没有测试,我现在生产环境全是UEFI的。
作者: wintoflash    时间: 2023-3-14 20:44
本帖最后由 wintoflash 于 2023-3-14 20:52 编辑
2011whp 发表于 2023-3-14 20:09
意思是 内核版本6.2.1的 Archlinux, 不支持legacy启动了
(或者说 支持的话 提供了 两个vmlinuz ,不是二 ...

支持的,别瞎猜了。
从来就没有所谓"二合一"混合的vmlinuz。你下载的是32位的系统,它就是纯32位的,你下载的是64位的系统,它就是64位的。
只是头部有少量切换CPU工作模式的代码。
=====
wimboot/ntloader 这些它不是个完整的操作系统。
它当然也能切换CPU工作模式,但是切了之后 UEFI 启动服务之类的就炸了,就不能启 Windows 了,屁用没有,所以只能"二合一"。
作者: tsitian    时间: 2023-5-12 03:35
wintoflash 发表于 2023-3-14 20:44
支持的,别瞎猜了。
从来就没有所谓"二合一"混合的vmlinuz。你下载的是32位的系统,它就是纯32位的,你 ...

g4e能不能考虑加入对btrfs的支持,我的Linux系统都是安装在btrfs的subvolume上面的,应该如何使用g4e来启动,希望能够考虑考虑。btrfs的确非常好用的说,我还把win10装进了btrfs的子卷,用quibble也可以启动,目前运行都比较正常。
作者: wintoflash    时间: 2023-5-12 10:44
tsitian 发表于 2023-5-12 03:35
g4e能不能考虑加入对btrfs的支持,我的Linux系统都是安装在btrfs的subvolume上面的,应该如何使用g4e来启 ...

你 UEFI 启动 Linux,那 vmlinuz 和 initrd 都在 ESP 分区 FAT 文件系统里面。跟 btrfs 没关系。
作者: tsitian    时间: 2023-5-12 18:58
本帖最后由 tsitian 于 2023-5-12 19:00 编辑
wintoflash 发表于 2023-5-12 10:44
你 UEFI 启动 Linux,那 vmlinuz 和 initrd 都在 ESP 分区 FAT 文件系统里面。跟 btrfs 没关系。

我没有把vmlinuz和initrd安装在esp分区,而是放在btrfs分区下面的子卷里面了,目录结构是btrfs分区,子卷archlinux是arch系统,vmlinz和initrd在/archlinux/boot下面。同样debian系统在@debian子卷下面。启动的话用refind来直接引导。比如,
  1. menuentry "ARCH" {
  2.     icon /EFI/refind/icons/os_arch.png
  3.     volume linux
  4.     loader archlinux/boot/vmlinuz-linux
  5.     initrd archlinux/boot/initramfs-linux.img
  6.     options "root=/dev/disk/by-label/linux rw rootflags=subvol=archlinux initrd=archlinux\boot\amd-ucode.img"

  7. }
复制代码

作者: tsitian    时间: 2023-5-12 19:11
简单来说就是一个btrfs的subvolume就是一个系统,这样一个非常方便snapshot,利用btrfs的特性,秒备份和还原,而且整个硬盘的空间各个subvolume共享,整个硬盘就2个分区就够了,一个是ESP分区,一个是btrfs分区。winpe直接仍到btrfs分区也可以直接启动。我目前是用g4e启动quibble和refind,用quibble启动btrfs的win10,用refind启动btrfs子卷里面的各种linux发行版。我现在考虑能不能把refind拿掉,直接用g4e,直接启动linux,这样会少一步。
作者: nowayer    时间: 2023-12-14 10:05
提示: 作者被禁止或删除 内容自动屏蔽
作者: qhb    时间: 2024-11-6 22:31
赞赞




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