本教程将向您展示如何使用 GRUB2 引导加载程序引导存储在硬盘上的 ISO 文件。通常,您需要创建 live DVD 或 live USB 才能启动 Linux ISO 映像。您可以使用图形工具或命令行来完成此操作。但是,如果您没有光盘或 USB 拇指驱动器,或者您的计算机不支持将 ISO 映像刻录到光盘,该怎么办?

GRUB 来救援
GRUB2(GRand Unified Bootloader)是 Linux 的标准引导加载程序。它可以启动存储在硬盘上的 Linux ISO 映像文件,无需 USB 或 DVD。 GRUB Legacy(版本 0.x)没有此功能。许多 Linux 发行版可以直接从 ISO 文件启动。
- GRUB2 支持许多文件系统,包括但不限于
ext4
、HFS+
和NTFS
,这意味着您可以将 ISO 文件放在任何这些文件系统。 - GRUB2可以直接从LVM和RAID设备读取文件。
- GRUB2 还具有网络支持。您可以使用TFTP协议通过网络加载ISO映像。
要使用 GRUB2 引导 ISO 文件,您需要一个已在计算机上安装了 GRUB2 作为引导加载程序的 Linux 发行版。以下说明适用于传统的 BIOS 和较新的 UEFI 固件。但是,如果您使用 UEFI,那么您应该在固件中禁用 GRUB2 的安全启动来启动 ISO 文件,否则,您可能会看到“找不到命令环回”错误。
现在让我们开始吧。
从 GRUB2 引导 Ubuntu ISO 文件
登录Linux计算机,下载Ubuntu ISO镜像文件。然后打开终端窗口并使用 Nano 等命令行文本编辑器编辑 /etc/grub.d/40_custom
文件。
sudo nano /etc/grub.d/40_custom
该文件的第一行是#! /bin/sh
表示这是一个 shell 脚本。在此文件中,我们可以将自定义条目添加到 GRUB 启动菜单。

将以下文本复制并粘贴到该文件的末尾。
menuentry "ubuntu-20.04.2.0-desktop-amd64.iso" { insmod ext2 set isofile="/home/linux-terminal/Downloads/ubuntu-20.04.2.0-desktop-amd64.iso" loopback loop (hd0,5)$isofile linux (loop)/casper/vmlinuz boot=casper iso-scan/filename=$isofile quiet noeject noprompt splash initrd (loop)/casper/initrd }

在哪里 :
- menuentry:此条目将显示在 GRUB2 引导菜单上。您可以将其命名为任何您喜欢的名称。
- insmod 命令插入一个模块。由于 ISO 文件存储在我的
ext4
主目录下,因此需要ext2
模块。如果它存储在 NTFS 分区上,则需要insmod ntfs
。请注意,GRUB 可能无法识别 XFS 和 Btrfs 文件系统,因此不建议将 ISO 文件存储在 XFS 或 Btrfs 分区上。 - set isofile:指定 ISO 映像文件的路径。这里我使用的是保存在
Downloads
文件夹下的 Ubuntu 20.04 Desktop ISO 文件。 - 环回:挂载ISO文件。
hd0
表示计算机中的第一个硬盘驱动器,5
表示 ISO 文件存储在第 5 个磁盘分区上。 linux
命令从指定路径加载 Linux 内核。 casper/vmlinuz.efi 是 Ubuntu ISO 映像中的 Linux 内核。initrd
命令从指定路径加载初始 ramdisk。它只能在运行linux
命令后使用。初始 ramdisk 是安装到 RAM 上的最小根文件系统。 casper/initrd.lz 是 Ubuntu ISO 映像中的 initrd 文件。
请注意,GRUB不区分 IDE 和 SCSI。在Linux内核中:
/dev/hda
指第一个 IDE 硬盘,/dev/sda
指第一个 SCSI 或 SATA 硬盘。/dev/nvme0n1
指第一个 NVMe SSD。/dev/nvme1n1
指第二个 NVMe SSD。
但在 GRUB 中,第一个硬盘驱动器始终称为 hd0
,无论接口类型是什么。另请注意,GRUB 中的分区号从 1 开始,而不是从 0 开始。
如果ISO文件存储在MBR磁盘的扩展分区上,则分区号从5开始,而不是1。例如,扩展分区内的第一个逻辑分区将编号为5;扩展分区内的第二个逻辑分区编号为 6。要检查分区编号,您可以在终端窗口中运行 lsblk 或 sudo parted -l 命令来检查分区编号。
保存并关闭文件。 (按 Ctrl+O
,然后按 Enter
在 Nano 文本编辑器中保存文件。按 Ctrl+X
退出。)
然后使用以下命令更新 GRUB 引导菜单:
sudo grub-mkconfig -o /boot/grub/grub.cfg
在 Fedora、CentOS、RHEL、OpenSUSE 上,运行的命令是:
sudo grub2-mkconfig -o /boot/grub2/grub.cfg
在 Debian、Ubuntu、Linux Mint 上,您可以使用以下命令更新 GRUB 启动菜单。
sudo update-grub
您可能不会立即看到新的菜单条目,但在重新启动计算机时您会看到它。
sudo shutdown -r now
您将在 GRUB2 启动菜单的底部看到您的自定义条目。如果 GRUB 无法启动您的 ISO 映像,请检查 /etc/grub.d/40_custom
文件以查看是否存在拼写错误或您遗漏了空格或类似内容。

