无忧启动论坛

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

在没有 UEFI 的主板上通过 GRUB4DOS 引导 UEFI 的方法

[复制链接]
跳转到指定楼层
1#
发表于 2016-10-30 21:24:46 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 dnns 于 2016-10-30 21:26 编辑

Boot directly from grub4dos to UEFI using Clover!
Clover is a later revision of Tianocore. Both are 'firmware in RAM' replacements for UEFI firmware.
It allows you to boot in MBR\CSM mode and then run Clover which acts as a 'pseudo-UEFI boot manager', allowing you to boot to a UEFI OS from an MBR\CSM boot.

I would like to add this to the CSM menu of Easy2Boot so that users would not have to reboot the system and choose the UEFI: xxxxxx  boot option to boot from the E2B drive (when using .imgPTN image files).

First, I made a FAT32 USB Flash drive using BootDiskUtility.exe. This is a Windows tool that makes a Clover-bootable USB drive for you. Having done this, I found it would not boot under RMPrepUSB's QEMU (which doesn't support 64-bitness and just rebooted) or VirtualBox (text mode menu only) but did boot on a real system to the full GUI menu (see piccy below) - but only on a USB 2.0 port, Clover does not load on my Z87's USB 3.0 ports.

When is EFI not EFI?

Another important (and confusing!) point to note is that 'EFI booting' means MBR booting in 'Clover-speak' and UEFI booting means UEFI booting. If you see a Clover menu option to EFI-boot from a drive - it means MBR\CSM-boot!


This is the 'expected' full-GUI Clover Menu - select the UEFI option for UEFI booting as shown.


This is the text-mode screen I got!

Under VBox, I only got the 'text-mode' screen after making a USB Flash drive using BootDiskUtility.exe to make the USB drive. However, if I ran the USB drive on a real system, I got the correct GUI menu.

I later found that by pressing the 7 key after the first 2 seconds when booting from VBox, I managed to get the correct GUI menu!

To cut a long story short (essential data about Clover is hard to find!), here is how the Clover boot-chain works...

Master Boot Record (MBR)

First in the boot chain, we have the MBR. This is a normal MBR with a partition table, but the code in it seems to be 'special' (see PBR below for why I think this).

The MBR code can be found in a selection of boot0xxx files. You need to replace the boot code in your USB drive's MBR with the boot code from one of these files (but not the partition table).

The MBR code seems to look for and boot a Clover PBR. I found these files for the MBR code:

boot0af - looks for the active partition PBR
boot0ss - 'scan-signature' for AF type - MAC OS extended - seems to work best - no Active ptn needed.
boot0md - multiple drives - searches various drives for an HFS+/MAC OS extended partition - it seems to need the partition to be flagged as Active though!

see here for more (unclear) details! boot0ss still seems to boot from a FAT32 partition the best though!

Partition Boot Record

Moving on to the PBR - this code also seems 'special' in that we cannot just use chainloader ()+1 to boot from it in grub4dos. It seems we MUST go from the Clover MBR code to the Clover PBR code. Therefore both MBR code and PBR code are inter-dependent.

Again, various different Clover PBR code versions are available, these are prefixed as boot1xxx - the PBR code must be patched from byte 3 to byte 86 decimal. In the files produced by the BootDiskUtility, I had these files:

boot1f32 - understands the FAT32 filesystem
boot1f32alt - as above but waits for a key press for 2 seconds
boot1h - understands the HFS+ filesystem for MACs
boot1h2 - as above but waits 2 seconds for a key press

I used boot1f32alt for my experiments. See here for more PBR details.

The next stage in the boot chain is the file that is loaded by the PBR code. By default, this is a file in the root and is called boot.
boot - (default) Clover, recent or testing version - rumoured to be the same as boot6 in released versions
boot2 - Chameleon
boot3 - Clover 32-bit, tested and working version
boot6 - Clover 64-bit, tested and working version
boot7 - Clover 64-bit with BiosBlockIO driver that works with any controller supported by the BIOS.
Now, here we have a FUNDAMENTAL FLAW (did you spot it?) - the default boot file is boot but Windows uses a folder called boot to hold it's boot files - we cannot have both a file and a folder with the same name on a FAT32 partition! Great thinking guys!

