先介绍一下背景,下面引用Ventoy官网的内容:

背景介绍

从相关文档中可以知道,Ventoy在启动时会基于ISO文件创建一个虚拟设备然后启动它。 但是这个虚拟设备仅仅是BIOS层面的(Legacy或者UEFI)。大多数情况下它只在启动阶段存在。 绝大多数现代操作系统的内核在启动之后都是使用它们自身的驱动来访问硬件,因此这个虚拟设备对于内核来说是不可见的。 一般情况下,ISO里面的系统起来之后会遍历所有的硬件设备(CDROM/USB/HD ...) 去寻找安装源。 但是在Ventoy启动的环境下是找不到的,因为没有这样一个实际的安装介质,是虚拟的设备嘛。但是系统内核不知道这个情况,它们不知道当前是 Ventoy使用虚拟设备引导起来的,并不是传统的物理光驱或者U盘引导起来的。所以,如果不做特殊处理的话,大部分ISO文件启动以后就会报找不到安装源的错误而停止。 因此,Ventoy必须做很多hook的工作,帮助内核找到、挂载安装源。其实就是告诉内核,当前是Ventoy从一个虚拟的设备引导起来的,你的安装源并不在常规的介质中,而是在XX硬盘的XXX.iso文件, 你把它挂载起来当做安装源就可以啦。。。。。 但是这个hook工作是非常枯燥而且麻烦的,因为系统种类实在太多而且有各种各样的特殊情况。

Ventoy Compatible 概念

实际上,Ventoy在启动之前,把相关的信息都保存在了运行时内存中(保留内存段),同时还提供了一个工具可以在系统下获取这些信息。 这样,操作系统调用一下这个工具就可以知道,当前是Ventoy环境启动的,而且还能详细知道是基于哪个磁盘的哪个ISO文件启动而来的。 这样,系统就可以直接去找到对应的ISO文件,挂载起来作为安装源就可以了。不需要再用常规的方式去寻找。 当然,如果是常规方式启动起来的,系统下调用这个工具是获取不到任何数据的,这种情况下就按照常规的启动步骤往下走就可以了。
因此,如果ISO里面的系统集成了这个工具,并且做了上述处理的话,对于Ventoy就很简单了,只需要做好这个虚拟设备就可以了,不用再费力做那些hook工作了。 另一方面,还有一个问题就是,就算ISO里面的系统做了这些工作,Ventoy怎么知道呢?因此Ventoy提供了几种方式让ISO文件来标识自己。

我把集成了这个工具并且做了上述处理的操作系统或者ISO文件称之为 "Ventoy Compatible" 的。

对于想要成为 Ventoy Compatible 的系统

    • 需要做得事情

系统发行版想成为 Ventoy Compatible 的话,需要做以下事情:

      • 1. 标记这个ISO文件是 Ventoy Compatible 的
      • 2. 启动之后检查并获取 Ventoy 保存在运行时内存中的信息
      • 3. 根据相关信息挂载对应的ISO文件作为安装源

 

详细说明请参考 文档手册 中的相关章节。

    • 示例脚本

这里提供了一个批处理和一个shell脚本供参考。脚本中说明了在系统下如何检查、获取相关信息,以及如何去挂载对应的ISO文件。

 

vtoydump 就是Ventoy提供的一个在系统下获取相关信息的工具。你可以从下面的链接中下载它的二进制文件和源代码。

git clone https://github.com/ventoy/vtoydump.git    or
git clone https://gitee.com/longpanda/vtoydump.git

关于 "Ventoy Compatible" 的详细说明,你可以参考 文档手册 中的相关章节。

操作系统下挂载ISO文件

  • Windows

从 Windows 8 和 Windows Server 2012开始,Windows 已经集成了直接挂载ISO文件的功能。利用 OpenVirtualDisk AttachVirtualDisk 接口实现。 因此对于高于此版本的Windows推荐使用vtoydump 工具来挂载。 对于早期的Windows版本,比如 Windows XP 或 Windows 7, 可以使用 imdisk 来挂载ISO文件。

  • Linux

Linux系统下有两种方式来挂载ISO文件。

    • 先挂载第1个分区,然后再挂载其中的ISO文件

如果系统支持直接挂载第1个分区(可能是exFAT/NTFS/XFS/EXT...)的话,你可以先挂载分区。然后再挂载里面的ISO文件就很简单了。

    • 利用device-mapper挂载ISO文件

