`install-grub` 声称我有多个分区标签并且嵌入是不可能的

AJM*_*eld 25 grub2

我正在尝试在我的非启动台式计算机上安装 GRUB,但我遇到了几个错误。讨论这些错误的其他来源将它们归因于在第一个分区之前缺少可用磁盘空间(我有必要的可用空间),或者有问题/boot/grub/grub.cfg(即使正确重新生成该文件后问题仍然存在)。

我使用实时 USB 启动并尝试使用以下命令重新安装 GRUB,但我遇到了阻止其工作的错误:

$ sudo 挂载 /dev/sda1 /mnt
$ sudo grub-install --root-directory=/mnt /dev/sda
为 i386-pc 平台安装。
grub-install: 警告:尝试将 GRUB 安装到具有多个分区标签的磁盘。这个还不支持。。
grub-install: 警告: 嵌入是不可能的。只能通过使用阻止列表在此设置中安装 GRUB。但是,阻止列表是不可靠的,不鼓励使用它们。
grub-install: 错误: 不会继续使用阻止列表。

但是,/dev/sda似乎已正确格式化以安装 grub:

$ sudo fdisk -l /dev/sda

磁盘 /dev/sda:111.8 GiB,120034123776 字节,234441648 个扇区
单位:1 * 512 = 512 字节的扇区
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x8d91017b

设备引导开始结束扇区大小 ID 类型
/dev/sda1 * 2048 234440703 234438656 111.8G 83 Linux

$ blkid /dev/sda1
/dev/sda1: UUID="84e9ff65-c4ba-42eb-8a6d-ebc703fae1f7" TYPE="ext4" PARTUUID="8d91017b-01"

它在开始时具有标准的 1 MiB 可用空间,并且/dev/sda1格式正确。我曾尝试使用grub-mkconfig重建配置文件:

$ for f in proc sys dev dev/pts ; 做 sudo mount --bind /$f /mnt/$f ; 完毕
$ sudo chroot /mnt
# grub-mkconfig -o /boot/grub/grub.cfg
正在生成 grub 配置文件...
找到 linux 映像:/boot/vmlinuz-3.19.0-26-generic
找到 initrd 映像:/boot/initrd.img-3.19.0-26-generic
找到 linux 映像:/boot/vmlinuz-3.19.0-23-generic
找到 initrd 映像:/boot/initrd.img-3.19.0-23-generic
为 EFI 固件配置添加启动菜单项
完毕

但是,grub-install无论是在chroot环境中还是在环境外,我在运行时仍然收到相同的错误消息。

在传统模式下启动实时 USB,我得到同样的错误;唯一的区别是grub-mkconfigchroot环境中运行的输出:

# grub-mkconfig -o /boot/grub/grub.cfg
正在生成 grub 配置文件...
找到 linux 映像:/boot/vmlinuz-3.19.0-26-generic
找到 initrd 映像:/boot/initrd.img-3.19.0-26-generic
找到 linux 映像:/boot/vmlinuz-3.19.0-23-generic
找到 initrd 映像:/boot/initrd.img-3.19.0-23-generic
找到 memtest86+ 镜像:/boot/memtest86+.elf
找到 memtest86+ 镜像:/boot/memtest86+.bin
在 /dev/sdc1 上找到 Windows 7(加载程序)
完毕

如何正确安装 grub?

eni*_*ist 32

Nuke 引导扇区和第一个分区之间的间隙。

# dd if=/dev/zero of=/dev/sdX seek=1 count=2047
Run Code Online (Sandbox Code Playgroud)

这是因为第一个分区从扇区 2048 开始。有些分区开始得更早,尤其是在由 Windows 分区的驱动器上。可以肯定的是,运行

# fdisk -l /dev/sdX
Run Code Online (Sandbox Code Playgroud)

在开始之前并检查以查看第一个分区的开始位置。使用count=S-1,其中 S 是第一个分区的开始。


小智 3

可以在 GPT 记录所在的位置创建一个新分区,然后使用 擦除它dd。这样,将仅保留 MBR 记录。

假设问题设备是/dev/sda

在最初的 1 MiB 中创建一个新分区

$ parted /dev/sda
$ mkpart primary ext4 0MiB 1MiB
$ quit
Run Code Online (Sandbox Code Playgroud)

然后,将新创建的分区清零

$ dd if=/dev/zero of=/dev/sda2
Run Code Online (Sandbox Code Playgroud)

然后删除分区

$ parted /dev/sda
$ rm 2
$ quit
Run Code Online (Sandbox Code Playgroud)

grub-install现在应该按预期工作。


AJM*_*eld 1

这是我所做的让它再次工作的方法:

用于gdisk将 MBR 分区转换为 GPT,将分区插入空白空间(键入 EF02“BIOS 引导分区”),将其条目与我的原始分区调换,并将其标记为旧版 BIOS 可引导。

然后跑了

$ sudo 挂载 /dev/sda1 /mnt
$ sudo grub-install --root-directory=/mnt /dev/sda

然后它安装成功,我能够启动到我的主驱动器。