如何在 UEFI 机器上使用 grub2 从驱动器启动 ISO 文件?

如何在 UEFI 机器上使用 grub2 从驱动器启动 ISO 文件?

我有一堆实时 ISO 文件,例如分区克隆Zilla启动修复Ubuntu 14.04 32 位,...下载于/opt我的旧 BIOS 机器上后,我以前能够将它们添加到 grub 菜单并启动它们。:-)

我现在有一台 UEFI 机器,我能找到的所有信息都是针对 BIOS 机器的。

从 grub 启动这些 ISO 文件的步骤是什么?

我只是厌倦了一直将这些东西“刻录”到 USB 记忆棒上,因为我永远找不到我需要的记忆棒,而我的电脑本身在我周围的混乱中更难丢失...) :-(

答案1

有一个grub 2.04 中的错误因此请确保您拥有先前或更新的版本。

好吧,对于 UEFI 和 BIOS 机器来说,将 ISO 文件添加到 grub 的基本方法相同:编辑/etc/grub.d/40_custommenuentry在文件底部添加一个项目(此示例中使用 GParted):

menuentry "GParted Live ISO" {
}

现在我们要添加一个变量,其中包含我们存储 ISO 的目录(到目前为止一切顺利:与 BIOS 机器没有区别):

menuentry "GParted Live ISO" {
  set GPartedISOFile="/opt/Live-ISOs/gparted-live-0.31.0-1-amd64.iso"
}

我用/opt它来存储这些,因为我不喜欢在我的机器根目录中创建目录,并且根据Linux 文件系统层次结构无论如何,可选软件应该驻留在那儿。

在添加loopback变量之前,我们需要找出文件存储在哪个硬盘上,因此我们执行:,df --output=source /opt/Live-ISOs/gparted-live-0.31.0-1-amd64.iso | tail -1我的机器上的输出是:/dev/sdb2

然而grub 使用 ( hdX,Y) 符号和这就是 UEFI 和 BIOS 机器之间的区别所在!现在重启你的机器,进入 grub 菜单并按C:这将带你进入 grub 命令提示符与你习惯的命令不同但您唯一需要的是:ls

在我的计算机上输出是:

(hd0) (hd1) (hd1,gpt3) (hd1,gpt2) (hd1,gpt1) (hd2) ... (hd3) ...

啊?4 个驱动器?我只有 3 个!而且它不是(hd1,4)BIOS 上的线,而是(hd1,gpt3)UEFI 上的线,而且(hd0)根本没有分区!

嗯,显然,当部分 NVRAM 被用作存储并显示为(hd0) 您需要从 1 开始对驱动器进行编号!  而你在启动 ISO 文件时找到的所有信息都表明你必须从 0 开始编号(在 BIOS 机器上,这是永远正确,情况不一定如此在某些 UEFI 机器上! )

因此,的值loopback就变成了(hd2,gpt2)$GPartedISOFile我的计算机上的 ISO 文件/dev/sdb2(第二个驱动器hd2,第二个分区gpt2):

menuentry "GParted Live ISO" {
  set GPartedISOFile="/opt/Live-ISOs/gparted-live-0.31.0-1-amd64.iso"
  loopback loop (hd2,gpt2)$GPartedISOFile
}

另一个区别是BIOS 机器上的linuxinitrd被称为UEFI 机器上的linuxefiinitrdefi,这给了我们最终结果:

#!/bin/sh
exec tail -n +3 $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.

menuentry "GParted Live ISO" {
  set GPartedISOFile="/opt/Live-ISOs/gparted-live-0.31.0-1-amd64.iso"
  loopback loop (hd2,gpt2)$GPartedISOFile
  linuxefi (loop)/live/vmlinuz boot=live components config findiso=$GPartedISOFile ip=frommedia toram=filesystem.squashfs union=overlay username=user
  initrdefi (loop)/live/initrd.img
}

现在保存该文件,并使用以下命令更新 grub:

update-grub

完成上述所有操作后,重新启动,进入 grub 菜单,选择GParted Live ISO,现在您就可以轻松启动您的 ISO,而不必再寻找 USB 记忆棒!

:-)