So, assuming I must keep the \boot Windows folder, I had to press 6 or 7 on a real system  to get it to boot to Clover. Eventually I found a way around this though, the PBR code had an ASCII string of
   BOOT<space><space><space>
near the beginning of the code. I then found that if I modified this to
   BOOT7<space><space>  
it loaded the \boot7 file automatically! I am guessing that when a user presses 7 manually, it just adds the ASCII code for 7 to the end of the 'BOOT' string in memory, and then tries to load that file.

More Files!

Once the \boot(n) code runs, it loads up the rest of Clover from the \EFI\CLOVER folder starting off with
CloverIA32.efi or CloverX64.efi or CloverGUI. Note how these files have the .efi file extension but actually run in MBR mode, whereas normal files such as Microsoft bootx64.efi and bootia32.efi files have the same file extension but run in UEFI mode! Confusing huh?

It then accesses more files under the \EFI\CLOVER folder - see here for more details.

Putting it all together

So after all this - here is my boot chain that works for 64-bit UEFI Windows 8 booting from a single FAT32 partition:

MBR (using boot0md code) ->  PBR (using modified boot1f32alt code) -> \boot7 -> \EFI\CLOVER\CloverX64.efi  ->  Clover menu - \EFI\boot\bootx64.efi ---> Windows UEFI boot.

However, I found that if I chainloaded to /boot0md or /boot0ss in grub4dos, as long as the PBR  had the Clover code in it, it would boot (the md version also needed the partition to be Active too). This meant I can boot to grub4dos in MBR mode to the grub4dos menu and then, from that menu, run Clover - at last!

Grub4dos

So here is my current grub4dos menu for booting directly to UEFI via Clover from grub4dos:
Note it is for FAT32 only and has not been tested on linux, only Windows 8.1 x64 so far.

iftitle [cat --locate="FAT32" --length=10 --skip=0x50 ()+1 > nul] Run Clover UEFI Boot Menu\n Run this if you wish to use Clover to UEFI boot
set CL=0
## boot7 is default boot file
cat --locate="BOOT7" --length=10 --skip=0x58 ()+1 > nul && set /a CL=%CL%+1 > nul
if "%CL%"=="1" echo Information: Clover is already installed to the PBR
## configfile /menu.lst
echo ffffffffff > (md)0x350+1
dd if=(hd0,0)+1 of=(md)0x350+1 > nul
dd if=()/clover/boot1f32alt7 of=(md)0x350+1 skip=87 seek=87 bs=1 > nul
dd if=()/clover/boot1f32alt7 of=(md)0x350+1 count=3 bs=1 > nul
#cat --hex (md)0x350+1 && pause
if not "%CL%"=="1" cat --locate="SYSLINUX" --length=10 --skip=0x2 ()+1 > nul && pause PROBLEM: SYSLINUX PBR DETECTED - Cannot install Clover to PBR... && configfile /menu.lst
if not "%CL%"=="1" dd if=(md)0x350+1 of=(hd0,0)+1 > nul && pause --wait=2 PBR updated with Clover boot code
chainloader /clover/boot0ss || chainloader /clover/boot0md || chainloader /clover/boot0af

# User can press 2 for 3 for 32-bit UEFI, 6 for 64-bit UEFI or 1 for Chameleon - within 3 seconds
# boot0md gives a boot0 message and is slower - boot0ss is silent with no message

It needs a bit more work and tidying up.

boot1f32alt7 is the modified PBR 512-byte file which will load \boot7 instead of \boot.
The grub4dos menu code works by permanently installing the Clover PBR code into the PBR (it must be FAT32 and it must not have syslinux in the PBR as I assume that if syslinux is in the PBR, it needs it in order to boot to linux - overwriting it would prevent it from booting via syslinux in MBR mode!)
I also moved the boot0xx and boot1xx files to a \Clover folder to keep it tidier.
The user can still press 2, 3 6 or 7 to boot to \boot2, \boot3, \boot6 or \boot7 as these are (currently) still in the root of the FAT32 partition (Edit: in Clover_Pack 002 only boot6 and boot7 are present!).

