`install-grub` 声称我有多个分区标签,无法嵌入

`install-grub` 声称我有多个分区标签,无法嵌入

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

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

$ sudo mount /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

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

# 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?

答案1

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

# dd if=/dev/zero of=/dev/sdX seek=1 count=2047

这是针对第一个分区从扇区 2048 开始的情况。有些分区从扇区 2048 开始,尤其是在由 Windows 分区的驱动器上。为确保万无一失,请运行

# fdisk -l /dev/sdX

在开始之前检查第一个分区从哪里开始。使用count=S-1,其中 S 是第一个分区的开始。

答案2

可以在 GPT 记录所在的位置创建一个新分区,然后使用 擦除它dd。这样,就只剩下 MBR 记录了。

假设问题设备是/dev/sda

在初始 1 MiB 处创建一个新分区

$ parted /dev/sda
$ mkpart primary ext4 0MiB 1MiB
$ quit

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

$ dd if=/dev/zero of=/dev/sda2

然后删除分区

$ parted /dev/sda
$ rm 2
$ quit

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

答案3

多个分区标签也存在类似的问题,尽管我很确定事实并非如此。

sudo grub-install target=i386-pc /dev/sda --force

是我以前解决这个问题的方法。添加一个--force不是“推荐”的解决方案,但到目前为止我没有遇到任何问题 =P

答案4

这是我让它再次运行的方法:

用于gdisk将 MBR 分区转换为 GPT,将分区插入空白处(类型 EF02“BIOS 启动分区”),将其条目与我原来的分区转置,并将其标记为可启动的旧式 BIOS。

然后跑了

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

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

相关内容