如何在 U 盘上安装多个 Linux 发行版?

如何在 U 盘上安装多个 Linux 发行版?

我想设计一个分区的 USB 记忆棒,使其包含多个 Linux 系统(而不是 Live 版本)。特别是,我希望在同一个 U 盘上至少有两个不同版本的 Fedora,即用于 64 位架构的 Fedora 24 和用于 32 位架构的 Fedora 8。我的目的是复制我工作所需的机器环境,而不占用笔记本电脑上的空间(通过另一个分区或虚拟机),并且只需将 USB 记忆棒插入笔记本电脑即可启动我的操作系统。

到目前为止,我成功地在 32 Go USB 记忆棒上安装了一个可用的 Fedora 24,同时还安装了 GRUB2,它让我可以在启动 Fedora 24 和启动我的笔记本电脑的操作系统之一之间进行选择。两者都使用两个分区,分别为 10,01 Gio 和 500 Mio,剩下不到 20 Go 的未分配空间,我打算用于其他 Linux 发行版。为了让您更好地预览 USB 记忆棒的当前状态,以下是我使用 GParted 读取 USB 记忆棒时看到的内容:

G部分显示

问题是,我不知道如何在更新 GRUB2 时安全地将 Fedora 8 添加到 USB 记忆棒上,以便在插入 USB 记忆棒时可以在启动菜单中选择 Fedora 8(特别是因为我记得,Fedora 8 比 GRUB2 稍旧)。特别是,我有以下问题:

  • 最终调整 Fedora 24 所在分区的大小以便为更多操作系统腾出空间(将来)是否安全?
  • 我应该遵循什么一般程序在我的 USB 记忆棒上创建一个新分区并在其上安装一个非 Live 版本的新操作系统(请注意,如果需要,我可以使用第二个具有 Live 版本的 USB 记忆棒)?
  • 如何更新 USB 记忆棒上的 GRUB2 以在列表中显示新操作系统?

预先感谢您的答复。

答案1

如何在 U 盘上安装多个 Linux 发行版?

认为:

  • BIOS 从 USB 驱动器启动
  • 主引导记录分区
  • GRUB 引导加载程序

工具:

概述:

  • 将 USB 驱动器的分区表和引导记录清零
  • 在 USB 驱动器上创建分区
  • 在虚拟机中为 USB 驱动器创建操作系统
  • 使用clonezilla克隆新操作系统
  • 将操作系统恢复到 USB 驱动器
  • 更新和自定义 GRUB2

步骤1

准备好工具并确定 USB 上要放置哪些操作系统、分区大小以及是否使用交换分区。

您的 USB 总共看起来有 32GB。

我们将设置分区。

NTFS 16GB 分区用于 Microsoft 互操作性。

Ubuntu14 32 位服务器 4GB ext4 带 1GB 交换分区

Ubuntu16 64 位服务器 8GB ext4 带 4GB 交换分区

笔记:如果您不在任何操作系统上使用待机或休眠功能,它们可以共享一个交换分区,甚至在每个操作系统分区中使用一个交换文件。

分区布局:

  • P1——15GB NTFS
  • P2——4GB ext4
  • P3——8GB ext4
  • P4——扩展
  • E1——4GB交换
  • E2——1GB交换

笔记:BIOS 和 MBR 只能看到 4 个主分区。使用扩展分区代替单个主分区来克服此限制。


第2步

准备USB驱动器。

创建名为“test”的新虚拟机 此虚拟机不需要或不需要硬盘驱动器。这应该会制作出 USB 驱动器/dev/sda。这将使后面的事情变得更简单。

将 Parted Magic ISO 连接到 VM 并启动到 ISO。

连接 USB 驱动器并“传递到虚拟机”

验证 USB 在 VM 中可见并记下设备编号。

从桌面图标启动分区编辑器。

我的设置中的 USB 驱动器是:/dev/sda

将分区表清零。这将删除该设备上的所有信息。首先复制您要保留的任何数据。

  • 必须具有正确的设备(例如:/dev/sda),因为如果将错误的设备清零,可能会使计算机无法启动。
  • dd if=/dev/zero of=/dev/sda bs=512 count=4

