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

我有一堆现场ISO文件,如GParted , CloneZilla , Boot-Repair , Ubuntu 14.04 32位 ,…在/opt和我的旧BIOS机器上下载,我以前只能将它们添加到grub菜单中启动它们。 🙂

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

从grub引导这些ISO文件的步骤是什么?

我只是厌倦了把这些“燃烧”到USB记忆棒,因为我永远找不到我需要的棍子,而我的电脑本身如果在我周围的总混乱中更难以松动…… ) 🙁

那么,将一个ISO文件添加到grub的基础知识对于UEFI和BIOS机器是相同的:编辑/etc/grub.d/40_custom并添加一个menuentry项(在本例中使用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 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,gpt4) (hd1,gpt3) (hd1,gpt2) (hd1,gpt1) (hd2) ... (hd3) ... 

咦? 4个驱动器? 我只有3个! 并且它不是BIOS上的(hd1,4)行,而是UEFI中的(hd1,gpt4)(hd0)根本没有分区!

好吧,显然当NVRAM的一部分用作存储并显示为(hd0) 您需要开始将驱动器编号为1! 虽然您在启动ISO文件时找到的所有信息都表明您必须从0开始编号(在BIOS计算机上这始终正确的 ,但在某些UEFI计算机上并不一定如此!)

因此,我的机器上的ISO文件是/dev/sdb2 (第二个驱动器hd2 ,第二个分区gpt2 ), loopback的值变为(hd2,gpt2)$GPartedISOFile

 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机器上被称为linuxefilinuxefi ,这给了我们最终的结果:

 #!/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记忆棒!

🙂

另一种方法是将配置文件添加到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 add nomodeset启动参数。 但仍然经常需要卸载/ isodevice。

无法卸载isodevice unmount 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 } 

三个简单的步骤

将ISO添加到grub菜单并从中启动。

首先,安装grml-rescueboot

打开终端并输入:

 sudo apt install grml-rescueboot 

其次,将iso文件移动到/boot/grml/

在同一个终端输入:

 sudo mv ~/Downloads/ /boot/grml/ 

第三,更新grub

在同一个终端输入:

 sudo update-grub 

必要时重复第二步和第三步

不要忘记从/boot/grml删除过时的ISO文件。

参考: Ubuntu帮助Grub2 ISO启动

希望这可以帮助

mkusb MULTIBOOT HACK

Mkusb为自定义启动驱动项目提供了很好的基础,因为它具有BIOS和UEFI的function。

这个hack引导多个ISO文件,包括Windows安装程序,并有一个grub2菜单。

大多数操作系统的Grub2菜单条目都可以通过Google搜索获得,超出了本答案的范围。

mkusb默认

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

mkusb再次使用默认值

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

DUS控制台

安装后的DUS控制台。

之前的GParted

在分区修改之前进行GParted。

Gparted之后

修改后的Gparted – 覆盖sdb4,ISO9660操作系统分区和sdb5,ext2 casper-rw分区,带有FAT32分区,用于持久性文件。

持久性分区

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

持久性文件夹

持久性文件夹 – 将casper-rw文件和可选的home-rw文件添加到每个持久性文件夹。 可以通过重命名casper-rw文件来制作home-rw文件。 home-rw文件就像完全安装时的单独主分区,它可以在版本升级后重用。

ISO文件夹

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

ISO文件夹内容

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

GRUB位置

grub.cfg位置

的grub.cfg

编辑grub.cfg以循环安装ISO文件。 包括: persistent persistent-path=//如果你想要持久化。

sudo parted -ls / dev / sdb

sudo parted -ls / dev / sdb

sudo lsblk -f / dev / sdb

sudo lsblk -f / dev / sdb

如果需要Windows安装程序,最简单的方法是使用mkusb“解压缩Windows安装程序”function,(我必须手动将Windows ISO解压缩到TAR),

mkusb Windows Installer

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

mkusb Windows grub

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

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

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

MultiBootUSB – QEMU

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

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

  • 在选择图像空间上拖放ISO。

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

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

MultiBootUSB-QEMU

SIMPLE mkusb ISO多引导程序

如果您不需要多持久性,则很容易在mkusb闪存驱动器上多引导操作系统ISO。

使用mkusb使用您选择的默认操作系统制作永久USB驱动器, https: //help.ubuntu.com/community/mkusb

在usbdata分区sdx1中创建一个名为ISO的文件夹。

将要引导的ISO添加到此文件夹。

将菜单条目添加到/sdx3/boot/grub/grub.cfg以循环安装ISO。

样品:

 menuentry "Ubuntu-18.04 64-bit ISO" { set root=(hd0,1) set isofile="/ISOs/ubuntu-18.04-desktop-amd64.iso" loopback loop $isofile linux (loop)/casper/vmlinuz boot=casper iso-scan/filename=$isofile splash -- initrd (loop)/casper/initrd.lz } menuentry "GParted 64-bit ISO" { set root=(hd0,1) set isofile="/ISOs/gparted-live-0.31.0-1-amd64.iso" loopback loop $isofile linux (loop)/live/vmlinuz boot=live union=overlay username=user config components noswap noeject toram=filesystem.squashfs ip='' nosplash findiso=$isofile splash -- initrd (loop)/live/initrd.img } menuentry "Clonezilla 64-bit ISO" { set root=(hd0,1) set isofile="/ISOs/clonezilla-live-2.5.5-38-amd64.iso" loopback loop $isofile linux (loop)/live/vmlinuz boot=live live-config nolocales edd=on nomodeset ocs_live_run=\"ocs-live-general\" ocs_live_extra_param=\"\" ocs_live_keymap=\"\" ocs_live_batch=\"no\" ocs_lang=\"\" vga=788 ip=frommedia nosplash toram=filesystem.squashfs findiso=$isofile splash -- initrd (loop)/live/initrd.img }