Linux vDisk 文件启动插件

Ventoy 使用此插件来支持在物理机上直接启动安装了 Linux系统的 vdisk 文件 (vhd/vdi/raw 等)。这种模式的优点有:

  1. 系统是在真实物理机上运行,并不是在虚拟机里运行,没有性能损失。
  2. 同一个 vhd/vdi 文件既可以在 Legacy BIOS 模式下启动,也可以在 UEFI 模式下启动。
  3. Linux系统无需独占一个磁盘或者分区,相当于把一个完整的Linux系统放在一个文件里。 比如,你的主系统是 C 盘里的 Windows 系统,你可以在D盘里放一些
    Deepin、UOS、Ubuntu、Arch 等系统的 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)。
    注意:虚拟硬盘必须是全新创建的,不要使用之前用过的。

    注意,为了最终的 vhd/vdi 文件既能在 Legacy BIOS 模式下启动,也能在 UEFI 模式下启动。
    安装系统时,VirtualBox 必须设置为 UEFI 模式!
    安装系统时,VirtualBox 必须设置为 UEFI 模式!
    安装系统时,VirtualBox 必须设置为 UEFI 模式!


    !!! 注意 !!!
    有一些系统安装完之后还需要再额外安装一个 grub 的包才可以,否则最终的 vhd/vdi 文件只能在 UEFI 模式下启动,无法在 Legacy BIOS 模式下启动。
    对于这种,在前面表格最后的 "备注" 一栏有说明,没有特殊说明的就不需要。比如,对于 Deepin 系统,需要安装 grub-pc-bin_xxxx.deb 包。以 deepin-desktop-community-1010-amd64.iso 为例, 需要安装 grub-pc-bin_2.02.24.3-1+eagle_amd64.deb 这个包,它位于 ISO文件的 /pool/main/g/grub2/ 目录下,可以直接使用 dpkg -i 命令来安装。
    另外,如果缺少这个包,在运行下面的 vtoyboot.sh 脚本时也会打印一个提示信息。当然,如果你只需要在 UEFI 模式下启动这个 vdisk 文件,不需要在 Legacy BIOS 模式下启动,那就不需要管它了。

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

    下载到 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_grub.cfg 的说明,请参考 Ventoy 自定义菜单插件

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

menuentry "Boot My Linux VHD" {    
    set my_vdisk_path="/VhdDir/Ubuntu.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
}

在这个例子中,my_vdisk_path 被设置为 /VhdDir/Ubuntu.vhd.vtoy 你可以按照你实际的路径修改,(比如 set my_vdisk_path="/images/LinuxMint.vdi.vtoy")。
你不需要像 hd0/hd1 这样指定到具体哪个硬盘,因为脚本里会使用 search 命令去遍历所有磁盘搜索这个文件。
你只需要确保这个路径是唯一的即可。比如,你有一个 C:\VhdDir\Ubuntu.vhd.vtoy 同时还有一个 D:\VhdDir\Ubuntu.vhd.vtoy 这种情况可能会找错文件。
注意以下格式都是错误的:
set my_vdisk_path="(hd1,1)/VhdDir/Ubuntu.vhd.vtoy"
set my_vdisk_path="E:\VhdDir\Ubuntu.vhd.vtoy"
set my_vdisk_path="\VhdDir\Ubuntu.vhd.vtoy"

  • 使用其他 bootloader 启动 vDisk 文件

通过前面的说明我们知道,Ventoy 可以启动 Ventoy 所在的磁盘上的 vdisk 文件,也可以启动非 Ventoy 盘(本地磁盘)上的 vdisk 文件。 但是这两者都必须要通过 Ventoy 才可以启动。 实际上 vdisk 启动这个功能是可以独立出来的。 可以集成到其他 bootloader 中来启动,比如 grub4dos/grub2/rEFInd/Systemd-boot 等。
唯一的要求是 vdisk 文件所在的分区文件系统只能是 FAT32/NTFS/exFAT/XFS/Ext2/Ext3/Ext4/UDF 中的一种。使用方法如下:

================== i386-pc ======================
GRUB4DOS:
kernel /ipxe.krn vdisk=/MyVdiskDir/Deepin.vdi.vtoy
initrd /vdiskchain

GRUB2:
linux16  (hd0,1)/test123/ipxe.krn vdisk=/MyVdiskDir/Deepin.vdi.vtoy
initrd16 (hd0,1)/test123/vdiskchain


================== x86-64-efi ======================
GRUB2:
chainloader (hd0,1)/test123/vdiskchain vdisk=/MyVdiskDir/Deepin.vdi.vtoy

rEFInd:
loader /vdiskchain vdisk=/MyVdiskDir/Deepin.vdi.vtoy

Systemd-boot:
efi /vdiskchain vdisk=/MyVdiskDir/Deepin.vdi.vtoy

这里的 ipxe.krn 和 vdiskchain 是两个文件,需要从 https://github.com/ventoy/vdiskchain/releases 下载最新版本。 vdisk 参数和上面的 my_vdisk_path 参数是一样的含义和要求。

已知问题:
1. i386-pc (Legacy BIOS) 模式下,grub4dos/grub2 必须是用磁盘启动的才可以 chainload 成功,从光驱启动的无法 chainload 成功。