刷新 GParted 中的驱动器列表 (ctrl+R)

设备 --> 创建分区表“msdos”

创建分区:

笔记:我最后创建了 NTFS 分区来“用完”剩余空间。

  • 在空间的后端创建扩展分区。 5GB或5120
  • 在扩展分区中创建两个交换分区。输入 linux-swap。 4GB、1GB。扩展分区将满。
  • 在未分配空间的末尾创建 2 个操作系统分区。输入 ext4。 4GB、8GB。
  • 将 4GB 标记为“Ubuntu14”(标签将在恢复时更改,这有助于识别)
  • 将 8GB 标记为“Ubuntu16”(标签将在恢复时更改,这有助于识别)
  • 使用驱动器开头剩余的未分配空间创建 NTFS 数据分区。类型 NTFS。
  • 将 NTFS 标记为“数据”

应用更改。应该看起来与此接近。请注意,我的 USB 驱动器为 1TB,因此我的 NTFS 分区要大得多。 GParted 屏幕截图


步骤3

准备好要恢复到U盘的操作系统。

创建新的虚拟机并安装操作系统。本例中为 Ubuntu14 服务器 32 位。我将 VM 安装驱动器设置为小于 USB 上的分区大小。 4GB。在安装过程中,我使用 MBR 而不是 LVM,并让安装创建一个交换分区。

创建新的虚拟机并安装其他操作系统。本例中为 Ubuntu16 服务器 64 位。我将 VM 安装驱动器设置为小于 USB 上的分区大小。 8GB。在安装过程中,我使用 MBR 而不是 LVM,并让安装创建一个交换分区。

对每个操作系统进行所需的任何更改、更新、安装。

关闭新虚拟机

开始克隆新虚拟机。

将其附加pmagic_2013_08_01.iso到每个新 VM 并从 ISO 引导。

查看每个虚拟机上的分区。请注意已安装操作系统的位置。两者都应该是/dev/sda1。 (如果不及时调整)

现在使用桌面图标中的clonezilla 克隆每个操作系统。我将通过 ssh 将克隆的图像放置在桌面上,因此在启动 clonezilla 之前设置网络。

克隆兹拉选项:

  • device-image -- 将设备 /dev/sda1 克隆到映像
  • ssh_server——将图像放置在我的桌面上。把你的放在你能拿到的地方。
  • 初学者模式——大多数默认值都可以工作
  • saveparts——我们只想要操作系统分区。
  • 为图像指定一个您稍后会识别的名称。
  • sda1——选择操作系统分区。应该只是一种选择,但也可能不是。
  • 跳过检查/修复源文件系统——虚拟机应该全部干净并准备就绪
  • 是的,检查保存的图像 - 验证克隆图像是一个好的文件。按照提示操作。
  • 等待。
  • 完成的! -- 此时关闭电源就可以了。

步骤4

将操作系统映像恢复到 USB 驱动器。

返回到未连接虚拟驱动器的“测试”虚拟机并从pmagic_2013_08_01.iso.

将 USB 驱动器传递给“测试”虚拟机。

从桌面图标启动分区编辑器。我们又回到这里了。请参阅屏幕截图。

将带有 USB 分区的操作系统与映像分区相匹配。

Ubuntu14:

  • 镜像分区--/dev/sda1
  • USB分区--/dev/sda3

Ubuntu16:

  • 镜像分区--/dev/sda1
  • USB分区--/dev/sda2

笔记: 默认情况下,此版本的clonezilla 会将映像恢复到其所在的同一分区。/dev/sda1/dev/sda1。这不是我们想要的,所以这个 hack 会将图像恢复到 USB 分区。

clonezilla hack 将映像恢复到克隆的另一个分区:

使用新的分区 ID 重命名映像目录中的所有文件。

/home/jc/clonezilla_images/ubuntu14/sda1* 到 /home/jc/clonezilla_images/ubuntu14/sda3*

修改文件 /home/jc/clonezilla_images/ubuntu14/parts 的内容。将“sda1”替换为“sda3”

Ubuntu16 相同,调整数字 sda2。

笔记:我从 VM 和 USB 上的设备 sda 开始。如果您使用其他设备(例如 /dev/sdb),则需要更改更多文件。在同一设备上开始使用两者更简单。 /dev/sda。

