20.04 从 GRUB 菜单启动 .iso

20.04 从 GRUB 菜单启动 .iso

我正在尝试从 GRUB 启动 Ubuntu .iso 映像。在Full Circle杂志 #157 第 61 页中,他们描述了如何执行此操作。但它不起作用。

我编辑/etc/grub.d/40-custom并添加了以下内容......

# Full Circle #157, page 61
menuentry "Ubuntu 20.04 ISO" {
     insmod part_gpt
     insmod ext2
     set root=(hd0,gpt7)
     set isofile="/ubuntu-20.04-desktop-amd64.iso"
     loopback loop $isofile
     linux (loop)/casper/vmlinuz boot=casper iso-scan/filename=$isofile noprompt noeject
     initrd (loop)/casper/initrd
}

我的 Ubuntu 根目录位于 /dev/sda7。

我的 .iso 文件位于 /。

当我尝试启动 .iso 时出现的错误是...

disk hd0,gpt7 not found
no server is specified
can't find command noprompt
you need to load the kernel first

在此处输入图片描述

关于如何实现这个功能你有什么想法吗?

答案1

启动 HDD 上的 ISO 文件(包括 20.04)

用于引导 ISO 的基本 GRUB 环回菜单项是:

menuentry "isoname ISO" {
    set root=(hdX,Y)
    set isofile="/[path]/[name].iso"
        loopback loop $isofile
        linux (loop)/casper/vmlinuz boot=casper iso-scan/filename=$isofile --
        initrd (loop)/casper/initrd
}
  • hdX磁盘在哪里?Y是 ISO 位置的分区号。

  • [path]是 ISO 文件的路径,[name]是 ISO 文件的名称。

  • 允许多个 ISO 文件,每个 ISO 文件需要一个或多个菜单项。(每个 ISO 可以有多个持久文件)。

持久性(可选)

  • 如果我们想要一个持久的操作系统,请将该词添加Persistent到 GRUB 菜单项中(通过/etc/grub.d/40-custom)。

  • 如果使用持久分区,请将其设为 ext4,并将其标记casper-rw为 19.10 和以前的 ISO 文件。

  • 对于 20.04 ISO 文件,标记持久分区writable

  • 只有一个持久分区每个驱动器允许

  • 如果使用持久文件,每个 ISO 都可以拥有自己的持久性。

  • 每个 ISO 可以有一个writable(或casper-rw)最大 4GB 的文件和一个home-rw最大 4GB 的可选文件。

  • 持久文件必须位于FAT32 分区

  • 如果使用多个持久性文件,则必须指定持久性路径。只需要持久性文件夹的唯一名称。每个文件夹一个 casper-rw/writable 文件和一个 home-rw 文件。

GRUB 2.04 解决方法

  • Ubuntu 18.04 及之前的版本使用 GRUB 2.02 进行启动。19.10 及之后的版本使用 GRUB 2.04 进行 UEFI 模式启动。GRUB 2.04 在 UEFI 模式下启动 ISO 文件时会出现问题。

  • 在 GRUB 2.04 UEFI 模式下启动 ISO 文件的解决方法是在第一个菜单项之前rmmod tpm添加:/boot/grub/grub.cfg

    export linux_gfx_mode
    rmmod tpm
    menuentry 'Ubuntu efi' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-simple-79a50dba-9300-4c89-b7e8-887651e746c9' {
    
  • 如果主机系统是 19.10 之前的版本,则应该使用 GRUB 2.02,不需要解决方法。

最终的菜单项可能如下所示:

menuentry "Ubuntu 20.04 ISO" {
    rmmod tpm
    set root=(hd0,3)
    set isofile="/isos/ubuntu-20.04-desktop-amd64.iso"
        loopback loop $isofile
        linux (loop)/casper/vmlinuz boot=casper iso-scan/filename=$isofile persistent persistent-path=/ub2004-1/ fsck.mode=skip quiet splash toram -- 
        initrd (loop)/casper/initrd
}

如图rmmod tpm所示替代位置

  • toram在具有大量 RAM 的计算机上,可以使用该选项来高速启动 RAM,但启动时间会更长。

  • fsck.mode=skip选项停止文件系统检查。

  • 可以通过maybe-ubiquity从 grub.cfg 中删除来消除“语言/尝试/安装”屏幕

  • 定位到菜单项内的备用位置,将在 BIOS 模式下启动时rmmod tpm发出警告,请参阅帖子 60 错误报告error: no such modulehttps://bugs.launchpad.net/ubuntu/+source/grub2/+bug/1851311