您可以在 /etc/grub.d/40_custom
文件中添加任意数量的菜单项。
Debian ISO
下载 Debian live CD ISO 文件。接下来,打开终端窗口并使用 Nano 等文本编辑器编辑 /etc/grub.d/40_custom
文件。
sudo nano /etc/grub.d/40_custom
在此文件中,我们可以将自定义条目添加到 GRUB 启动菜单。在本例中,我们想要添加一个条目来引导 Debian ISO 文件。
menuentry "debian-live-10.8.0-amd64-lxqt.iso" { insmod ext2 set isofile="/home/linux-terminal/Downloads/debian-live-10.8.0-amd64-lxqt.iso" loopback loop (hd0,5)$isofile linux (loop)/live/vmlinuz-4.19.0-14-amd64 boot=live findiso=$isofile initrd (loop)/live/initrd.img-4.19.0-14-amd64 }
请注意,vmlinuz
和 initrd.img
文件包含版本号。您应该挂载您的 Debian ISO 文件并检查是否应该更新它。保存并关闭文件。然后更新 GRUB 启动菜单。
sudo grub-mkconfig -o /boot/grub/grub.cfg
或者
sudo grub2-mkconfig -o /boot/grub2/grub.cfg
Arch Linux ISO
下载 Arch Linux ISO 文件。接下来,打开终端窗口并使用 Nano 等文本编辑器编辑 /etc/grub.d/40_custom
文件。
sudo nano /etc/grub.d/40_custom
在此文件中,我们可以将自定义条目添加到 GRUB 启动菜单。在本例中,我们想要添加一个条目来引导 Arch Linux ISO 文件。
menuentry "archlinux-2021.03.01-x86_64.iso" { insmod ext2 set isofile="/home/linux-terminal/Downloads/archlinux-2021.03.01-x86_64.iso" loopback loop (hd0,5)$isofile linux (loop)/arch/boot/x86_64/vmlinuz-linux archisolabel=ARCH_202103 img_dev=/dev/sda5 img_loop=$isofile earlymodules=loop initrd (loop)/arch/boot/x86_64/initramfs-linux.img }
请注意,如果您下载较新的 Arch Linux ISO 文件,例如 archlinux-2021.04.01-x86_64.iso
,则需要将 archisolabel
更新为 ARCH_202104
。您还可以通过在文件管理器中安装 Arch Linux ISO 来找出标签应该是什么。该标签将显示在您的文件管理器中。