通过clonezilla将镜像恢复到USB驱动器

克隆兹拉选项:

  • device-image -- 从映像恢复设备 /dev/sda1
  • ssh_server——或者你把镜像放在哪里。
  • 初学者模式——大多数默认值都可以工作
  • Restoreparts——恢复单个分区
  • 选择要恢复的图像
  • 为镜像选择正确的USB分区——Ubuntu14到sda3; Ubuntu16 转 sda2
  • 按照提示操作。
  • 等待。
  • 输入命令行提示符。 -- 还有更多图像需要恢复

重新启动 clonezilla 并对所有图像重复此操作。

我的 USB 在恢复之间从虚拟机上卸载,因此必须再次通过 USB 驱动器。


步骤5

将 GRUB 安装到 USB 驱动器

Grub 引导加载程序将安装到 USB 驱动器的前 512 字节。该加载程序将指向 grub.cfg 文件。让我们将我们的分区放在 Ubuntu16 分区上。它可以是任何地方grub可以读取。

我们将使用我们的主机操作系统来执行此操作。

您可以在虚拟机中使用实时操作系统来完成此任务。

应该使用当前带有 grub2 的 Linux 操作系统。

连接 USB。

我的 USB 驱动器当前已安装为设备/dev/sdf。您的设备将有所不同。

grub.cfg安装将要居住的分区。

笔记:每个恢复的操作系统都会有一个 grub.cfg 文件,因为它是虚拟机中的可引导操作系统。验证您是否指向并修改 USB 引导加载程序指向的 grub.cfg。

Ubuntu16 ext4

sudo mount /dev/sdf2 /media/usb_u16

将 grub 引导加载程序安装到 USB 设备

sudo grub-install --recheck --boot-directory=/media/usb_u16/boot /dev/sdf

这会将配置文件指针放置到 Ubuntu16 分区引导目录。 Ubuntu 的通用位置。你的可以在任何地方。

安装完成。没有报告错误。

创建一个grub.cfg文件作为模板。

sudo grub-mkconfig --output=/media/usb_u16/boot/grub/grub.cfg

这里重要的是,它将grub-mkconfig探测 USB 驱动器并为我们安装在 USB 驱动器上的操作系统创建启动项。我们不想要的部分是它还将探测主机上任何已安装的驱动器并为这些驱动器创建条目。

现在卸载所有内容并测试 USB 启动。

如果一切正常,您应该能够启动到 USB 操作系统。如果不回去的话...


步骤6 自定义 USB 驱动器上的 grub.cfg

当您启动此 USB 驱动器时,即使 USB 在另一台 PC 上启动,您也会看到主机 PC 上的操作系统。让我们解决这个问题。

让我们收集更多信息。

每个分区都分配有一个 UUID 号。获取我们的 USB 驱动器的 UUID。

blkid

/dev/sdf2: UUID="078ecc53-f73c-4cc7-9d45-f78aa534b7c5" TYPE="ext4" PARTUUID="00005785-02"
/dev/sdf3: UUID="a4654333-ee62-4dac-8c09-79a034e3125d" TYPE="ext4" PARTUUID="00005785-03"
/dev/sdf4: LABEL="data" UUID="667308CA28B6BB86" TYPE="ntfs" PARTUUID="00005785-04"
/dev/sdf5: UUID="8646e3f8-4f5c-40d4-a409-c4d65bf98d21" TYPE="swap" PARTUUID="00005785-05"
/dev/sdf6: UUID="61b8680c-22c9-4efc-98a1-2aaaa4a7f304" TYPE="swap" PARTUUID="00005785-06"

你的会有所不同。

保存 2 个交换分区 UUID 以供稍后使用。您将这些添加到/etc/fstab文件中以在启动时自动安装。

2 个操作系统分区 UUID:

/dev/sdf2: UUID="078ecc53-f73c-4cc7-9d45-f78aa534b7c5" -- Ubuntu16
/dev/sdf3: UUID="a4654333-ee62-4dac-8c09-79a034e3125d" -- Ubuntu14

