|
ventoy, grub2, grub4dos 创建的虚拟盘,都是 bios(uefi) 层面的,系统启动后这个盘都是不存在的。它们之间的区别不大。
https://www.ventoy.net/cn/doc_grub2boot.html
ventoy 有个 grub2 模式,这个模式下不会创建虚拟光驱,所以如果你仔细看过 ventoy 的文档的话,就不会把注意力放在虚拟光驱上而被误导了。
首先,你得搞清楚什么是文件系统。文件系统是一种抽象数据类型,用它组织硬盘上的数据,可以让文件的读取更加容易。
假设一个文件 (/fuck.iso),它的数据依次保存在磁盘(hd0,1)扇区 128,长度 5 个扇区,磁盘 65536,长度 100 个扇区。
在 grub 下,可以用 (hd0,1)128+5,65536+100 表示,这就是碎片表的形式。也可以用 (hd0,1)/fuck.iso 来表示。
linux 系统启动,你只要关注两个文件:内核 (典型文件名是 vmlinuz/bzImage) 和初始内存文件系统 (典型文件名是 initrd/initramfs)。
对于启动 Linux ISO,你应该关注两个过程:1. 信息的传递 2. ISO 在系统内的挂载
1. 信息的传递
为了在 Linux 中挂载 ISO,我们需要在 bootloader 中采用某种方法把 ISO 的信息传递给 OS,这样 OS 才能找到这个 ISO。
传递信息的方法有很多种:
(1) kernel 命令行 (2) ACPI / SMBIOS / UEFI环境变量 等固件创建的信息表 (3) 直接简单粗暴地写在物理内存某个位置 (4) 把信息写进 initrd 里面。
2. ISO 的挂载
Linux 挂载 ISO 一般有两种方式:
(1) 直接根据路径挂载,mount /xxx/xxx.iso,这个地球人都知道,所有的 Linux 都支持这个。但是,这种方式读取 ISO 是要有文件系统支持的。grubfm 用的就是这种形式,因此不能挂载 OS 不支持的文件系统。
(2) 根据前文所说的碎片表的方式挂载,带 device-mapper 的 Linux 支持这种方式。由前文可知,碎片表这种形式跳过了文件系统这一抽象层,因此是与文件系统无关的,即使 ISO 放在 UD 区里面,只要知道它的碎片表,也是能挂载的。ventoy 用的就是这种方式,因此可以挂载各种文件系统上的 ISO。
由此可见,采用方式(1),必然会导致某些 Linux 下不能挂载 NTFS 上 ISO。这是选择技术路线的时候就决定了的结果。你孵化一个鸡蛋,最终得到的生物肯定不会游泳。
方法(2)看似美好,实则不适合 grubfm。首先,各种 Linux 都不会自动的根据你传递的碎片表信息来挂载 ISO。你必须在 bootloader 阶段修改 initrd,把你的脚本插入 initrd,劫持启动过程,在你的脚本里面挂载 ISO。有些 Linux 甚至没有 device-mapper,那你还要自己造轮子,弄个可以根据碎片表挂载 ISO 的程序,然后把它注入 initrd 中。你要对每一个发行版进行适配,保证挂载 ISO 的时机刚刚好,不能太早也不能太晚。太早的话,磁盘还没加载,找不到 ISO。太晚的话系统已经认定没有读取到数据,直接报错。总之,工程量很大。 |
|