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


12

我在我的旧BIOS机器中以及在我的旧BIOS机器上下载了一堆实时ISO文件,例如GPartedCloneZillaBoot-RepairUbuntu 14.04 32位 ... /opt,我以前只能将它们添加到grub菜单并启动它们。:-)

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

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

我只是厌倦了一直将它们“烧”成USB记忆棒,因为我再也找不到我需要的记忆棒了,而如果我的计算机本身更难以摆脱周围的混乱局面…… ) :-(


1
我前阵子走了,真棒。
有机大理石

1
我确实喜欢使用一个单独的分区,每个驱动器上都有一个分区,以使其更容易安装到其他驱动器或将完整驱动器安装到闪存驱动器。help.ubuntu.com/community/Grub2/ISOBoot示例:help.ubuntu.com/community/Grub2/ISOBoot/Examples我发现在安装分区之前获取正确的路径,并获得详细的启动参数是获取时的两个主要问题它工作。如果插入了闪存驱动器,路径甚至可能会更改。查看ISO以查看其引导节和路径可以帮助您确定详细信息。
oldfred

1
我以前经常使用这种'grub-n-iso'方法,并且效果很好:-),但是现在我在另一台计算机上测试iso文件以进行测试,然后将iso文件克隆到快速USB3笔式驱动器中,或者创建持久的Live文件带mkusb的 USB笔式驱动器。(我将USB笔式驱动器存储在一个小塑料盒中。)
sudodus

VBox可以运行ISO文件,可以在退出时使用保存计算机状态,MultiBootUSB具有拖放ISO引导的选项,带有Virtual Machine Manager的QEMU将快速运行iso。
CSCameron

1
暂时仅使用grub2 2.02循环挂载ISO。Grub2 2.04发出内存不足错误。bugs.launchpad.net/ubuntu/+source/grub2/+bug/1851311 Ubuntu 18.04仍具有grub 2.02。
oldfred

Answers:


14

grub 2.04中有一个错误,因此请确保您具有先前或更高版本。

好了,向UEFI和向BIOS计算机/etc/grub.d/40_custom添加grub的ISO文件的基本原理相同:编辑并向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变量之前,我们需要确定文件存储在哪个硬盘上,因此我们执行a:,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
}

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

#!/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
}

您是否设置了Clonezilla?有点不同,如果您还没有发现,我可以发贴。
有机大理石

1
我将针对明天将为“编解码器”这类人添加的所有答案发布另一个答案... @OrganicMarble
Fabby

+1,但它可能安全地删除2update-grub2这些天。
WinEunuuchs2Unix

@ WinEunuuchs2Unix这是我的历史...我只是键入upd↑然后复制粘贴。感谢您的提醒更新!
Fabby

6

另一种方法是像这样向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
}

我喜欢重新启动并停止运行!:-) +1 为什么要添加insmod?您也可以ping通我聊天
Fabby

可能不需要inmod。使用grub2,内置了某些功能,而某些功能是addin(insmod)。大概一开始我就需要insmod gpt,因为我是从2010年开始使用gpt的,或者在pc是UEFI和grub2是新的&仅用于BIOS / MBR的PC之前,尽管会从带有BIOS的gpt启动。
oldfred

谢谢你的回答。那么从答案中删除那些行会更好吗?
Fabby

1
让我编辑自己的节,看看是否有18.04靴子。我希望会。我还想更新我的gparted ISO引导条目,该条目现在已经很旧了,因此稍后再介绍。
oldfred

1
启动正常。我忘了插入18.04闪存驱动器,它在系统上变成hd0,因此在启动时,我必须手动编辑一个hdX条目以拥有正确的驱动器。我的gparted .25靴子仅更改为.30不能正常工作。我必须研究一下ISO并查看其grub.cfg并使用这些参数和grub的loop命令,然后它才起作用。
oldfred

5

mkusb MULTIBOOT HACK

Mkusb具有BIOS和UEFI的功能,因此为自定义启动驱动器项目奠定了良好的基础。

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

大多数操作系统的Grub2菜单项都可以使用Google搜索获得,并且不在此答案范围内。

mkusb默认

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

mkusb再次使用默认值

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

DUS控制台

安装后的DUS控制台。

GParted之前

GParted在修改分区之前。

分手后

修改后进行分区-覆盖sdb4(ISO9660 OS分区)和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=/<persistent-folder-name>/如果您想要持久性。

编辑18.04+在grub中指定vmlinuz而不是vmlinuz.efi和initrd而不是initrd而不是initid.lz

须藤分开-ls / dev / sdb

须藤分开-ls / dev / sdb

须藤lsblk -f / dev / sdb

须藤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。


以及如何将它们恢复到HDD / SDD上?问题是关于现在想要它们放在USB记忆棒上,还是我错过了什么?
Fabby

1
@Fabby,这不仅适用于USB记忆棒。如果您有新的SATA驱动器,则可以按照此答案中的说明启动,并让mkusb安装其强大的引导系统,该系统可在UEFI和BIOS模式下使用。该SATA驱动器可以内部安装,也可以通过USB或eSATA外部连接。可以同时添加“常规安装的系统”和要通过“ grub-n-iso”启动的新iso文件。
sudodus

好的,我还是不明白:我想要这些ISO /opt/。我怎么做?(尽管在此期间需要付出+1的努力……)
Fabby

1
@Fabby:我认为不必像上面显示的那样为ISO创建新文件夹,而是指向/ opt /中的ISO位置,在grub.cfg中,pendrive上的grub可以在硬盘驱动器上引导ISO。我将尝试一下。
CSCameron

@Fabby:如果ISO位于内部驱动器的/ opt /上,则内部驱动器上使用的相同菜单项将在外部驱动器上起作用。在USB记忆棒上引导grub可能会有好处,例如不会过度拥挤或破坏内部grub菜单。
CSCameron '18

3

三个简单步骤

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

一,安装 grml-rescueboot

打开一个终端并输入:

sudo apt install grml-rescueboot

其次,将iso文件移至 /boot/grml/

在同一终端中输入:

sudo mv ~/Downloads/<filename.iso> /boot/grml/

三,更新grub

在同一终端中输入:

sudo update-grub

视需要重复第二和第三步

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

参考:有关Grub2 ISO引导的Ubuntu帮助

希望这可以帮助


/boot是放置它们的最糟糕的地方。抱歉,调查了grml,应该提到它。+1
值得

感谢@Fabby +1!这可能不是最好的方法,但是恕我直言,这似乎是最简单的方法。
user68186 '18

1
这就是为什么+1:对于非技术用户来说是个好答案。
Fabby

2

MultiBootUSB-QEMU

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

  • 启动MultiBootUSB,然后选择“启动ISO / USB”选项卡。

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

  • 选择RAM大小,然后单击启动ISO按钮。

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

多重启动USB-QEMU


好漂亮!我打算稍后再尝试!
Fabby

@Fabby:有Windows版本的MBUSB和Linux版本。我无法使用Windows版本来引导ISO,只能引导USB。Linux版本9.2.0非常适合我。
CSCameron '18

2

简单的mkusb ISO multibooter

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

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

在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
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.