将这 2 个文件复制memdisksuper_grub2_disk_hybrid_2.02s9.isogrub 配置目录以及splash.jpg映像(如果有)。

Ubuntu16 ext4

sudo mount /dev/sdf2 /media/usb_u16

sudo cp ./memdisk /media/usb_u16/boot

sudo cp ./super_grub2_disk_hybrid_2.02s9.iso /media/usb_u16/boot

sudo cp ./splash.jpg /media/usb_u16/boot

创建已创建的备份副本grub.cfg

sudo mv /media/usb_u16/boot/grub/grub.cfg /media/usb_u16/boot/grub/grub.cfg.orginal

创建我们的定制grub.cfg

sudo vi /media/usb_u16/boot/grub/grub.cfg

简而言之,我们只需要从 grub.cfg.orginal 复制最低限度的内容。 grub 设置内容 insmod...、显示内容 gfxmode=... 以及引导条目。通过搜索上面的 UUID 编号可以找到启动项。复制所有内容,包括子菜单条目或仅复制主条目。

即使启动项不存在,和memdisksuper_grub2_disk_hybrid_2.02s9.iso将允许我们从主机上的任何操作系统启动。

有很多原因表明这不是正确的方法,但它确实有效。

修改示例grub配置文件对于这个 USB 驱动器。

备份您的自定义grub.cfg文件,因为有些东西会尝试覆盖它。

sudo cp /media/usb_u16/boot/grub/grub.cfg /media/usb_u16/boot/grub/grub.cfg.custom


步骤7

调整已安装的操作系统

  • 将交换分区 UUID 添加到/etc/fstab
  • 将 USB 上的所有自动安装分区(NTFS 数据、其他操作系统 ext4)添加到/etc/fstab
  • 在 Ubuntu 上,我会根据我的更改调整默认的 grub 条目,这样当操作系统更新时,更改将传播到新的 grub 菜单。

测试一下!

答案2

关于 jc__ 教程的一些建议和评论

首先,非常感谢 jc__(再次)发布他的教程,介绍如何实现我最初的帖子中所述的目标。我可以确认该方法有效,尽管在启动已安装的操作系统时您可能需要执行一些额外的故障排除,这就是为什么我做出此回复以列举您在学习本教程时可能需要考虑的一些事情。

0. 如果您选择较旧的发行版,请仔细检查您完全启动它们

我惨痛地了解到,Fedora 8 太旧了,无法在更新的硬件(例如我当前的笔记本电脑)上启动(提醒一下,Fedora 8 于 2007 年左右发布;我的笔记本电脑是在 2010 年代制造的)。我不记得确切的细节(因为我是从一位同事那里了解到这一点的),但似乎内核在处理我的硬件时遇到了麻烦,并且无法正确安装所有内容,这就是为什么我最终放弃了 Fedora 8 而改用 Fedora 14(效果很好)。

如何您可以检查发行版是否可以在您的计算机上正常启动吗?一种简单的方法是使用目标发行版的 Live 版本从 USB 启动。如果 Live 版本一切正常启动,那么您应该可以毫无问题地通过 VM 安装发行版,将其分区克隆到 USB 记忆棒上并从 USB 启动。

就我而言,我使用了YUMI - 多重启动 USB 创建器在我的笔记本电脑上测试旧版 Fedora 的多个 Live 版本。当然,这个建议仅适用于您像我一样需要使用旧发行版的情况。

1.数据分区考虑使用FAT32或ext3/ext4

在某些时候,我的 Ubuntu 16.04 在处理 NTFS 格式的数据分区时遇到了麻烦。最终,我将其重新格式化为 FAT32——这是一种旧格式,任何 Linux 发行版都应该可以使用。如果你只使用 Linux,ext3/ext4 也应该没问题(据我所知,Windows 无法处理这些文件系统),尽管我自己没有测试过。

我现在使用数据分区作为在 USB 上的操作系统和主机上的操作系统之间轻松共享数据的一种方式。

2. 考虑使用辅助 USB 记忆棒进行分区克隆

