使附加的媒体可启动

Posted

技术标签:

【中文标题】使附加的媒体可启动【英文标题】:Make attached media bootable 【发布时间】:2015-12-16 22:28:39 【问题描述】:

大家晚上好!我已经为此工作了一段时间,但无法弄清楚。我只是想在附加媒体上安装引导加载程序的工作引导代码,但无法弄清楚!!!我尝试过 grub legacy、lilo 和 grub2... 主机系统的驱动器列为 /dev/sda*,目标附加媒体列为 /dev/sdb* 并挂载到 /mnt/target。

对于 grub legacy,我尝试使用已经安装了它的另一个媒体(/dev/sdc*、/mnt/source)并尝试了以下肮脏的黑客攻击:

dd if=/mnt/source/boot/grub/stage1 of=/dev/sdb bs=446 count=1
dd if=/mnt/source/boot/grub/stage2 of=/dev/sdb bs=512 seek=1

这实际上会启动到一个 grub 界面,您可以在其中输入以下内容:

root (hd0,0)
setup (hd0)

我没有收到任何错误消息,但是 grub 会启动到屏幕上的垃圾然后停止。

使用 lilo,我实际上已经安装了软件包并尝试设置(在创建 lilo.conf 之后):

default=Test1
timeout=10
compact
prompt
lba32
backup=/mnt/target/boot/lilo/MBR.hda.990428
map=/mnt/target/boot/lilo/map
install=/mnt/target/boot/lilo/boot.b
image=/mnt/target/boot/vmlinuz
    label=Test1
    append="quiet ... settime"
    initrd=/mnt/target/boot/ramdisks/working.gz

然后在提示符下执行以下操作:

$ lilo -C /mnt/target/boot/lilo/lilo.conf -b /dev/sdb
Warning: /dev/sdb is not on the first disk
Fatal: Sorry, don't know how to handle device 0x0701

使用 grub2,我尝试了类似的方法:

grub-mkconfig -o /mnt/target/boot/grub/grub.cfg
Generating grub.cfg ...
Found linux image: /boot/vmlinuz-3.11.0-12-generic
Found initrd image: /boot/initrd.img-3.11.0-12-generic
Found memtest86+ image: /boot/memtest86+.bin
  No volume groups found
done

我什至无法正确或在正确的位置生成 grub.cfg,所以我放弃了这个...上面列出的条目是针对主机系统的,而不是目标系统。

我可以提供帮助解决此问题所需的任何其他信息。

-更新-

在与媒体合作一段时间后,我决定运行“fdisk -l”并得到以下信息:

Partition 1 has different physical/logical beginnings (non-Linux?):
phys(0,32,33) logical(0,37,14)
Partition 1 has different physical/logical endings:
phys(62,53,55) logical(336,27,19)

我还应该注意,当我尝试挂载分区时,我总是会收到一条消息:

EXT4-fs (sdb1): couldn't mount as ext3 due to feature incompatibilities

不确定这是否仅特定于busybox,或者是否与fdisk 输出有关。无论如何,我不知道 fdisk 信息是否表明磁盘几何结构可能存在问题,可能导致所有这些引导加载程序无法工作。

【问题讨论】:

【参考方案1】:

grub legacy 的第一阶段引导扇区代码位于“stage1”中,grub(2) 位于“boot.img”中。第一阶段代码包含要加载到同一磁盘上的下一阶段的地址。

在其他磁盘上,要加载的下一阶段的地址可能(并且可能)不同。

我认为使用 chroot 和 grub-install 会是更好的选择。 见Grub2/Installing。

关于磁盘/分区结构:

dd if=/mnt/source/boot/grub/stage2 of=/dev/sdb bs=512 seek=1

可能已经覆盖了 sdb 的 MBR 中的分区表。

【讨论】:

感谢您的回复,但看起来您的 dd 命令与已在使用的命令匹配。而且它不会覆盖分区表,因为它跳过了前 512 个字节(通过 seek=1 开关)。还有其他想法吗? "My" dd 命令是您的副本。你是对的,seek count 从 0 开始,而不是 1。 早上好,谢谢您的回复。寻找不是从 0 开始,但实际上是从 1 开始。如果我寻找 0,那么数学将是 0*whatever=0,实际上不会跳过任何东西。还有其他想法吗? 晚安 user1646428,seek=0 确实将我们置于文件的开头。寻找!=跳过。你的问题呢,已经试过 chroot+grub-install 了吗? 感谢您的持续帮助 snayob。如果我设置 'bs=512 seek=1',那么这意味着写入将在前 512 个字节之后开始 - 跳过前 512 个字节(512*1=512)。如果我使用'bs=512 seek=0',那么这意味着我从磁盘/分区的开头(512*0=0)开始。在这一点上,我知道 dd 调用可以正常工作,因为我可以将媒体引导到 grub 旧版控制台并运行诸如“root (hd0,0)”和“setup (hd0)”之类的命令,一切都运行没有错误,但随后启动胡言乱语。不知道问题出在哪里。

以上是关于使附加的媒体可启动的主要内容,如果未能解决你的问题,请参考以下文章

使用可启动磁盘使 linux 机器 grub 可启动

调试期间在 Visual Studio 中自动附加到子进程

RTSP/Onvif协议EasyNVR平台流媒体内核启动失败的原因是什么?

有没有一种方法可以自动将 .natvis 附加到使用 -DebugExe 启动的调试会话?

Linux 主要目录含义

Linux 主要目录含义