找不到 /dev/sda1 的 GRUB 驱动器。检查您的设备地图

找不到 /dev/sda1 的 GRUB 驱动器。检查您的设备地图

这是我的磁盘配置:

# hlsblk -F
NAME            FSTYPE      FSVER            LABEL       UUID                                   FSAVAIL FSUSE% MOUNTPOINTS
loop0           squashfs    4.0                                                                       0   100% /run/archiso/airootfs
sda                                                                                                            
├─sda1          btrfs                                    0bd3ff02-b7a9-4421-877c-c16d1fdf6a6e                  
└─sda2          crypto_LUKS 2                            f030bc5b-773e-4fea-88d4-36b3e95f7c26                  
  └─x200        LVM2_member LVM2 001                     20xRtS-jPGK-kTIC-YKfA-XDNr-RSPr-CxNcRU                
    ├─x200-swap swap        1                            f6c9ca7d-41a5-4f6b-acc8-fd53e1f4a36e                  
    └─x200-root btrfs                                    f174b77a-c75c-4897-ac31-80aa728004c8                  
sdb             iso9660     Joliet Extension ARCH_202206 2022-06-01-15-35-22-00                                
├─sdb1          iso9660     Joliet Extension ARCH_202206 2022-06-01-15-35-22-00                       0   100% /run/archiso/bootmnt
└─sdb2          vfat

因此,我已将所有需要的分区和 chroot 安装到其中,如下所示:

# swapon /dev/mapper/x200-swap
# mount /dev/mapper/x200-root /mnt
# mount /dev/sda1 /mnt/boot
# arch-chroot  /mnt

当我尝试使用 grub-install 安装 GRUB 时,我得到:/usr/bin/grub-probe: error: cannot find a GRUB drive for /dev/sda1. Check your device.map. 此完整命令输出将粘贴在本文末尾。

grub-mkconfig 时出现与上述相同的错误。

这是我的 grub 配置的头部。

# head /etc/default/grub
GRUB_DEFAULT=0
GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR="Arch"
# GRUB_CMDLINE_LINUX_DEFAULT="loglevel=3 quiet cryptdevice=UUID=/dev/sda2:cryptlvm root=/dev/disk/by-uuid/f174b77a-c75c-4897-ac31-80aa728004c8"
# GRUB_CMDLINE_LINUX_DEFAULT="loglevel=3 quiet cryptdevice=UUID=/dev/sda2:cryptlvm root=/dev/x200/root"
GRUB_CMDLINE_LINUX_DEFAULT="loglevel=3 quiet cryptdevice=UUID=/dev/sda2:cryptlvm root=/dev/mapper/x200-root"
GRUB_CMDLINE_LINUX=""

这也是我的 fstab

# /dev/mapper/x200-root
UUID=f174b77a-c75c-4897-ac31-80aa728004c8   /           btrfs       rw,relatime,ssd,space_cache=v2,subvolid=5,subvol=/  0 0

# /dev/sda1
UUID=0bd3ff02-b7a9-4421-877c-c16d1fdf6a6e   /boot       btrfs       rw,relatime,ssd,space_cache=v2,subvolid=5,subvol=/  0 0

# /dev/mapper/x200-swap
UUID=f6c9ca7d-41a5-4f6b-acc8-fd53e1f4a36e   none        swap        defaults    0 0

BBS 上的完整 GRUB 命令输出。

更新

将 sda1 格式化为 ext4,更新了 fstab uuid,仍然出现错误。哦。还安装了 os-prober。还是一样。

答案1

grub 命令的完整输出在第二行给出

