我发现了一些相关的问题,但没有一个能解决我的问题。
我有一台带有 Windows 硬盘的笔记本电脑。我想在第二个硬盘上安装 Debian,所以我用一个球童将其连接起来,并移除了 Windows 硬盘(以防万一,你知道)。然后我成功安装了 Debian,并将 GRUB 安装在同一磁盘中,因为当时它是唯一的一个。然后我把Windows硬盘放回去。
现在,我可以从 BIOS 选择要启动的驱动器。 Windows 驱动器可以完美启动,但是当我选择从 Debian 驱动器启动时,它会显示 GRUB 菜单,然后是一个带有闪烁破折号的黑屏。
如果我移除 Windows 硬盘,我可以成功启动 Debian,所以问题一定出在 GRUB 配置上。
因此,我选择 GRUB 控制台。我检测到 linux 位于 (hd0,5) 分区中,并且 vmlinuz 和 initrd 可以从根目录访问,所以我采用通常的方式:
grub> set root=(hd0,5)
grub> linux /vmlinuz root=/dev/sda5
grub> initrd /initrd.img
grub> boot
然后我可以看到很多 initrd 输出,然后输出一堆Begin: Running /scripts/local-block ... done.
消息,最后失败并显示sda5 doesn't exists. Dropping to a shell
类似消息。但是好吧...你知道...它确实存在,所以我被阻止了。
答案1
您有两个问题:识别驱动器和识别分区。
Grub 从 0 开始计算分区,Linux 从 1 开始计算分区。因此,如果 Grubhd0
是 Linux 的sda
,那么 Grub(hd0,5)
就是 Linux 的sda6
。
您在 Grub 中选择作为“根”的分区不一定是 Linux 的根分区。在 Grub 中,“root”只是一个快捷方式,无需在文件名前面键入分区名称。如果您有一个单独的/boot
分区,那么您通常会将其设置为 Grub 根目录,因为 Grub 只关心其中的内容/boot
(内核映像和初始 ramdisk 映像)。 Linux 不关心里面有什么,/boot
除了升级它。
Grub 和 Linux 之间的驱动器编号可能不匹配。 Grub 依靠计算机的 BIOS 来枚举驱动器。 Linux 有自己的驱动程序。当磁盘通过不同的接口连接时,很难预测它们将被枚举的顺序;这取决于哪个磁盘控制器的响应速度更快。所以Grub的hd0
不一定是Linux的sda
。
为了使计算机可靠地启动,无论磁盘如何连接以及控制器的响应时间如何,请使用标签或 UUID 而不是字母/数字指定。一旦启动,运行update-grub
——它通常应该/boot/grub/grub.cfg
使用 UUID 生成一个文件。 Grub 和 Linux 都会在启动时枚举可用分区并记住它们的 UUID。在 中grub.cfg
,您应该看到类似这样的行
search --no-floppy --fs-uuid --set=root 82aecd65-6423-4d95-9319-3034263ee747
和
linux /vmlinux root=UUID=82aecd65-6423-4d95-9319-3034263ee747 ro