我有一台 HP 4530s 笔记本电脑,我将原装 HDD 换成了 180GB Intel 335 SSD。问题是,我无法从它启动。
我已经通过 cpio 从 HDD 传输了我的 openSUSE 12.3 x86_64,如下所述: http://www.linuxjournal.com/magazine/hack-and-migrate-new-hard-drive
我还使用以下命令重新安装了 GRUB:
mount /dev/sda1 /mnt/
mount --bind /dev/ /mnt/dev
mount --bind /proc/ /mnt/proc
mount --bind /sys/ /mnt/sys
chroot /mnt/
grub2-mkconfig
grub2-install /dev/sda
其中一些肯定起了一定作用,因为现在我可以从 openSUSE Rescue CD 启动,转到“从 HDD 启动”,一切正常。但如果我尝试直接从 SSD 启动,HP BIOS 会提醒我首先应该在那里安装操作系统。
我尝试了相同方法的变体,例如从 BIOS 启用 UEFI 并安装 grub2-efi,但遇到了同样的问题。
我有一种奇怪的感觉,好像我缺少了一些基本的东西。有什么更“系统”的方法吗?
提前致谢!
答案1
这您引用的 Linux Journal 文章遗漏了一个对某些计算机来说可能很重要的步骤 — 使用 MS-DOS 分区表格式对新驱动器进行分区时,必须将驱动器上的一个主分区标记为活动分区。此步骤经常被遗忘,并且没有任何明显的问题;但是,在某些计算机上,BIOS 会执行更严格的检查,并拒绝从没有活动分区的磁盘启动。
在 Linux 中将分区标记为活动的方法fdisk
是使用a
命令;它会询问分区号并切换该分区的活动标志。如果您使用该p
命令打印分区表,活动分区将由列*
中的字符标记Boot
。
如果磁盘上只安装了 Linux,并且引导加载程序安装在 MBR 中,则哪个主分区标记为活动分区并不重要,只要恰好有一个这样的分区即可。
如果您有兴趣,下面有更多详细信息:
(所有这些仅适用于使用 MS-DOS 分区表格式时;GPT 分区表的情况明显不同,尤其是与 UEFI 一起使用时。)
当 MS-DOS 分区表被引入时,MBR 旨在包含一小段代码,该代码会搜索主分区(最多可以有 4 个),如果恰好有一个分区设置了活动标志,则加载该分区的第一个扇区(引导扇区)并将控制权移交给那里的代码,然后代码将从该分区启动操作系统。如果没有活动分区,或者有多个分区设置了活动标志,则 MBR 代码会打印一条消息并调用int $0x18
以向 BIOS 报告启动失败。
但是,用于启动 Linux 的许多引导程序通常安装在 MBR 中,并用加载引导程序其余部分的代码替换标准 MBR 代码,然后提供启动菜单等。此代码不使用分区表中的活动标志,因此,即使磁盘上没有活动分区,安装在 MBR 中的 GRUB 也可以启动并加载 Linux 内核;Linux 也不以任何方式使用活动分区标志。
许多 BIOS 版本只检查0xaa55
MBR 末尾的魔数和初始jmp
命令代码来确定 MBR 是否有效,并且会很乐意将控制权转移到 MBR 中的代码,而不管 MS-DOS 分区表的内容如何。但是,在某些情况下,BIOS 开发人员决定“更有帮助”并在引导代码中添加更多检查 - 例如,BIOS 可能会查看 MBR 中的 MS-DOS 分区表,如果那里没有活动分区,则认为磁盘不可引导。如果 MBR 不包含从活动分区加载引导扇区的常用代码,则此检查会给出错误的结果,但 BIOS 开发人员可能不认为这是问题。如果您的计算机有这样的 BIOS,则您的引导磁盘上必须有一个活动分区,即使 MBR 中的代码和引导加载程序的其余部分实际上并未使用活动标志。