mkusb USB-pack-EFI 替换rmmod tpm为:

grub_platform
if test "$grub_platform" = "efi"; then
        rmmod tpm
fi

因此它rmmod tpm只能在 UEFI 启动时运行。

答案2

感谢@CSCameron 的修复!这是我的最终/etc/grub.d/40-custom文件。


#!/bin/sh
exec tail -n +4 $0
# This file provides an easy way to add custom menu entries.  Simply type the
# menu entries you want to add after this comment.  Be careful not to change
# the 'exec tail' line above.
# Full Circle #157, page 61
menuentry "Ubuntu 20.04 Desktop ISO (external hd0 disk)" {
        insmod part_gpt
        insmod ext2
        rmmod tpm
        set root=(hd0,gpt1)
        set isofile="/ubuntu-20.04-desktop-amd64.iso"
        loopback loop $isofile
        linux (loop)/casper/vmlinuz boot=casper iso-scan/filename=$isofile quiet splash
        initrd (loop)/casper/initrd
}
menuentry "Ubuntu 20.04 Desktop ISO (internal hd0 only)" {
        insmod part_gpt
        insmod ext2
        rmmod tpm
        set root=(hd0,gpt7)
        set isofile="/home/redacted/Documents/Disk_images/Ubuntu/ubuntu-20.04-desktop-amd64.iso"
        loopback loop $isofile
        linux (loop)/casper/vmlinuz boot=casper iso-scan/filename=$isofile quiet splash
        initrd (loop)/casper/initrd
}

答案3

与上面类似。硬盘启动存在几个问题。

我从硬盘或 SSD 启动 ISO。我通常有两个驱动器,并为 ISO 创建一个单独的分区。然后我从一个驱动器启动 ISO 以安装到另一个驱动器。

我发现我现在必须添加rmmod tpm,但通常必须卸载 /isodrive 并更改 ESP 的安装,这样它就不会覆盖我的主要工作安装。

2.04 内存不足错误循环挂载

https://bugs.launchpad.net/ubuntu/+source/grub2/+bug/1851311

sudo umount -lrf /isodevice

因此它不会覆盖我的 ESP,我在添加名称和密码的屏幕上卸载 ESP。我稍后必须编辑 fstab,因为它仍然有原始 ESP。我检查安装、卸载 ESP 并安装另一个 ESP,例如我的 sdb 或外部闪存驱动器。

Ubuntu 安装程序使用错误的引导加载程序位置进行 USB/sdb UEFI 安装

https://bugs.launchpad.net/ubuntu/+source/ubiquity/+bug/1173457

mount
sudo umount /target/boot/efi
sudo mount /dev/sdc1 /target/boot/efi

我的 Groovy ISO 启动,我现在使用标签,因此这是来自我的 SSD 上的分区和来自 sda 的 sdb 驱动器上的 Groovy 测试安装:

menuentry "Ubuntu 20.10 Groovy amd64" {
    set isofile="/groovy-desktop-amd64.iso"
    insmod part_gpt
    rmmod tpm
    search --set=root --label iso_ssd --hint hd0,gpt5
    loopback loop (${root})$isofile 
    linux (loop)/casper/vmlinuz boot=casper iso-scan/filename=$isofile toram
    initrd (loop)/casper/initrd
}

同样,这是从硬盘上的分区中获取的。这是 Focal 在我的 SSD 上的新安装,现在它是我的主要工作安装。我的 SSD 上仍有 18.04。

menuentry "Ubuntu 20.04 Focal amd64" {
    set isofile="/ubuntu-20.04-desktop-amd64.iso"
    insmod part_gpt
    rmmod tpm
    loopback loop (hd1,6)$isofile 
    linux (loop)/casper/vmlinuz boot=casper iso-scan/filename=$isofile toram
    initrd (loop)/casper/initrd
}

发现使用标签来安装驱动器,分区避免了在插入另一个 USB 驱动器的情况下重新启动时驱动器更改的问题,并且驱动器从 hd1 更改为 hd2。

如何添加 GRUB2 菜单项以启动 USB 驱动器上安装的 Ubuntu?

相关内容