对于第一步来说,拥有第二个 USB 记忆棒非常实用,因为您可以使用它来存储clonezilla.当clonezilla询问您要将/home/partimag/文件夹放在哪里时,请选择菜单中的第一个选项(就在 ssh_server 上方),同时没有将第二个 U 盘插入计算机,然后将其插入,等待大约 5 秒并按 Enter,然后选择第二个 U 盘USB 记忆棒在枚举文件clonezilla夹选项时/home/partimag/。后续操作将与 jc__ 枚举的操作相同。

当然,这种方法不会改变结果,并且优点是完全不涉及您的主机对 USB 记忆棒的分区以及目标操作系统所在分区的克隆/恢复。如果您不确定是否要进行磁盘分区,可以尝试此操作。

3. 如果加载内核后启动 USB 操作系统失败,请重建initrd/initramfs映像

dracut根据目标操作系统,您可能会遇到与我在本主题的一些评论中提出的问题类似的问题,例如启动 Fedora 24 时队列超时。

就我而言,除了 Fedora 8 的特殊情况(参见第 0 项)之外,我通过重建映像解决了该问题initrd。根据您的发行版及其最新版本,该映像也可以使用前缀initramfs而不是initrd。无论名称如何,该文件的用途都是相同的:在启动时在安装实际文件系统之前拥有一个临时文件系统。如果此文件损坏、错误或丢失,您将无法正确启动系统。

希望任何 Linux 发行版都附带一个实用程序来重建此映像。根据我的(简短)经验:

  • 较旧的发行版:mkinitrd
  • 最近的 Ubuntu 发行版:mkinitramfs
  • 最近的 Fedora 发行版:dracut

笔记:当(重新)构建映像时,每个实用程序都会/etc/fstab考虑该文件。利用这一点已经关联与 USB 操作系统的交换分区。在 中/etc/fstab,您可以使用 anUUID来表示分区,因此使用fdiskblkid来获取所需交换分区的 UUID 并/etc/fstab相应地更新。

要使用我列出的三个命令之一来重建映像,您需要首先进入chroot要重建initrd/initramfs映像的操作系统。我基本上遵循与此相同的方法教程,其中包括在主机上安装有缺陷的操作系统(即我们的 USB 操作系统之一)的分区,并使用一些绑定命令正确地安装到chroot其中。/mnt如果需要,您可以在文件夹中创建子文件夹。就我而言,为了 chroot 到 Fedora 14,我使用了以下命令:

sudo mkdir /mnt/usb_f14
sudo mount /dev/sdb3 /mnt/usb_f14
sudo mount --bind /proc /mnt/usb_f14/proc
sudo mount --bind /dev /mnt/usb_f14/dev
sudo mount --bind /sys /mnt/usb_f14/sys
sudo chroot /mnt/usb_f14

不要忘记事先检查/dev/sdX您的分区是什么fdisk。一旦您获得 USB 操作系统的 root 权限,请移至该/boot文件夹。如果您愿意,请old-在创建新图像之前重命名已存在的图像(如果有)以保留它(例如,您可以简单地在其前面加上 前缀)。然后,运行

ls /lib/modules/

这将列出您的 USB 操作系统上拥有的不同内核(大多数时候,您应该只有一个)。事实上,我上面列出的任何命令都要求您提供用于构建映像的内核。然后,根据您有权访问的实用程序,您应该运行以下三个命令之一(通过my-kernel,我表示 列出的内核之一ls /lib/modules/;请注意,如果您愿意,您可以为图像使用其他名称)

  • mkinitrd initrd-my-kernel.img my-kernel
  • mkinitramfs -o initramfs-my-kernel.img my-kernel
  • dracut initramfs-my-kernel.img my-kernel

根据您的操作系统,可能会出现一些有关缺少模块的消息。只要生成了镜像,您就可以忽略它们(我在为 Fedora 14 重建镜像时得到了一些,它仍然可以正常启动)。

另请注意,如果直接替换旧图像,则可能需要在命令中添加一个标志以强制覆盖。例如,对于dracut,您应该添加--force.有关其他命令,请参阅您的手册。完成后,卸载 USB 操作系统分区并重新启动计算机,并将启动顺序设置为首先从 USB 启动。您的 USB 操作系统现在应该可以正常启动。

最后,不要忘记记下您为新图像指定的名称(如果与初始图像的名称不同),因为您需要更新文件grub.cfg以将新图像考虑在内。