CloneZilla Live 示例(用于这个问题

menuentry "CloneZilla ISO" {
  set ISOFile="/opt/Live-ISOs/clonezilla-live-20170905-zesty-amd64.iso"
  loopback loop (hd2,gpt2)$ISOFile
  linuxefi (loop)/live/vmlinuz boot=live components config findiso=$ISOFile ip=frommedia toram=filesystem.squashfs union=overlay
  initrdefi (loop)/live/initrd.img
}

答案2

另一种方法是将配置文件添加到 40_custom,如下所示:

menuentry 'Live ISOs on SSD' {
configfile (hd0,3)/ISO/livecdimage.cfg
} 

menuentry 'Live ISOs on HDD (boot on SSD)' {
configfile (hd1,3)/ISO/livecdimage.cfg
} 

我这样做是因为当我更新 ISO 时,我总是忘记运行sudo update-grub。上面的条目永远不需要更改,我只需编辑 livecdimage.cfg 即可,它的格式与任何 40_custom 相同,但没有标题行,并且位于我的 ISO 分区中的 /ISO 文件夹中。

我确实添加了 toram 作为另一个启动参数,并在使用 Nvidia 的系统上添加了 nomodeset 启动参数。但仍然经常需要卸载 /isodevice。

无法卸载 isodevice 卸载 ISO https://bugs.launchpad.net/ubuntu/+source/ubiquity/+bug/1155216

sudo umount -l -r -f /isodevice

这是我的 livecdimage.cfg 文件的一部分

# livecdimage.cfg
# Add this to 40_custom to load this file:
# menuentry 'Live ISOs' {
# configfile (hd1,3)/iso/livecdimage.cfg
#} 
# Add iso names to livecdimage.cfg
#for i in `ls *.iso`;do echo "# "$i>>livecdimage.cfg; done;

menuentry "Ubuntu 16.04.4 xenial amd64" {
    set isofile="/ISO/ubuntu-16.04.4-desktop-amd64.iso"
    loopback loop (hd0,3)$isofile 
    linux (loop)/casper/vmlinuz.efi boot=casper iso-scan/filename=$isofile toram
    initrd (loop)/casper/initrd.lz
}

menuentry "Ubuntu 18.04 Bionic amd64" {
    set isofile="/ISO/bionic-desktop-amd64.iso"
    loopback loop (hd0,3)$isofile 
    linux (loop)/casper/vmlinuz.efi boot=casper iso-scan/filename=$isofile toram
    initrd (loop)/casper/initrd.lz
}

# spacer line
menuentry " " {
set root= 
}

menuentry "Reboot" {
    reboot
}

menuentry "Halt" {
    halt
}

答案3

mkusb 多重引导破解

Mkusb 因其具有 BIOS 和 UEFI 功能而成为自定义启动驱动器项目的绝佳基础。

该黑客程序启动了多个 ISO 文件,包括 Windows 安装程序,并有一个 grub2 菜单。

大多数操作系统的 Grub2 菜单项都可以通过 Google 搜索找到,这超出了本答案的范围。

mkusb 默认值

创建持久 USB 驱动器时使用 mkusb 默认值。

mkusb 再次使用默认值

如果有疑问,请使用 mkusb 持久默认值,分区大小可以稍后调整,但需要时间。

DUS 控制台

安装后的 DUS 控制台。

GParted 之前

分区修改之前,GParted。

之后

修改后的 Gparted - 使用 FAT32 分区覆盖 sdb4(ISO9660 OS 分区)和 sdb5(ext2 casper-rw 分区)以保存持久文件。

持久性分区

持久性分区 - 为每个操作系统创建一个唯一名称的文件夹(需要持久性)

持久文件夹

持久性文件夹 - 向每个持久性文件夹添加一个 casper-rw 文件和可选的 home-rw 文件。可以通过重命名 casper-rw 文件来创建 home-rw 文件。home-rw 文件就像完整安装上的单独主分区,可以在版本升级后重复使用。

ISO 文件夹

在 NTFS usbdata 分区上为 ISO 文件创建一个文件夹。

ISO 文件夹内容

将一些 ISO 添加至 ISO 文件夹。

GRUB 位置

grub.cfg 位置

grub配置文件

编辑 grub.cfg 以循环挂载 ISO 文件。persistent persistent-path=/<persistent-folder-name>/如果您想要持久性,请包括:。将 rmmod tpm 添加到 grub.cfg 的第一个菜单项上方。

编辑 18.04+在 grub 中指定维姆林兹不是 vmlinuz.efi 和初始化文件没有 initrd 没有 initid.lz

sudo parted-ls /dev/sdb

sudo parted-ls /dev/sdb

sudo lsblk -f /dev/sdb

sudo lsblk -f /dev/sdb

如果需要 Windows 安装程序,最简单的方法可能是使用 mkusb 的“提取 Windows 安装程序”功能(我必须手动将 Windows ISO 提取到 TAR),

mkusb Windows 安装程序

安装后,为 ISO 创建一个文件夹,如果需要,还为持久性创建一个文件夹(类似于上述过程)。

mkusb Windows grub

编辑 /boot/grub/grub.cfg 以循环挂载任何 ISO 并指定任何持久文件夹。

(还没有找到循环安装 Windows ISO 文件的方法)。

如果将上述设备用作 USB 记忆棒,则可用于启动存储在 Windows 计算机上的 ISO。内部驱动器上不需要 Grub。

答案4

MultiBootUSB - QEMU

如果您想以最少的麻烦启动 ISO 文件并且不需要持久性,MultiBootUSB 包含一个 QEMU 选项:

  • 启动 MultiBootUSB 并选择 Boot ISO/USB 选项卡。

  • 将 ISO 拖放到选择图像空间。

  • 选择 RAM 大小并点击 Boot ISO 按钮。

您不需要编辑 grub.cfg 甚至不需要注销。

MultiBootUSB-QEMU

相关内容