use*_*329 6 linux boot grub2 qemu
为了了解 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
Run Code Online (Sandbox Code Playgroud)
我想逐步完成引导序列,所以我希望 grub 声称缺少内核,然后我想通过安装内核来修复它,并继续添加东西直到 X。
现在我得到
错误:没有这样的设备
但预计
错误:没有配置文件
形成救援提示,ls
给出
(hd0) (fd0)
Run Code Online (Sandbox Code Playgroud)
问题: * grub 在寻找什么设备?那是指主机系统吗?【部分解决,UUID和虚拟文件系统的UUID是一样的】 *为什么Grub找不到设备?
如果我从 VM 内的 live-cd(我选择 Bodhi-linux,因为这是一个小型二进制发行版)安装 grub(除了 grub),一切正常。qemu 会不会给boot分区一个不同的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
Run Code Online (Sandbox Code Playgroud)
请注意,正如 Giles 指出的那样,这仅适用于 x86 架构。
如果您想了解正确的顺序,则需要在安装内核之前在 QEMU 中安装主机系统。虽然这种方法对于了解启动过程似乎违反直觉,但它是唯一的有效方法。让我解释:
任何操作系统的运行系统至少有3个部分:
计算机以两种模式运行:
所有 x86 处理器都以这两种模式的某种形式运行,无论它们多么复杂或运行速度有多快。有关更多信息,请参阅我链接的维基百科文章右侧的列表。
如果您查看正确安装 Grub 时复制的文件,您将看到包含文本 Stage 的文件。应该有 3 个。Stage1*、Stage1_5* 和 Stage2*
boot.img
嵌入在 MBR/EFI 中。它被配置为连接到磁盘并在最后加载core.img
core.img
加载扇区 0-62,通常称为 BootSector。按照惯例,这些扇区不包含任何内容,因此放置在其中的项目永远不会被覆盖或自动更新参见GNU Grub
现在我这样说的原因是违反直觉的:您不能从“如何工作”的第 3 步开始,然后逐步完成“与 Grub 的关系”。Stage1.5 完成后,Stage_2 将向您发送救援提示,如内核和初始 RAM 磁盘(如果您有的话),在您的情况下,一旦解压缩,就无需设置设备hd0
。Grub 报告的错误也是正确的。
错误:没有这样的设备
是正确的,因为没有要hd0
设置的操作系统,因此没有操作系统告诉 Grub Stage_2,“嘿,我是需要加载的操作系统。” 因此,您必须逆向工作,先构建或安装操作系统,然后安装内核,最后安装引导加载程序。在您的情况下,您需要配置 QEMU 以将 LiveCD 的 ISO 映像加载为 CDROM,然后在虚拟磁盘上安装操作系统,hd0
然后配置引导加载程序。有关 LiveCD 的列表,请参阅DistroWatch 主要发行版。如果您对更少的膨胀感到更舒服,请尝试基于源的发行版,例如 Gentoo。
归档时间: |
|
查看次数: |
4207 次 |
最近记录: |