It would be nice to be able to run syslinux in MBR-bot mode (see below for how I got this to work too).

I now need to test this out on different platforms and different scenarios - hey ho...

A good source of info on Clover is here.



P.S. In later versions, I first save the current PBR into a file using grub4dos code at the start of the menu.lst file. Then, to boot to syslinux, I just use  'chainloader /PBR.bin' to boot using the code that was in the PBR. In this way I can boot to the syslinux code that was in the PBR before it was replaced by Clover. The \PBR.bin file must already exist on the USB drive and must be 512 bytes or longer if FAT32 (for NTFS it needs to be approx. 1K or larger).

# backup PBR if it does NOT contain Clover boot code
cat --locate="BOOT7" --length=10 --skip=0x58 ()+1 > nul || dd if=()+2 of=()/PBR.BIN > nul



# boot to syslinux using the PBR.BIN file if it contains syslinux

cat --locate="SYSLINUX" --length=10 --skip=0x2 /PBR.BIN > nul && chainloader /PBR.BIN && boot

You can obtain the Clover files by downloading the MPI Tool Pack for Easy2Boot.

http://rmprepusb.blogspot.jp/201 ... ub4dos-to-uefi.html

https://clover-wiki.zetam.org/What-is-what#Directory-structure
2#
发表于 2016-10-31 08:16:55 | 只看该作者
本帖最后由 parsons 于 2016-10-31 08:26 编辑

Clover 看不到我電腦的任何儲存控制器
話說回來 , 較新儲存控制器(包括 USB)的電腦則多半已具備 UEFI

通过傳統 BIOS 的 \BOOT\BCD 引导 Clover 轉 UEFI
http://bbs.wuyou.net/forum.php?m ... p;extra=&page=1

点评

朋友. 这是就是提取老外发出来的 boot 文件打包了下 iso 去了后缀好吧. 要是不信 你可以在根目录下 EFI 文件里 新建个 CLOVER 文件 然后里面放 CLOVERX64.efi 和 CLOVERIA32.efi 你看看. 随便你放什么 efi 文件.  详情 回复 发表于 2016-10-31 17:38
回复

使用道具 举报

3#
 楼主| 发表于 2016-10-31 17:38:42 | 只看该作者
parsons 发表于 2016-10-31 08:16
Clover 看不到我電腦的任何儲存控制器
話說回來 , 較新儲存控制器(包括 USB)的電腦則多半已具備 UEFI

朋友. 这是就是提取老外发出来的 boot 文件打包了下 iso 去了后缀好吧.
要是不信
你可以在根目录下 EFI 文件里 新建个 CLOVER 文件 然后里面放 CLOVERX64.efi 和 CLOVERIA32.efi 你看看. 随便你放什么 efi 文件. 只要对应 64 32 位. 他启动的就是那个 efi 文件. 这是搬运人家文件打包而成的. 不是源码编译的. 上面就已经清楚说明说法了. 原理是 Duet ( Boot Maintenance Manager -> Boot from file -> UEFI_DUET -> efi -> Shell -> Shell.efi ) 模拟 bios

这个改回来的文件的启动速度是不敢恭维了. 只适合拿来安装系统的时候将就用用. 并不适合调用. 你不信可以留心看启动时候会出现那些 1-7 的数字. 然后等很久找不到  CLOVER X64 IA32 的 efi 才会自动进 虚拟 bios 的. 想再快点也要按 F12 啊. 他们这些拿来也不注明出处的. 哎..
回复

使用道具 举报

4#
发表于 2016-10-31 18:42:41 | 只看该作者
本帖最后由 parsons 于 2016-10-31 19:05 编辑

