我正在尝试从 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 module
https://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
文件。
添加
rmmod tpm
(见https://bugs.launchpad.net/ubuntu/+source/grub2/+bug/1851311)set root=
根据是否连接外部 USB 磁盘更改为 hd0<->hd1
#!/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。