此外,您可能需要更改 img_dev
的值。这是存储 ISO 文件的设备的名称。
保存并关闭文件。然后更新 GRUB 启动菜单。
sudo grub-mkconfig -o /boot/grub/grub.cfg
或者
sudo grub2-mkconfig -o /boot/grub2/grub.cfg
Clonezilla Live ISO
Clonezilla 是一款免费、开源且可靠的工具,用于磁盘驱动器的裸机备份和恢复。下载 Clonezilla live ISO 文件。接下来,打开终端窗口并使用 Nano 等文本编辑器编辑 /etc/grub.d/40_custom
文件。
sudo nano /etc/grub.d/40_custom
在此文件中,我们可以将自定义条目添加到 GRUB 启动菜单。在本例中,我们要添加一个条目来启动 Clonezilla Live ISO 文件。
menuentry "clonezilla-live-20210127-groovy-amd64.iso" { insmod ext2 set isofile="/home/linux-terminal/Downloads/clonezilla-live-20210127-groovy-amd64.iso" loopback loop (hd0,5)$isofile linux (loop)/live/vmlinuz boot=live findiso=$isofile initrd (loop)/live/initrd.img }
保存并关闭文件。然后更新 GRUB 启动菜单。
sudo grub-mkconfig -o /boot/grub/grub.cfg
或者
sudo grub2-mkconfig -o /boot/grub2/grub.cfg
RHEL 8/CentOS 流 ISO
首先,下载ISO镜像文件。对于RHEL 8,请阅读以下文章了解如何下载ISO镜像文件。
- 如何免费下载并安装 RHEL8(红帽企业 Linux)
CentOS Stream ISO 镜像可以从其官方网站下载。
接下来,打开终端窗口并使用 Nano 等文本编辑器编辑 /etc/grub.d/40_custom
文件。
sudo nano /etc/grub.d/40_custom
在此文件中,我们可以将自定义条目添加到 GRUB 启动菜单。在本例中,我们要添加一个条目来启动 RHEL 8/CentOS/Fedora ISO 文件。
menuentry "rhel-8.3-x86_64-boot.iso" { insmod ext2 set isofile="/home/linux-terminal/Downloads/rhel-8.3-x86_64-boot.iso" loopback loop (hd0,5)$isofile linux (loop)/isolinux/vmlinuz noeject inst.stage2=hd:/dev/sda5:$isofile initrd (loop)/isolinux/initrd.img }
上面代码中,/dev/sda5
是存放ISO镜像文件的第一个盘的第5个分区。保存并关闭文件。然后更新 GRUB 启动菜单。
sudo grub-mkconfig -o /boot/grub/grub.cfg
或者
sudo grub2-mkconfig -o /boot/grub2/grub.cfg
费多拉ISO
Fedora ISO 镜像可以从其官方网站下载。接下来,打开终端窗口并使用 Nano 等文本编辑器编辑 /etc/grub.d/40_custom
文件。
sudo nano /etc/grub.d/40_custom
在此文件中,我们可以将自定义条目添加到 GRUB 启动菜单。在本例中,我们想要添加一个条目来引导 Fedora ISO 文件。
menuentry "Fedora-Workstation-Live-x86_64-33-1.2.iso" { insmod ext2 set isofile="/home/linux-terminal/Downloads/Fedora-Workstation-Live-x86_64-33-1.2.iso" loopback loop (hd0,5)$isofile linux (loop)/isolinux/vmlinuz root=live:CDLABEL=Fedora-WS-Live-33-1-2 rd.live.image verbose iso-scan/filename=$isofile initrd (loop)/isolinux/initrd.img }
在上面的代码中,CDLABEL
是挂载 ISO 映像时在文件管理器中显示的标签。

保存并关闭文件。然后更新 GRUB 启动菜单。
sudo grub-mkconfig -o /boot/grub/grub.cfg
或者
sudo grub2-mkconfig -o /boot/grub2/grub.cfg
OpenSUSE Leap Live ISO
下载 OpenSUSE Leap live ISO 文件。接下来,打开终端窗口并使用 Nano 等文本编辑器编辑 /etc/grub.d/40_custom
文件。
sudo nano /etc/grub.d/40_custom
在此文件中,我们可以将自定义条目添加到 GRUB 启动菜单。在本例中,我们要添加一个条目来启动 OpenSUSE Leap Live ISO 文件。
menuentry "openSUSE-Leap-15.2-KDE-Live-x86_64-Build31.383-Media.iso" { insmod ext2 set isofile="/home/linux-terminal/Downloads/openSUSE-Leap-15.2-KDE-Live-x86_64-Build31.383-Media.iso" loopback loop (hd0,5)$isofile linux (loop)/boot/x86_64/loader/linux boot=isolinux root=live:CDLABEL=openSUSE_Leap_15.2_KDE_Live rd.live.image verbose iso-scan/filename=$isofile initrd (loop)/boot/x86_64/loader/initrd }
在上面的代码中,CDLABEL
是挂载 ISO 映像时在文件管理器中显示的标签。