驗證:
我在正常 win10 14939 使用 BootDiskUtility.exe 自動下載及自動安裝 CloverISO-3859.zip 到 USB
USB 不再有任何更動
成功從没有 UEFI 及有 UEFI 的主板上通过 GRUB4DOS 引导 UEFI

点评

我没说是不成功. 我只不过说不效率而已. 如果他指向默认的 BOOTX64.EFI 或者 BOOTIA32.EFI 那显示那 1-7 的数字也是可以接受的. 当然了. 也可以编译个跳转用的 EFI 替代他默认的. 但是效果都是不太理想的. 因为毕竟  详情 回复 发表于 2016-10-31 19:05
回复

使用道具 举报

5#
发表于 2016-10-31 19:02:39 | 只看该作者
BootDiskUtility.7z (868.27 KB, 下载次数: 9)
CloverISO-3859.7z.001.7z (1 MB, 下载次数: 2)
CloverISO-3859.7z.002.7z (1 MB, 下载次数: 3)
CloverISO-3859.7z.003.7z (1 MB, 下载次数: 2)
CloverISO-3859.7z.004.7z (1 MB, 下载次数: 1)
CloverISO-3859.7z.005.7z (1 MB, 下载次数: 1)
CloverISO-3859.7z.006.7z (1 MB, 下载次数: 1)
CloverISO-3859.7z.007.7z (1 MB, 下载次数: 1)
CloverISO-3859.7z.008.7z (792.82 KB, 下载次数: 1)

回复

使用道具 举报

6#
 楼主| 发表于 2016-10-31 19:05:55 | 只看该作者
parsons 发表于 2016-10-31 18:42
驗證:
我在正常 win10 14939 使用 BootDiskUtility.exe 自動下載及自動安裝 CloverISO-3859.zip 到 USB
...

我没说是不成功. 我只不过说不效率而已. 如果他指向默认的 BOOTX64.EFI 或者 BOOTIA32.EFI 那显示那 1-7 的数字也是可以接受的. 当然了. 也可以编译个跳转用的 EFI 替代他默认的. 但是效果都是不太理想的. 因为毕竟他一共有2次2秒的等待. 加起来就是4秒了. 我都说了. 适合装机时候凑合用用. 不太适合直接调用给旧版主机支持 EFI 直接引导进入系用来用. 因为那里加起来都去了 最少4秒 但一般都肯定5-6秒以上 到 10多秒.  那就是 5-10多秒的时间才到引导系统. 那还不如直接传统 MBR 启动速度. 那就失去了引导系统的意义了. 只剩下维护或者安装或者测试系统时候用. 还是 Duet 源码编译个实际点.
回复

使用道具 举报

7#
发表于 2016-10-31 19:49:10 | 只看该作者
可以使用 bootice 將沒有2秒延遲的 boot1f32 恢復到 pbr
MBR (using boot0af code) ->  PBR (using boot1f32 code) -> \boot (是 boot7 改名)

点评

看来你还是没明白我的意思. - - http://www.tianocore.org/ 看完估计你就明白了. CLOVER 虚拟 BIOS 就是用这个项目的源码 里面的 DuetPkg 根本就不需要什么工具. 就可以通过编译生成你所需要的虚拟 BIOS 了. 而  详情 回复 发表于 2016-10-31 20:24
回复

使用道具 举报

8#
 楼主| 发表于 2016-10-31 20:24:05 | 只看该作者