grub-install: info: cannot open `/boot/grub/device.map': No such file or directory.

以 root 身份运行

# grub-mkdevicemap

然后重试。

有很多“区域设置”错误。也许安装“locales”包也会有帮助......

编辑:EFI

您尝试使用 EFI / UEFI 吗?然后,您就错过了 FAT 分区。

答案2

您是否尝试使用 来安装 GRUB grub-install /dev/sda1

由于 GRUB 在安装 BIOS 式引导过程时实际上需要访问 MBR 以及 MBR 和第一个分区之间未使用的空间,因此请尝试grub-install /dev/sda.如果仍然显示相同的错误消息,只需编写自己的/boot/grub/device.map文件即可。就你而言,它的内容可能只是

(hd0)    /dev/sda

(理想情况下,您可以使用适当的/dev/disk/by-id/...路径名来代替/dev/sda,但这不是强制性的。)

grub-install /dev/sda1会尝试将 GRUB 的引导块嵌入到分区的 PBRsda1而不是 MBR 中。由于大多数文件系统没有固定的引导加载程序空间,GRUB 的引导块必须/boot/grub/i386-pc/core.img通过物理磁盘位置来指向,该位置曾经是一个非常严重地劝阻安装模式。现代版本的 GRUB 可能不再支持以这种方式安装 GRUB。

问题是,引导块代码需要非常小,以至于无法理解文件系统,因此它使用 GRUB 安装时确定的原始磁盘块号来读取 GRUB 映像。为此,GRUB 核心映像需要放置在保证其在磁盘上的物理位置保持不变的位置。从操作系统的角度来看,/boot/grub/i386-pc/core.img它是一个常规文件,因此碎片整理工具或智能文件系统驱动程序有时可能会将其移动到磁盘上的不同物理位置:这将导致完全启动失败。

当 GRUB 安装到 MBR 分区磁盘的实际主引导记录时,MBR 和第一个分区开头之间的空白空间(大约 1 MB)将用于 GRUB 核心映像。由于这个地方位于任何分区之外,因此任何文件系统驱动程序或碎片整理工具都不会触及它。这是足够的空间来嵌入 GRUB 核心映像、文件系统驱动程序以及/boot作为真实文件系统访问所需的任何其他 GRUB 模块。加载这些之后,GRUB 将能够normal.mod按路径名加载其他模块(包括 )及其配置文件作为常规文件。


顺便说一句,如果您想从 GPT 分区的磁盘引导 i386-pc 版本的 GRUB,则需要一个大小为 1 MB 且不包含文件系统的“biosboot”分区:它用于保存 GRUB 核心映像,如下所示第一个分区之前的 MBR 样式空间现在将由 GPT 分区表结构占用。

MBR 和第一个分区开头之间的空白空间是历史遗留下来的:当磁盘仍然使用 C/H/S 寻址时,有一种约定将分区的开头始终放置在磁道的第一个扇区。由于 MBR 是磁盘的第一个块(C/H/S 地址 0/0/1),这意味着第一个分区的最早可能开始位置是 C/H/S 0/1/1,其余部分磁道 #0(= 柱面 #0、磁头 #0)将不被使用。

大约在 Windows XP 时代,由于 C/H/S 寻址不再有意义,并且 RAID 阵列、企业存储系统和 SSD 上的数据对齐正成为一个重要的性能问题,因此更改了第一个分区的开始约定:现在建议的磁盘第一个分区的启动位置是距离磁盘开头正好 1 MiB,或者是 LBA 块号 #2048(假设是经典的 512 字节磁盘块)。

答案3

总括:fdisk 未设置 sda1 分区类型。

这就是正在发生的事情。

经过一些讨论后,MBR 引导部分就是其中之一,我很好奇 fdisk 是否实际上保留了磁盘初始字节。所以我输入了一个fdisk -l /dev/sda.我注意到 /dev/sda1 的类型未定义或未知,因此我按下t,将 sda1 更改为 Linux,重新安装所有内容,然后 grub-install 就正常工作了。

答案4

我刚刚解决了这个问题。我按照这些步骤操作。

sudo mkdir -p /mnt/broken
sudo mount /dev/sda7 /mnt/broken

OBS:sda7不是我的root,是我的EFI,当我看到它时,我的引导文件丢失了,但幸运的是,我有一个EFI压缩在一个文件夹中,只需解压它并cp我在dev上安装的sda7,它就可以工作。

然后我更新了我的 linux 和 windows 分区也显示了。

也许 Live CD 的某个地方也有启动文件。

相关内容