Linux vDisk 文件启动插件

Ventoy 使用此插件来支持在物理机上直接启动安装了 Linux系统的 vdisk 文件 (vhd/vdi/raw 等),支持 Legacy BIOS 和 UEFI 模式。
这种模式的优点有:
  1. 系统是在真实物理机上运行,并不是在虚拟机里运行,效率没有损失。
  2. Linux系统无需独占一个磁盘或者分区,相当于把一个完整的Linux系统放在一个文件里。
比如,你的主系统是 Windows 系统,在D盘里放着一些 deepin、Ubuntu等系统的VHD文件,想启动哪个选哪个,不用了就把VHD文件删除即可。

  • 支持的 vdisk 格式

  1. 固定大小的 vhd (注意只能是vhd, 不支持vhdx)
  2. 固定大小的 vdi
  3. Raw Disk 镜像格式

  • 支持的 Linux 发行版 (持续更新中)

发行版 测试 ISO Legacy BIOS UEFI 备注
理论上,其他使用 dracut/initramfstool/mkinitcpio 作为 initramfs 构建工具的发行版也支持。只是没有实际进行测试。

  • 使用说明

  1. 安装 Linux 系统到 vdisk
  2. 创建固定大小的 vhd/vdi,注意只支持静态大小的,不支持动态扩展类型的。然后把支持的 Linux 系统安装到 vhd/vdi 中即可。
    安装过程和普通安装没有任何差别,可以借助 VirtualBox 来完成(创建硬盘时可以选择 vdi或vhd)。


    注意,一般情况下,最后使用物理机启动vdisk时的BIOS模式,必须和安装系统时的BIOS模式相匹配。也就是说:
    如果使用虚拟机安装系统时是在 UEFI 模式下,则最后使用物理机启动时也必须在 UEFI 模式下。
    如果使用虚拟机安装系统时是在 Legacy BIOS 模式下,则最后使用物理机启动时也必须在 Legacy BIOS 模式下。

    当前很多电脑默认都是 UEFI 模式了,而 VirtualBox 默认不改的话是 Legacy BIOS 模式,这样会不匹配。VirtualBox 设置 UEFI 模式如下图所示:

  3. 在系统下执行 vtoyboot 脚本
  4. 安装完成并启动到 Linux 系统中之后,执行 vtoyboot 脚本。这一步是为了在系统中做一些处理,以支持Ventoy启动。
    vtoyboot 是配套 Ventoy 开发的一个项目,单独发布。从下面任意一个链接中下载压缩包即可。
    https://github.com/ventoy/vtoyboot/releases
    https://www.lanzoux.com/b01bqtjsf (蓝奏云)

    下载到 Linux 系统中,解压,然后以root权限执行里面的脚本 sudo sh vtoyboot.sh 脚本执行完之后,使用 poweroff 命令关机。
    注意 vtoyboot 会经常更新以支持更多的 Linux 版本以及修复 BUG,所以请使用最新版本。

  5. 拷贝到U盘,改后缀名为 .vtoy 然后用 Ventoy 启动
  6. 完成前面2步之后,就可以把 vdi/vhd 文件拷贝到 U盘中,重启电脑,然后通过Ventoy启动它了。
    为了便于识别和处理,这里统一要求把文件后缀名改为 .vtoy
    推荐保留原来的后缀名,同时增加一个 .vtoy 后缀。比如: CentOS7.vhd.vtoy   ubuntu20.04.vdi.vtoy   Manjaro.vhd.vtoy


  • 使用Ventoy启动本地硬盘上的 vDisk

上面的使用说明是针对把 vdisk 文件拷贝到 Ventoy U盘中启动的场景。也可以把 vdisk 文件放在本地硬盘中,使用 Ventoy 的自定义菜单来启动它。
关于自定义启动菜单的说明,请参考 Ventoy 自定义菜单插件

在 ventoy_grub.cfg 中增加如下一个菜单用于启动 vdisk 文件,只需要把 my_vdisk_path 设置为实际文件的绝对路径即可(从所在分区的根目录开始)。

menuentry "Boot My Linux VHD" {    
    set my_vdisk_path="/VHD/mylinux.vhd.vtoy"
    
    if search -n -s vdiskhd -f "$my_vdisk_path"; then
        vtoyboot_common_func "($vdiskhd)$my_vdisk_path"
    else
        echo "$my_vdisk_path not found"
    fi
}