parsons 发表于 2016-10-31 19:49
可以使用 bootice 將沒有2秒延遲的 boot1f32 恢復到 pbr
MBR (using boot0af code) ->  PBR (using boot1f ...

看来你还是没明白我的意思. -  -

http://www.tianocore.org/ 看完估计你就明白了. CLOVER 虚拟 BIOS 就是用这个项目的源码 里面的 DuetPkg 根本就不需要什么工具. 就可以通过编译生成你所需要的虚拟 BIOS 了. 而且你可以通过修改源码增减功能等等. 上面所说的只能面向一些普通用途的. 当然了. 数字 1-7 估计那些纠结的人也是不能接受的了. 再则就是 要自动跳转回默认 BOOTX64 BOOTIA32 还要编译个跳板. 那搞那么多的事情还真不如源码编译几句命令方便. 关键就在这里而已.

CLOVER 的简单顺序是 通电 - boot文件引导 虚拟 BIOS - 跳转 CLOVER EFI 如果没有 启动 进入 虚拟 BIOS
如果通过自行编译 EFI 替换 CLOVER 的 EFI 可以  在 CLOVER EFI 后跳转默认 BOOTX64 BOOTIA32 (相对就臃肿了而且效率也低了) 不适合替代 BIOS 跳转 EFI 用 每次需要手动或者 做跳转.就好像你开始说的 打包了 ISO 就多了更多的顺序.  GRUB4DOS - MAP ISO - 引导 ISO - boot文件 - 虚拟 BIOS 手动选 EFI 文件. 不觉得复杂吗? 当然了. 没能力搞 EDK2 源码. 可以通过编译 EFI 替换 CLOVER 的 EFI 然后通过 conifg 文件制定引导的 EFI 文件名和路径. 当然也可以像 CLOVER 那样界面化. 但还是不适合直接替代 BIOS - 引导 EFI 引导 系统这样的用途.


但是最理想的呢?
通电 - boot文件可以更名不冲突 boot文件夹 -默认 BOOTX64 BOOTIA32 - 引导系统. 全程无需手动的. 而且时间很短. 很效率.
回复

使用道具 举报

9#
发表于 2016-10-31 21:43:11 | 只看该作者
我目前的狀態正是:
通电 - boot文件更名不冲突 boot文件夹 -默认 BOOTX64 - 電腦 5 個系統引导菜單出現 (包含 BIOS 及 UEFI), 很效率.
但是中文出現亂碼 , 不影響啟動

点评

好吧. 还是请你看清楚点内容. 你现在通过 boot 文件 引导后 是默认引导是 boot x64 ai32 吗? 挑到这么明白. 应该懂了吧? 至于不冲突文件名 这个打包了 iso 后有必要理会吗? 打包了 iso 根本就不需要理会 boot 文件名  详情 回复 发表于 2016-10-31 22:45
回复

使用道具 举报

10#
 楼主| 发表于 2016-10-31 22:45:57 | 只看该作者
本帖最后由 dnns 于 2016-10-31 22:47 编辑
parsons 发表于 2016-10-31 21:43
我目前的狀態正是:
通电 - boot文件更名不冲突 boot文件夹 -默认 BOOTX64 - 電腦 5 個系統引导菜單出現 ( ...


好吧. 还是请你看清楚点内容. 你现在通过 boot 文件 引导后 是默认引导是 boot x64 ai32 吗? 挑到这么明白. 应该懂了吧? 至于不冲突文件名 这个打包了 iso 后有必要理会吗? 打包了 iso 根本就不需要理会 boot 文件名了. mbr pbr 也都不重要了. 或者打包成 img 也是可以的. 关键是. 你是通过 grub4dos 做的跳板.  grub4dos mbr - grub4dos - map iso - 引导 - 进虚拟 bios 就连默认的 boot x64 ai32 也需要手动选择 ? 对吧? 用过用 CLOVER 就是 图形界面下选择. (已经简化说明好多步了)

自行编译是直接通过 boot mbr - boot - 虚拟 bios 界面不显示当后面的 efi 存在的话直接 引导 boot x64 或 ai32 的 efi
回复

使用道具 举报

11#
发表于 2016-10-31 23:58:19 | 只看该作者
默认引导是 CLOVERX64.efi
我ˋ是直接將 Windows 的 BOOTX64.efi 改名成 CLOVERX64.efi

点评

所以嘛. 就跟我说的. 一直要做大堆跳板嘛. 这样每次还要改名改名多麻烦啊. 你拿 GRUB2 编译个超小的带 chain 模块的 efi 直接 search -n -s -f /efi/boot/bootx64.ef 然后 chainloader /efi/boot/bootx64.efi 然后 b  详情 回复 发表于 2016-11-1 01:01
回复

使用道具 举报

12#
 楼主| 发表于 2016-11-1 01:01:34 | 只看该作者
parsons 发表于 2016-10-31 23:58
默认引导是 CLOVERX64.efi
我ˋ是直接將 Windows 的 BOOTX64.efi 改名成 CLOVERX64.efi

所以嘛. 就跟我说的. 一直要做大堆跳板嘛. 这样每次还要改名改名多麻烦啊. 你拿 GRUB2 编译个超小的带 chain 模块的 efi 直接 search -n -s -f /efi/boot/bootx64.ef 然后 chainloader /efi/boot/bootx64.efi 然后 boot 把. 就这个替代 你 CLOVERX64.efi 那你以后就不用改名了. 要选其他 EFI 的时候 你一直按 F12 再选.

但还是建议自己编译定制个吧. 一大堆跳板. 硬件再好都起码浪费个 4-5秒了哪怕你 mbr pbr 都不用 cd . 但既然要用到这种方法的老机器. 硬件都好不到哪里去了.
回复

使用道具 举报

13#
发表于 2016-11-1 07:42:57 | 只看该作者
我看出你想表達的意思了
你熟悉编译定制

一般稱 BIOS/UEFI 雙啟 , 是指按 F12 F2 ... 等進 BIOS , 然後選擇 BIOS 啟動或 UEFI 啟動
CLOVER 能在不進 BIOS 情況下 , 直街選擇 BIOS 啟動或 UEFI 啟動
我要的就是這個功能 , 免得每次都得進 BIOS , 才能更換啟動模式

点评

对了. 到点上了 :) 而这问题其实不关系到熟悉编译和不熟悉编译. 当然. 如果要牺牲那么一点点启动时间. 但还是得做跳转. 又或者把引导直接交给 CLOVER 懂编译. 当然是推荐 edk2 的 duetpkg 重新来了. 不懂但有点毅  详情 回复 发表于 2016-11-1 15:51
回复

使用道具 举报

14#
 楼主| 发表于 2016-11-1 15:51:07 | 只看该作者
本帖最后由 dnns 于 2016-11-1 15:55 编辑
parsons 发表于 2016-11-1 07:42
我看出你想表達的意思了
你熟悉编译定制


对了. 到点上了 :) 而这问题其实不关系到熟悉编译和不熟悉编译. 当然. 如果要牺牲那么一点点启动时间. 但还是得做跳转. 又或者把引导直接交给 CLOVER