保存并关闭文件。然后更新 GRUB 启动菜单。
sudo grub-mkconfig -o /boot/grub/grub.cfg
或者
sudo grub2-mkconfig -o /boot/grub2/grub.cfg
Kali Linux Live ISO
下载 Kali Linux live ISO 文件。接下来,打开终端窗口并使用 Nano 等文本编辑器编辑 /etc/grub.d/40_custom
文件。
sudo nano /etc/grub.d/40_custom
在此文件中,我们可以将自定义条目添加到 GRUB 启动菜单。在本例中,我们想要添加一个条目来启动 Kali Linux Live ISO 文件。
menuentry "kali-linux-2021.1-live-amd64.iso" { insmod ext2 set isofile="/home/linux-terminal/Downloads/kali-linux-2021.1-live-amd64.iso" loopback loop (hd0,5)$isofile linux (loop)/live/vmlinuz boot=live findiso=$isofile initrd (loop)/live/initrd.img }
保存并关闭文件。然后更新 GRUB 启动菜单。
sudo grub-mkconfig -o /boot/grub/grub.cfg
或者
sudo grub2-mkconfig -o /boot/grub2/grub.cfg
Linux Mint Live ISO
下载 Linux Mint ISO 文件。接下来,打开终端窗口并使用 Nano 等文本编辑器编辑 /etc/grub.d/40_custom
文件。
sudo nano /etc/grub.d/40_custom
在此文件中,我们可以将自定义条目添加到 GRUB 启动菜单。在本例中,我们想要添加一个条目来引导 Linux Mint ISO 文件。
menuentry "linuxmint-20.1-cinnamon-64bit.iso" { insmod ext2 set isofile="/home/linux-terminal/Downloads/linuxmint-20.1-cinnamon-64bit.iso" loopback loop (hd0,5)$isofile linux (loop)/casper/vmlinuz boot=casper iso-scan/filename=$isofile quiet noeject noprompt splash initrd (loop)/casper/initrd.lz }
保存并关闭文件。然后更新 GRUB 启动菜单。
sudo grub-mkconfig -o /boot/grub/grub.cfg
或者
sudo grub2-mkconfig -o /boot/grub2/grub.cfg
查找 Linux 内核和 initrd 文件名
对于不同的 Linux ISO 映像,Linux 内核和 initrd(初始 ramdisk) 文件可能有所不同。对于 Ubuntu,Linux 内核位于 /casper/vmlinuz
,initrd 映像文件位于 /casper/initrd
。如果您不知道它们位于何处,只需使用存档管理器打开您的 ISO 映像即可。以下屏幕截图显示了 Arch Linux ISO 映像文件。

