Arch Linux 安装后,它只显示文本“未找到可启动设备”

brg*_*rgr 8 boot arch-linux grub2 system-installation

我一直在尝试安装 Arch Linux。安装后,它会显示 BIOS 屏幕,然后会出现一条消息,显示“找不到可启动设备”。

我已经多次重试整个场景,但它仍然只显示相同的消息......

在安装时,我遵循了 ArchLinux wiki 中的非官方初学者指南。

这是我所做的:

首先,我擦除了硬盘驱动器(在擦除之前安装了 Windows Vista)并使用 gdisk 在其上放置了 GPT。然后我设置了一些分区,现在看起来如下(parted 的输出):

Model: ATA ST9160310AS (scsi)
Disk /dev/sda: 160GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:

Number  Start   End     Size    File system     Name                 Flags
 1      1049kB  2097kB  1049kB                  BIOS boot partition  bios_grub
 2      2097kB  107MB   105MB   ext2            Linux filesystem     
 3      107MB   21.6GB  21.5GB  ext4            Linux filesystem     
 4      21.6GB  30.2GB  8590MB  linux-swap(v1)  Linux swap           
 5      30.2GB  160GB   130GB   ext4            Linux filesystem     
Run Code Online (Sandbox Code Playgroud)

然后我将根分区 (sda2) 安装到 /mnt,然后将引导和主分区(sda3 和 sda5)安装到 /mnt/boot 和 /mnt/home,最后格式化并激活交换分区(sda4) .

现在我开始安装基本系统。选择镜像后,我安装了 base 和 base-devel。

在安装结束时,我生成了一个 fstab。

后来我终于chroot的进入到/ mnt,设置一些区域设置,设置root密码,然后安装和配置grub2的,正是因为它说明在这里

最后我退出了 chroot 环境,卸载了分区并重新启动。你知道其余的......它只是显示它无法找到任何可启动设备的消息。

顺便说一下,我尝试在台计算机上安装它。

小智 5

我遇到了同样的问题,通过搜索我发现 grub.cfg 中根/分区的 uuid 错误,你可以尝试以下操作:

  1. 从实时 archlinux 媒体启动
  2. mount /dev/sdxx /mnt(sdxx 是您的根分区)
  3. arch-chroot /mnt
  4. grub-mkconfig -o /boot/grub/grub.cfg
  5. grub-install

结束。


Run*_*ium 2

好的。评论变得有点长。这没有直接关系,只是为了解释aa55评论。

\n\n

基本输入/输出系统(BIOS) 启动时,它会执行加电自检(POST),检查硬件等。然后,它会按照 CMOS 给出的顺序查找既可启动又处于活动状态的设备(您在 BIOS 中的配置) \xe2\x80\x93 又由互补金属氧化物半导体给出)。当它找到偏移量为 510 的磁盘时,0xaa55它会将磁盘的该部分(扇区 1)加载到内存中,并将控制权留给该代码的地址 0x00000。这 512 字节是主引导记录(MBR)。

\n\n

该代码(在本例中为“ GRUB - boot”)检查这些 512 的各个字节,此外还向 BIOS 询问各种信息。在此过程中,它会定位\n哪个磁盘拥有 GRUB 的其余部分,并将磁盘的该部分加载到内存\xe2\x80\x93\n然后该部分代码获得控制。该程序安装内核等,并\n将控制留给它。

\n\n

使用 GPT,GRUB 从 MBR 内加载的映像位于bios_grub您拥有的分区中,并且足够大等,因此无法看出这可能是错误的。

\n\n
\n\n

关于“找不到可启动设备”。来自 BIOS \xe2\x80\x93 的消息可能会导致\n启动磁盘的 MBR 已损坏,如果 MBR 结尾0xaa55且 MBR 已损坏,\n通常会出现其他错误 - 或者系统只是挂起。

\n\n
\n\n

无论如何。这很奇怪。我注意到你没有标记为“启动”的分区。 \n使用 GPT 是正确的, - 但是,尽管这是禁止的,你可以尝试 \n将一个分区标记sda5为启动。在 gparted 中:(了解到\n(g)parted 还改变了不想要的 GPT)fdisk :