4. 仔细检查虚拟机上的分区

如果您在虚拟机中安装某个目标操作系统时无法自行选择分区(我在 Fedora 14 中遇到过这种情况),那么您最终可能会得到两个ext4分区,其中一个包含文件夹/boot,另一个包含该文件夹包含文件系统的其余部分。如果发生这种情况,请使用 jc__ 描述的方法克隆较大的分区,然后再次启动虚拟机,将文件夹复制到某个位置(例如,在辅助 U 盘上)/boot,然后在恢复后将其放入克隆的分区中。不要忘记/etc/fstab在重新构建initrd映像之前更新文件(请参阅 3),因为原始文件可能仍会列出两个ext4分区而不是一个。

5. 退出 USB GRUB,简单的方法

虽然 jc__ 建议使用super_grub2_disk_hybrid_2.02s9.isomemdisk获取主机上的所有选项,但您也可以在您的grub.cfg

menuentry 'Continue to host machine' {
    exit
}

这将使 USB 记忆棒上的 GRUB 退出并恢复主机的引导顺序。就我而言,由于我的主机是双启动笔记本电脑,因此在选择此菜单项后,我会立即获得机器的 GRUB 菜单。

我想发表的评论就到此为止。由于我在 Linux 故障排除方面没有太多经验,因此请随时评论这篇文章以指出错误或不准确的陈述。

答案3

将其放在答案位置,因为它又长又啰嗦。如果需要更正或添加答案,将编辑答案并删除它。

