V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
busier
V2EX  ›  程序员

Ventoy 引导工具如何做到实模式加载 iso,在保护模式依然可用的?

  •  
  •   busier · 177 天前 · 1705 次点击
    这是一个创建于 177 天前的主题,其中的信息可能已经有所发展或是发生改变。
    Ventoy 看文件结构似乎是 grub2 的魔改版本。

    正常的 grub2 虽然有 loopback 可以挂载 iso (甚至 ramdisk ),但在 grub2 实模式挂载的 iso ,一旦 win/linux 内核启动切换到保护模式后,grub2 在实模式挂载的 iso (甚至 ramdisk )都不会展现出来,除非系统内有对应的驱动程序去专门去访问这段内存及模拟驱动器。

    (在这里先预判一波:网上 grub2 启动 ubuntu 等 linux live 的 iso 镜像那种教程,grub2 里面加载 loopback 只是为了 grub2 在实模式读取 iso 内的 kernel 和 initrd 文件,loopback 对后续启动无用。真正的重点是传给 linux 内核的参数 iso-scan/filename 或 findiso ,这些参数指示 initrd 内的脚本去哪些路径搜索 iso 文件,进而在保护模式挂载 iso 文件,然后完成启动。所以说这还是在保护模式挂载的 iso ,一切都是正常操作,不在本次讨论范围。)

    这我的理解没错吧?

    那么 Ventoy 是如何实现在 win/linux 内核启动后的保护模式下,iso 依然成为模拟光驱可见的? win/linux 内应该不会预置对应驱动程序来对接模拟光驱的吧?

    Ventoy 作为一个 boot loader ,是不是相当于做到了“未认证的引导程序向系统内注入可执行代码”,也就是 UEFI Secure Boot 防范的内容?
    6 条回复    2024-05-30 16:58:48 +08:00
    seers
        1
    seers  
       177 天前 via Android
    我记得作者说过做了很多的 hook
    dode
        2
    dode  
       177 天前
    开启安全引导后,Ventoy 就用不了了呀
    sNullp
        3
    sNullp  
       177 天前
    > 那么 Ventoy 是如何实现在 win/linux 内核启动后的保护模式下,iso 依然成为模拟光驱可见的? win/linux 内应该不会预置对应驱动程序来对接模拟光驱的吧?

    我觉得这不是 Ventoy 做的。而确实是内核做的。
    alex8
        4
    alex8  
       177 天前
    @dode Y7000p 上个版本不行,刚发布的 1.0.98 可以安全引导了
    WuSiYu
        5
    WuSiYu  
       177 天前
    感觉还是像你说第三段说的 grub2 那样吧,只是这个配置过程被自动化了
    kuanat
        6
    kuanat  
       177 天前   ❤️ 2
    你的疑问是对的。一旦离开 UEFI/grub 之后,之前 ventoy 虚拟出来的光驱设备就不存在了。

    然后魔改 grub2 也是对的,只是如果你去看修改的代码 https://github.com/ventoy/Ventoy/tree/master/GRUB2/MOD_SRC/grub-2.04 会发现这些改动都是表面的,跟启动机制没有关系。

    所以 ventoy 并不是用 grub2 loopback 加载 iso 完成引导的。

    “除非系统内有对应的驱动程序去专门去访问这段内存及模拟驱动器”这句话不完全对,Win/Linux 内核都有 loopback 加载机制,也就是你说的“驱动”。真正的问题,去哪里加载。这里需要的是逻辑意义上的地址,不管它背后是内存还是硬盘文件。

    如果你大致浏览一下 ventoy 的代码,肯定会注意到 vtoyjump 这个与众不同的名字,其他目录要么是一些基础功能,要么是 ventoy 的功能。另外 ventoy 是可以输出 log 的,你会在日志中看到 vtoyjump 相关功能的调用。

    以下是我根据之前的印象总结的,我估计原理应该没问题,细节可能有出入。

    如果是引导 Linux ,会首先引导 ventoy.cpio ,完成虚拟光驱初始化之后再链式引导 initrd 。

    如果是引导 Windows ,会用 vtoyjump 替代 Windows 的引导文件(大概名字是 winpeXXX 的一个文件),然后原版在内存中保留一份副本。(这个“替代”是 overlay 的意思,并非修改原始文件,相关的 injection 功能也被 ventoy 做成了插件)此时还处于 grub 阶段,以你描述的 loopback 方式引导 boot.wim ,完成内核初始化。此时 grub 阶段虚拟的光驱设备就访问不到了。

    原本下一步是引导 winpe 进入安装程序,这时被 vtoyjump 替代,vtoyjump 利用 NT 内核 API 加载原始 iso 成为 loopback 设备。 之后 vtoyjump 再引导 winpe 那个程序,就进入正常安装过程了。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   988 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 19:44 · PVG 03:44 · LAX 11:44 · JFK 14:44
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.