\n\n
# Toggle bootable:\na [DISK NUMBER]\n# Check (could be an asterisk marking boot partition):\np\n# Save changes:\nw\n
Run Code Online (Sandbox Code Playgroud)\n\n

可能是您的 BIOS 执行的操作超出了应有的范围,并检查了 MBR 中的\n分区表。

\n\n
\n\n

编辑 \xe2\x80\x93 更新评论:

\n\n

AFAIK,你设置哪一个并不重要,因为它实际上并没有被使用。\n重点是,对于那些说没有“找到可启动设备”的人来说,他们应该\n感到满意。这sda1不是传统意义上的引导分区,\n而是 GRUB 引导文件的空间。

\n\n

在传统的分区布局(非 GPT)中,您通常有类似的\n:

\n\n
0x000 [Master Boot Record] <- Partition table say Partition 2 is active\n                                                       |\n0x200 [ GRUB module 1    ] <- core.img from GRUB       |\n                                                       |\n0x400 [ Partition 1 Swap ]                             |\n      |                  |                             |\n      |                  |                             |\n      |__________________|                             |\n                                                       |\n0x... [ Partition 2 ext4 ]                             |\n      | * Active         | <- AKA boot ----------------+\n      |                  |\n      |__________________|\n\n0x... [ Partition 3 ext4 ]\n      |                  |\n      |                  |\n      |__________________|\n
Run Code Online (Sandbox Code Playgroud)\n\n

这意味着 3 个分区。HDD 上偏移 0x400 之前的所有内容\ni原始字节\xe2\x80\x93 不属于任何分区等。

\n\n

这里的引导分区是分区 2,它是带有 Linux 的系统分区。

\n\n

GRUB 模块 1 文件驻留在 MBR 之后和第一个分区之前。\n它可以驻留在任何位置,但通常位于同一磁盘上且位于 MBR 的偏移量 512 处。\n磁盘。

\n\n

此外,在 GPT 系统上 \xe2\x80\x93 GPT 本身使用磁盘的该部分,因此\n 不必将这些 GRUB 文件移动到另一个位置。这就是 \n的用途 -为 GRUB 2bios_grub存储。core.img

\n\n
\n\n

“设置启动标志”只是在黑暗中的一击, - 如果它有效,\n我们会感到惊讶。但人们已经从某个地方开始了。

\n\n
\n\n

编辑2:

\n\n

如果你这样做怎么办:

\n\n
    \n
  1. 备份当前MBR:

    \n\n
      dd if=/dev/sda of=/path/mbr-backup bs=512 count=1\n
    Run Code Online (Sandbox Code Playgroud)
  2. \n
  3. 从下面创建图像Code TEST,保存到文件test.s

    \n\n
    as -o test.o test.s\nobjcopy -O binary test.o test.img\n
    Run Code Online (Sandbox Code Playgroud)
  4. \n
  5. 将文件复制test.img到 MBR:

    \n\n
    dd if=test.img of=/dev/sda bs=512 count=1\n
    Run Code Online (Sandbox Code Playgroud)
  6. \n
  7. 开机

  8. \n
\n\n

代码测试:

\n\n
    .file "test.s"\n    .text\n    .code16\n.globl start, _start\nstart:\n_start:\n    jmp go\n    nop\ngo:\n    movb $0x48, %al\n    call prnt_chr\n    movb $0x65, %al\n    call prnt_chr\n    movb $0x6c, %al\n    call prnt_chr\n    movb $0x6c, %al\n    call prnt_chr\n    movb $0x6f, %al\n    call prnt_chr\n    movb $0x21, %al\n    call prnt_chr\n    ret\nprnt_chr:\n    movb $0x0e, %ah\n    int  $0x10\n    ret\n    . = _start + 0x1fe \n    .word   0xaa55\n
Run Code Online (Sandbox Code Playgroud)\n\n

要恢复 MBR,请执行以下操作:

\n\n
dd if=/path/mbr-backup of=/dev/sda bs=512 count=1\n
Run Code Online (Sandbox Code Playgroud)\n\n
\n\n

这应该简单地打印“Hello!” 如果 MBR 已加载,则\n停止。通过在 qemu-system-x86_64、qemu-system-i386、\nVirtualBox、固定式 Intel PC 32 和 64 位下运行进行测试。

\n\n
\n