“grub.cfg(我将其放置在 Fedora 24 分区中,因此 /dev/sda2/”

“FC24 是 /dev/sda2”

“FC8 是 /dev/sda3”

好的,让我们做一些事情来帮助解决问题。

显示USB的分区布局

GParted 图形用户界面或sudo fdisk -l

显示 USB 分区的 UUID 号 blkid

显示安装 grub 时使用的命令。grub-installgrub-mkimage

在步骤 5 中使用的 VM 上,它是从硬盘 (VHD) 还是实时操作系统启动。使用了什么操作系统。

“我是否错误地恢复了分区,或者我可以“拯救”两个操作系统吗?”

我认为这不是恢复问题,而是 grub 安装问题。

查看 grub.cfg。

Entry:
Fedora (4.5.5-300.fc24.x86_64) 24 (Workstation Edition)
search ... --hint='hd0,msdos1'  913f30c2-4a22-44eb-a93d-9fad95764f5d
first HD and first partition. --hint='hd0,msdos1
partition UUID 913f30c2-4a22-44eb-a93d-9fad95764f5d
This tells us: /dev/sda1 and was probably the HD not USB. 
Expected.

Entry:
Fedora release 24 (Twenty Four) (on /dev/sda2)
search ... --hint-bios=hd0,msdos2 d4be737a-c4ea-44cd-a22d-781086854ec8
first HD and second partition --hint-bios=hd0,msdos2
partition UUID d4be737a-c4ea-44cd-a22d-781086854ec8
This tells us: /dev/sda2 and is the second partition on the HD not USB.
Not expected if this OS is on the USB.
Expecting second HD (the USB) NOT the same as the booted OS. Perhaps /dev/sdb2

Entry:
Fedora release 8 (Werewolf) (on /dev/sda3)
search ... --hint-bios=hd0,msdos3  8bc6e37c-53b1-4fe9-b242-5b0b9c8c575e
first HD and 3rd partition. --hint-bios=hd0,msdos3
partition UUID 8bc6e37c-53b1-4fe9-b242-5b0b9c8c575e
Not expected if this OS is on the USB.
Expectiong second HD (the USB) NOT the same as the booted OS. Perhaps /dev/sdb3

我们期望除第一个硬盘(或主机操作系统所在的硬盘)之外的任何硬盘的原因是因为计算机是从操作系统启动的(假设从硬盘而不是 ISO),然后插入 USB 驱动器并将成为下一个可用的高清。 /dev/sdX X 是驱动器号。

此时,您正在与启动的操作系统(主机)进行交互。 USB 驱动器已连接。主机操作系统可能已自动安装 USB。如果读/写挂载,这没问题。我更喜欢卸载(而不是弹出)USB 并在我确定的位置重新安装。

验证 USB 设备分配。 sudo fdisk -l 您知道 USB 的布局和大小,因此获取 /dev/sdX 信息。

或者

从主机上拔下 USB 插头。

命令dmesg

重新插入 USB。

命令dmesg

应该告诉您有关新设备和 /dev 分配的信息。 sdX。

将 USB 分区安装到预定的安装点。

例子:

sudo mount /dev/sdX /media/f24

sudo mount /dev/sdx /media/f8

/media/f24 -- the root of the Fedora24
/media/f8 -- the root of the Fedora8

将 grub 引导加载程序重新安装到 USB 驱动器并指向已安装的分区。

sudo grub-install --recheck --boot-directory=/media/f24/boot /dev/sdX

--boot-directory=/media/f24/boot

引导加载程序将在此处查找 grub.cfg 文件。顺便说一句,已经存在的那个不会让我们到达那里。

/dev/sdX

这是 USB 驱动器。从上面收集的信息。这里没有分区信息,只有设备。

创建一个新的 grub.cfg 文件,该文件将覆盖 Fedora24 安装创建的文件。

sudo grub-mkconfig --output=/media/f24/boot/grub/grub.cfg

这将覆盖 Fedora24 安装中的 grub.cfg。

验证新的 grub.cfg 文件。

应具有当前正在运行的主机操作系统信息条目。

应该有 USB 驱动器操作系统。这些将位于与主机操作系统不同的设备上。 /dev/sdX。

还可以使用命令验证:blkid

USB 驱动器分区的 UUID 编号应与新 grub.cfg 中的 UUID 编号匹配。

笔记: USB 启动时 /dev/sdX 分配将不正确。没关系。 UUID 分区号仍将“找到”正确的分区并启动正确的操作系统。稍后将在自定义 grub.cfg 中对此进行调整。

还要验证 USB 启动上加载的 grub.cfg 是否正确。

上述命令更改新 grub.cfg 中的颜色后

添加以下行:

# Set menu colors
set menu_color_normal=red/black
set menu_color_highlight=light-gray/red

猜测字里行间:

### END /etc/grub.d/01_users ###
and
### BEGIN /etc/grub.d/10_linux ###

当您看到不同颜色的 grub 菜单时,您就知道加载了正确的菜单。grub-install是正确的。

不要卡在这部分,您可以简单地更改菜单项名称......

如果新的 grub.cfg 通过了 UUID 验证,您就知道它grub-mkconfig是正确的。


故障排除第 2 部分。

查看 Ferora 24 菜单条目...

GRUB 以 3 种不同的方式设置根目录。(不是 Fedora 内核根目录。那是别的。)

1. set root='hd1,msdos2'

这是一组“硬”根。第二个。 2号开车。分割。

这里的“技巧”是驱动器首先可以在每次启动时更改。首先探测的设备将成为第一个。

2. search --no-floppy --fs-uuid --set=root --hint-bios=hd1,msdos2 --hint-efi=hd1,msdos2 --hint-baremetal=ahci1,msdos2 d4be737a-c4ea-44cd-a22d-781086854ec8

里面的这个条目if基本上是说我们想要带有 UUID xxx 的分区,但是开始寻找第二个。开车2号。分割。

3. search --no-floppy --fs-uuid --set=root d4be737a-c4ea-44cd-a22d-781086854ec8

这也在if声明中,表示在你能看到的任何地方寻找 UUID xxx 的分区,除了软盘驱动器。

我们想要使用第三名句法。

笔记:GRUB 从 0 (hd0 - hdn) 开始对驱动器进行计数,并从 1 (msdos1 - msdosn) 开始对分区进行计数。 GRUB2手动的

“在我看来,initrd/initramfs 可能有问题”

是的,我也这么认为,但不是文件本身,而是 GRUB 在哪里寻找文件。

GRUB 正在寻求从 加载 Linux 内核/boot/vmlinuz-0-rescue-731a5ce6cbc840ad9cad96ddf48e5db8,或者更准确地说 GRUBroot/boot/vmlinuz-0-rescue-731a5ce6cbc840ad9cad96ddf48e5db8

GRUBroot = 分区 d4be737a-c4ea-44cd-a22d-781086854ec8。如果我们设置正确的话。

initrd 是一样的。

GRUBroot/boot/initrd-2.6.23.1-42.fc8.img

顺便提一句:您的第一个 grub.cfg 让 Fedora24 加载不同的内核和 initrd。由于生产内核和语言等原因,您可能想再次恢复使用这些...

linux /boot/vmlinuz-4.5.5-300.fc24.x86_64 root=UUID=d4be737a-c4ea-44cd-a22d-781086854ec8 ro rhgb quiet LANG=fr_BE.UTF-8

initrd /boot/initramfs-4.5.5-300.fc24.x86_64.img

验证文件是否仍然存在。

“找不到/dev/root”

是的,因为

linux /boot/vmlinuz-0-rescue-731a5ce6cbc840ad9cad96ddf48e5db8 root=/dev/sdc2

就是说内核根在3号。开车2号。分割。

让我们通过文本编辑更改 grub.cfg 来创建一个新条目。完成此操作后删除其他内容。

menuentry 'Fedora 24 on USB drive' {
    insmod part_msdos
    insmod ext2

    ## set the GRUB root using UUID only.
    search --no-floppy --fs-uuid --set=root d4be737a-c4ea-44cd-a22d-781086854ec8

    ## is F24 root somewhere else?
    ## Probably not.. remove kernel switch root=/dev/sdc2
    linux /boot/vmlinuz-0-rescue-731a5ce6cbc840ad9cad96ddf48e5db8
    initrd /boot/initramfs-0-rescue-731a5ce6cbc840ad9cad96ddf48e5db8.img
    ## I think you want these instead if the files still exist. Make adjustments by adding and removing comments ##
    ## commented out
    # linux /boot/vmlinuz-4.5.5-300.fc24.x86_64 root=UUID=d4be737a-c4ea-44cd-a22d-781086854ec8 ro rhgb quiet LANG=fr_BE.UTF-8
    # initrd /boot/initramfs-4.5.5-300.fc24.x86_64.img  
}

menuentry 'Fedora 8 on USB drive' {
    insmod part_msdos
    insmod ext2

    ## set the GRUB root using UUID only.
    search --no-floppy --fs-uuid --set=root 8bc6e37c-53b1-4fe9-b242-5b0b9c8c575e

    ## is F8 root somewhere else?
    ## Probably not.. remove kernel switch root=LABEL=/
    ## not familure with this switch, but removed.
    linux /boot/vmlinuz-2.6.23.1-42.fc8 ro rhgb quiet
    initrd /boot/initrd-2.6.23.1-42.fc8.img
    ## I think you want these instead if the files still exist. Make adjustments by adding and removing comments ##
    ## commented out    
    # linux /boot/vmlinuz-2.6.23.1-42.fc8 ro root=LABEL=/ rhgb quiet
    # initrd /boot/initrd-2.6.23.1-42.fc8.img   
}

无需更新,只需重新启动至 USB 驱动器即可。

请记住,在完成此操作后,您将需要进行修改etc/grub.d/40_custom,以便 Fedora 内核更新将探测并生成正确的新 GRUB 菜单项。

并不肯定这可以做到。每次 Fedora 内核更新时,您可能都必须手动更新 grub.cfg。

linux /boot/vmlinuz-4.5.5-300.fc24.x86_64 root=UUID=d4be737a-c4ea-44cd-a22d-781086854ec8 ro rhgb quiet LANG=fr_BE.UTF-8

initrd /boot/initramfs-4.5.5-300.fc24.x86_64.img

答案4

提供的答案提供了很好的信息,并提供了对过程的洞察,我认为这非常重要(特别是对于自学型类型,这描述了我们在 SE 的很多人)。

然而,有一个免费的项目,对于那些来到这里只是想完成类似的事情(如果不是完全相同的话)的人来说,或多或少可以实现类似的目标。

https://www.pendrivelinux.com/yumi-multiboot-usb-creator/

这个名字很傻。图形很俗气。这些工具很有效,而且效果非常好。至少他们提供的源代码可能会对您有所帮助。

相关内容