显示 GRUB 引导菜单
如果硬盘上只安装了一种操作系统,某些 Linux 发行版(例如 Ubuntu)会隐藏 GRUB 启动菜单。要显示 GRUB 引导菜单,请编辑配置文件。
sudo nano /etc/default/grub
找到以下行,它告诉 GRUB 隐藏引导菜单。
GRUB_TIMEOUT_STYLE=hidden
在开头添加 #
字符以注释掉该行。
#GRUB_TIMEOUT_STYLE=hidden
然后找到以下行。
GRUB_TIMEOUT=0
将 0
更改为 10
,这样您就有 10 秒的时间在 GRUB 启动菜单中选择一个条目。
GRUB_TIMEOUT=10
保存并关闭文件。然后更新 GRUB 配置。
sudo update-grub
更改 GRUB 中的引导顺序
假设您希望在 GRUB 中默认引导至 ISO,然后编辑配置文件。
sudo nano /etc/default/grub
找到以下行,使 GRUB 选择引导菜单中的第一个条目。
GRUB_DEFAULT=0
将其更改为如下所示:
GRUB_DEFAULT="clonezilla-live-20210127-groovy-amd64.iso"
如果 /etc/grub.d/40_custom
文件中有此条目 menuentry "clonezilla-live-20210127-groovy-amd64.iso"
,则 GRUB 将通过以下方式选择此条目默认。更新 GRUB 以使更改生效。
sudo update-grub
您还可以保留默认启动顺序,但仅使用以下命令启动 ISO 文件以供下次启动:
sudo grub-reboot clonezilla-live-20210127-groovy-amd64.iso
或者
sudo grub2-reboot clonezilla-live-20210127-groovy-amd64.iso
然后重新启动。
sudo shutdown -r now
额外提示
如果您的计算机内有SATA磁盘和NVMe SSD,则SATA磁盘是第一个,NVMe SSD是第二个。 USB 驱动器和 NVMe SSD 也是如此。如果您有光盘,则 GRUB 可能认为该光盘是第一个磁盘。
如果您在 GRUB 尝试引导 ISO 映像文件时看到以下错误,则可能您已将 ISO 文件位置指定到光盘。
can not get C/H/S value
如果您有一个跨越整个磁盘的文件系统,那么您不需要在 GRUB 中指定分区号。例如,我的第二个磁盘上有一个 ISO 文件。我没有在第二个磁盘上创建任何分区,因此我可以在 GRUB 配置文件中指定 (hd1)
。
loopback loop (hd1)$isofile
如果您在更新 GRUB 启动菜单时看到如下错误消息,可以忽略此错误。
grub-probe: error: cannot find a GRUB drive for /dev/loop11p3. Check your device.map.
Windows 10 ISO
是的,您可以在 Ubuntu 或任何 Linux 发行版上创建 Windows 10 可启动 USB。如果您没有 USB 拇指驱动器,您可以使用 GRUB2 在硬盘驱动器上启动 Windows 10 ISO。下载 Windows 10 ISO 文件。请注意,您可能无法在 Windows 计算机上从此链接下载 ISO。 Linux 计算机上的用户可以看到此下载链接。
GRUB2 无法直接启动 Windows 10 ISO。您需要使用 GParted 等分区编辑器在磁盘上创建一个单独的 NTFS 分区,并将 Windows 10 ISO 提取到该分区。最新的Windows 10 ISO文件为5.8G。新的 NTFS 分区应至少为 7G,并且不应用于存储任何其他文件。

然后在文件管理器中找到您的 Windows 10 ISO。使用磁盘映像安装程序打开它。

打开挂载的文件系统。选择所有文件和文件夹并将它们复制到 NTFS 分区。

有时 Ubuntu 上的文件管理器会挂起,并且复制操作似乎已停止。事实上,它正在发挥作用。耐心一点。当您看到复选标记时,表示复制操作已完成。

接下来,打开终端窗口并使用 Nano 等文本编辑器编辑 /etc/grub.d/40_custom
文件。
sudo nano /etc/grub.d/40_custom
在此文件中,我们可以将自定义条目添加到 GRUB 启动菜单。在本例中,我们要添加一个条目来启动 Windows 10 安装程序。如果您的计算机仍使用传统的 BIOS 固件,请在此文件中添加以下文本。
menuentry "Windows-10-Installer.iso" { set root=(hd0,6) insmod part_msdos insmod ntfs insmod ntldr #uncomment the following line if your computer has multiple hard drives. #drivemap -s (hd0) ${root} ntldr /bootmgr }
我的NTFS分区号是6,所以我使用(hd0,6)
作为根。您可以运行 sudo parted -l 命令来检查您的 NTFS 分区号。如果您的计算机有多个硬盘,请使用drivemap
命令将分区(hd0,6)
设置为第一个硬盘,以便Windows能够启动。
如果您的计算机使用 UEFI 固件,请在此文件中添加以下文本。
menuentry "Windows-10-Installer.iso" { set root=(hd0,6) insmod part_gpt insmod ntfs insmod chain chainloader /efi/boot/bootx64.efi }
保存并关闭文件。然后更新 GRUB 启动菜单。
sudo grub-mkconfig -o /boot/grub/grub.cfg
或者
sudo grub2-mkconfig -o /boot/grub2/grub.cfg
拔下所有外部 USB 存储设备,然后重新启动计算机。请注意,Windows 桌面 ISO 安装程序在 Proxmox KVM 虚拟机上无法正常工作。
包起来
我希望本教程可以帮助您使用 GRUB2 引导加载程序引导 ISO 文件。与往常一样,如果您发现这篇文章有用,请订阅我们的免费时事通讯以获取更多提示和技巧。保重 🙂
本文来自互联网,仅作为参考学习记录
发表回复