懂编译. 当然是推荐 edk2 的 duetpkg 重新来了. 不懂但有点毅力也可以参考 clover 的 clover.dsc.

但如果比较懒的也可以直接做跳板嘛. 反正习惯了用 g4d 喜欢封 iso 还是 img 都随你选择了. 但是在乎体积又或者嵌入式. 还是选择 grub2 + sfs 相对体积会更小 又或者 lzma 也不错. 其实也没多少事的. 只要一个跳转的 bootx64 bootia32 的 efi (或者 efi shell + startup) 替代原来的 clover efi 而已. 这样就能省去手动选择. 又或者有点点 linux 编译 基础 都可以直接修改 clover 源码编译个自己适用的. 不过可能真是编译个体积小的 grub2 efi 做跳板对大家相对来说更简单吧. 不介意默认就叫 cloverx64 cloveria32 efi 的那就更加省事了. 直接改名你的 efi 引导工具为这个. 就搞定了. 但是 3 和 6 这个. 好多强迫症接受不了吧. 哈哈.

不过 pbr boot1f32 还是改改引导文件名吧  https://github.com/Clover-EFI-Bo ... HFS/boot1f32.s#L193  :)

但当你大致看了遍 clover 源码. 你可能会觉得. 这不是 edk2 模板吗? 怎么叫 clover 了.
回复

使用道具 举报

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

本版积分规则

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

闽公网安备 35020302032614号

GMT+8, 2024-11-25 09:34

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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