将 grub 放在虚拟磁盘上

将 grub 放在虚拟磁盘上

为了了解 Linux 启动过程,我将 grub 放入磁盘映像文件中并尝试使用 qemu 启动。我目前还没有将任何内核映像放入驱动器中,只是将 grub 放入驱动器中。我安装 grub 使用

kpartx -av mydrive.img
losetup /dev/loop1 /dev/mapper/loop0p1
mount /dev/loop1 mnt/mydrive/
cd mnt/mydrive/boot
grub-install --no-floppy --boot-directory=. -v /dev/loop0

我想一步一步地完成引导顺序,所以我希望 grub 声称内核丢失,然后我想通过安装内核来修复这个问题,并继续添加东西一直到 X。

现在我明白了

错误:没有这样的设备

但预计

错误:没有配置文件

形成救援提示,ls给出

(hd0) (fd0)

问题: * grub 正在寻找什么设备?这是指主机系统吗? [部分解决,UUID与虚拟文件系统的UUID相同] * 为什么Grub找不到设备?

如果我从 VM 内的 live-cd(我选择了 Bodhi-linux,因为这是一个小型二进制发行版)安装 grub(除了 grub 之外什么都没有),那么一切都可以正常工作。 qemu会给启动分区一个不同的uuid,而不是在外面使用吗?

这是虚拟驱动器的分区表:

Disk mydrive.img: 264 MB, 264241152 byte
32 huvuden, 63 sektorer/spår, 256 cylindrar, totalt 516096 sektorer
Enheter = sektorer av 1 · 512 = 512 byte
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Diskidentifierare: 0xebe6ebdb

       Enhet Start     Början        Slut     Block    Id  System
mydrive.img1            2048      516095      257024   83  Linux

答案1

看来 grub 默认情况下没有安装该分区类型的模块(我假设是 DOS/MBR 分区标签)核心.img

还可以使用以下命令来安装所需的模块:

grub-install --modules part_msdos --root-directory=. /dev/loop0

然后 grub 应该能够读取分区表、文件系统以及mnt/mydrive/boot.

因此 grub 命令ls应该输出如下内容:

(hd0) (hd0,msdos1) (hd0)

答案2

请注意,正如 Giles 指出的那样,这仅适用于 x86 架构。

背景

如果您想了解正确的顺序,则需要在安装内核之前在 QEMU 中安装主机系统。虽然这种方法对于了解启动过程似乎违反直觉,但它是唯一的有效方法。让我解释:

任何操作系统的运行系统至少有3个部分:

  1. 一个内核
  2. 装载机
  3. 最终的引导操作系统。

计算机以两种模式运行:

  1. 实模式
  2. 保护模式,有时被错误地称为虚拟模式。

所有 x86 处理器都以这两种模式的某种形式运行,无论它们多么复杂或运行速度有多快。有关更多信息,请参阅我链接的维基百科文章右侧的列表。


这是如何运作的

  1. 所有计算机均以实模式启动。
  2. 实模式可以执行诸如检查 BIOS 设置、确保所有设备均已连接以及控制时钟计时等操作。
  3. 一旦实模式完成检查,控制权就会传递给加载程序,也称为引导加载程序。引导加载程序的作用正如其名称所暗示的那样,通过加载足够的代码段来将 PC 的控制从实模式转移到保护模式。有些引导加载程序在“接管”开始时实现此传输,有些在最后完成,但大多数是分阶段完成的。 请参阅引导
  4. 一旦引导加载程序完成加载阶段,操作系统就可以安全有效地处理所有其他操作,因为 PC 现在处于“永久保护模式”,直到下次重新启动。

这与 Grub 有何关系

如果您查看正确安装 Grub 时复制的文件,您将看到包含文本 Stage 的文件。应该有 3 个。Stage1*、Stage1_5* 和 Stage2*

  1. Stage1 加载boot.img嵌入在 MBR/EFI 中。它被配置为连接到磁盘并在最后加载core.img
  2. Stage1_5 用于core.img加载扇区 0-62,通常称为 BootSector。按照惯例,这些扇区不包含任何内容,因此放置在其中的项目永远不会被覆盖或自动更新
  3. 一旦 Stage_2 开始,前 62 个扇区和内核路径就已确定。 Stage_2 加载内核及其帮助文件,最自然的是初始RAM盘进入记忆。然后,RAM 磁盘和内核将被解压缩并用于设置您的系统并将控制权转移到您选择的 Linux 操作系统。

GNU GRUB


现在我这么说的原因是违反直觉的:您不能从“这是如何工作的”的第 3 步开始,然后逐步完成“这与 Grub 的关系”。 Stage1.5 完成后,Stage_2 将向您发送救援提示,如内核和初始 RAM 磁盘(如果您有的话),在您的情况下,一旦解压缩,就无需设置设备hd0。 Grub 报告的错误也是正确的。

错误:没有这样的设备

是正确的,因为没有hd0要设置的操作系统,因此没有操作系统告诉 Grub Stage_2,“嘿,我是需要加载的操作系统。”因此,您必须逆向工作,先构建或安装操作系统,然后安装内核,最后安装引导加载程序。在您的情况下,您需要配置 QEMU 以将 LiveCD 的 ISO 映像加载为 CDROM,然后在虚拟磁盘上安装操作系统,hd0然后配置引导加载程序。有关 LiveCD 的列表,请参阅DistroWatch 主要发行版。如果您对更少的膨胀感到更舒服,请尝试基于源的发行版,像Gentoo一样

相关内容