ISO文件保存在U盘中,它可能是位于一段连续的空间,或者是几段不连续的空间中。 vtoydump 工具可以以dmesetup table的格式打印出ISO文件的所有范围段。
因此你可以使用 dmsetup 来创建一个device-mapper设备,这个设备直接对应这个ISO文件,然后再直接挂载这个设备即可。

ISO文件如何标记自己是 Ventoy Compatible 的

如果ISO文件是 "Ventoy Compatible" 的,则必须要有某种方式能让Ventoy知道才可以。 Ventoy一旦知道了这个ISO是Ventoy Compatible 的以后,就会只虚拟一个设备即可,不会做其他hook的动作。

这里提供了两种方式来标记一个ISO文件为 Ventoy Compatible 的,选择任意一种即可。

  • 方式 1

这是最简单的方式。
在ISO镜像根目录下放一个 ventoy.dat 或VENTOY.DAT 文件即可。 文件名必须全大写或者全小写。文件内容可以从 (ventoy.dat) 获取。注意这个dat文件不是放在U盘里,而是要放在ISO文件内部,就是说你需要重新生成ISO文件。

  • 方式 2

你可以利用ISO文件结构中 ”主卷描述符“ 中的 Publisher 或 Preparer 或 Application 字段。 在这三个字段任意一个当中包含固定的字符串 VENTOY COMPATIBLE 即可。
如果ISO文件是用 mkisofs 工具创建的话,其中 -publisher -preparer -appid 就是对应的选项。

 

上面是Ventoy官网的描述,通过描述,我们可以让我们的WinPE添加Ventoy Compatible支持,以便在使用Ventoy启动后挂载ISO镜像内容,后面就可以进行挂载ISO里面的外置程序了。

 

添加步骤:

添加vtoydump.exe到你的WinPE中

通过官网的介绍,我们可以直接去https://github.com/ventoy/vtoydump下载,按https://github.com/ventoy/vtoydump/tree/master/bin中的NT5、NT6分别对应你的WinPE类型,下载相应的exe文件

下载到vtoydump.exe后,直接放到WinPE的system32文件夹就行了。

在你的ISO中添加ventoy.dat

可以新建一个文本文件,文件名改成ventoy.dat,后面在使用Ventoy引导启动时就不会被主动注入驱动了。

修改PECMD配置脚本

修改你的pecmd.ini配置文件,添加以下内容:

//运行%WinDir%\System32\vtoydump.exe,并将 Ventoy 获取到的保存在运行时内存中的信息赋值给变量VentoyResult
EXEC*1 &&VentoyResult=!%WinDir%\System32\vtoydump.exe
//将变量VentoyResult的内容写入到%WinDir%\System32\VentoyResult.txt文本文件中
WRIT *c %WinDir%\System32\VentoyResult.txt,$+0,%&VentoyResult%
//返回 :\ 在变量VentoyResult左边起出现的位置,并将返回值赋值给变量CheckVentoyResult
LPOS &&CheckVentoyResult=:\,,%&VentoyResult%
//如果返回值CheckVentoyResult不等于0,就执行{}里面的步骤(如果发现是通过Ventoy引导启动的,返回值会是H:\这种,所以如果返回值包含了:\,就表明你的ISO是通过Ventoy启动的,此时就需要使用vtoydump.exe进行挂载ISO了)
FIND ! $%&CheckVentoyResult%=0,{
//挂载ISO镜像文件,并将返回值赋值给变量VentoyMountResult
EXEC*1 &&VentoyMountResult=!%WinDir%\System32\vtoydump.exe -m
//把变量VentoyMountResult写入%WinDir%\System32\VentoyMountResult.txt文本文件中
WRIT *c %WinDir%\System32\VentoyMountResult.txt,$+0,%&VentoyMountResult%
//接下来可以全盘扫描外置程序并加载了
LOAD \OP.INI
}

 

通过上面的PECMD命令,我们实现了挂载通过Ventoy启动的ISO镜像文件。

补充挂载检查步骤

通过上面的步骤,我们虽然实现了挂载ISO文件,但是如果挂载失败呢?那我们就需要进行下面的步骤了:

此处内容隐藏,登录后可见!立即登录  登录后请刷新页面!刷新

有一点要注意,NT5类型的WinPE貌似执行vtoydump.exe可能会获取失败,这里推荐使用imdisk挂载。

最后于 2021-01-02 10:28:28 被caocaofff编辑 ,原因:
收藏
分享
我的博客:cboot.org
最新回复 (0)
返回