在历史记录中,我可以使用 iso_scan 或 loopback.cfg 来启动:
loopback loop $isofile
linux (loop)/casper/vmlinuz boot=casper iso-scan/filename=${isofile} verbose
initrd (loop)/casper/initrd*
或者
loopback loop "$isofile"
root=(loop)
configfile /boot/grub/loopback.cfg
loopback --delete loop
20iso_scan 报告它无法挂载 /dev/sr0 并且找不到(hdx,gpt)/...iso
但是 iso 显然在那里,否则我们无法加载 initrd 和 vmlinuz。
第二种方法,尝试使用 cd 本身自带的 loopback.cfg。但是,它失败了/init. line49: can't open /dev/sr0: No medium found
。
有什么想法吗?现在正确的做法是什么?
当我循环挂载它时,应该有一种方法可以直接提供压缩文件路径?为什么需要扫描 iso 并再次挂载?
更新
现在我对 livecd 启动过程有了更多的了解。
- 当我们调用linux和initrd之后,内核就拥有了所有权。因此,grub内部创建的所有回环设备对内核来说都是不可见的。
- 内核将重新启动一切,就像它第一次看到它们一样。
- squash mount 发生在内核中。此时内核可以看到真实磁盘上的实际 iso 文件。它可以挂载 iso 文件,然后解压 squashfs。
但是,引导加载程序仍应能够将 RAM 磁盘作为 initrd 命令提供给内核。理想情况下,引导加载程序应从 squashfs 创建 RAM 磁盘(环回不创建 RAM 磁盘)。然后内核可以将其作为设备安装。或者引导加载程序可以将整个 iso 注入 initramfs。某些工具已经可以部分执行此操作:例如 ipxe 的 initrd.magic 模块。grub 到目前为止还没有此功能,也不打算提供此功能。
答案1
我刚刚用过这个。它有一个数据分区 - data_nvme,位于 NVMe 驱动器上,带有文件夹 /ISO。获取正确的路径通常是一个主要问题。我现在更喜欢使用标签而不是 UUID 或设备来查找分区。
menuentry "Ubuntu 22.10 Kinetic amd64" {
set isofile="/ISO/kubuntu-22.10-desktop-amd64.iso"
insmod part_gpt
#rmmod tpm
search --set=root --label data_nvme --hint hd0,gpt5
loopback loop (${root})$isofile
linux (loop)/casper/vmlinuz boot=casper iso-scan/filename=$isofile toram
initrd (loop)/casper/initrd
}
下载 ISO 后,/ 分区已定义,并使用带有 NVMe 驱动器的 toram,让我在不到 5 分钟的时间内完成完整安装。安装到 USB3 闪存驱动器仍需 40 多分钟。
答案2
我认为这可能是重复的
然而,标准答案还有其他选择。
如果您在硬盘上创建一个小型的 FAT32 分区,比如大约 5 到 10 GB,您可以将 ISO 提取到其中并让 UEFI 启动 Ubuntu,而无需处理 GRUB。
您可能需要按 F9、F10、F12 或您的计算机用于选择启动盘的任何组合键来选择该选项。