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


8

我一直在尝试安装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     

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

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

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

然后,我终于切入/ mnt,设置了一些语言环境,设置了root密码,然后安装并配置了Grub2,正如此处所解释的。

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

顺便说一句,我试图将其安装在台计算机上。


1
dd if=/dev/sda bs=1 skip=510 count=2 2>&- | hexdump(或xxd而不是hexdump)的输出等于55aa吗?如果不是,则MBR不好。
Runium

输出如下:0000000 aa55 0000002 如果MBR不好,您怎么说,我能做些什么使它恢复良好?
brgr 2013年

不,看起来还可以。(0000000和0000002是偏移量)aa55是正确的MBR签名(55aa在Little Endian系统上)。
Runium

@Sukminder,我可能会丢失一些东西,但OP表示他使用的是GPT,而不是MBR。
JMCF125 2014年

1
@ JMCF125:GPT也使用MBR。它拥有一个最大大小的分区,而不是完整的分区表。GPT数据通常从偏移量512(MBR之后)开始。upload.wikimedia.org/wikipedia/commons/0/07/…MBR处于引导加载的第一阶段。逻辑块地址0->旧版MBR。
Runium

Answers:


4

我遇到了同样的问题,通过搜索我发现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

完。


我已经在第一次尝试中完成了所有这些操作。但是,我尝试按照您的解释再次进行操作,并出现错误grub-install:它说上没有Bios引导分区/dev/sda,而实际上有一个。
brgr

2

好。长时间发表评论。这并不直接相关,而只是为了解释aa55评论。

基本输入/输出系统(BIOS)开始它一加电自检(POST),检查硬件等。然后它看起来是由CMOS(你在BIOS配置给定的顺序既引导和有源器件-这依次由互补金属氧化物半导体给出。当它找到0xaa55偏移量为510 的磁盘时,它将磁盘的该部分(扇区1)加载到内存中,并将控制权留给该代码的地址0x00000。这512个字节是主引导记录(MBR)。

该代码,在本例中为“ GRUB-boot”,除了向BIOS询问各种信息外,还检查了这512个字节。在此过程中,它将找到具有GRUB其余部分的磁盘,并将该磁盘的该部分加载到内存中-然后这部分代码得到控制。那个挂载内核等,并留下控制权给那个。

使用GPT,从MBR内部加载的GRUB映像位于bios_grub 分区中-您拥有分区并且足够大,依此类推,因此看不到怎么回事。


“找不到可启动的设备”上。来自BIOS的消息-可能是启动磁盘MBR损坏的情况,如果MBR结尾0xaa55并且MBR损坏则通常会显示另一个错误-否则系统就会挂起。


无论如何。真奇怪 我注意到您没有标记为“ boot”的分区。使用正确的GPT--尽管被禁止,但是您可以尝试将其标记sda5为启动。在gparted中:(得知(g)part也更改了不需要的GPT)fdisk:

# Toggle bootable:
a [DISK NUMBER]
# Check (could be an asterisk marking boot partition):
p
# Save changes:
w

可能是您的BIOS所做的比应做的更多,并且正在检查MBR中的分区表。


编辑–更新评论:

AFAIK设置哪一个都没有关系,因为它实际上并未使用。要指出的是,对于谁说没有找到“可启动设备”,他们将感到满意。该sda1不是传统意义上的引导分区,但空间GRUB引导文件。

在传统的分区布局(不是GPT)中,通常具有以下内容:

0x000 [Master Boot Record] <- Partition table say Partition 2 is active
                                                       |
0x200 [ GRUB module 1    ] <- core.img from GRUB       |
                                                       |
0x400 [ Partition 1 Swap ]                             |
      |                  |                             |
      |                  |                             |
      |__________________|                             |
                                                       |
0x... [ Partition 2 ext4 ]                             |
      | * Active         | <- AKA boot ----------------+
      |                  |
      |__________________|

0x... [ Partition 3 ext4 ]
      |                  |
      |                  |
      |__________________|

那将意味着3个分区。HDD i 原始字节上偏移0x400之前的所有内容–不属于任何分区等。

这里启动分区是第2分区是系统分区与Linux操作系统。

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

同样在GPT系统上– GPT本身使用了磁盘的该部分,因此必须将这些GRUB文件移动到另一位置。这是什么 bios_grub是-存储core.img为GRUB 2。


“设置引导标志”只是在黑暗中拍摄, -如果它工作会惊讶。但是一个地方已经开始了。


编辑2:

如果您这样做:

  1. 备份当前的MBR:

      dd if=/dev/sda of=/path/mbr-backup bs=512 count=1
    
  2. Code TEST下面创建图像,并通过以下方式保存到文件test.s

    as -o test.o test.s
    objcopy -O binary test.o test.img
    
  3. test.img文件复制到MBR:

    dd if=test.img of=/dev/sda bs=512 count=1
    
  4. 开机

代码测试:

    .file "test.s"
    .text
    .code16
.globl start, _start
start:
_start:
    jmp go
    nop
go:
    movb $0x48, %al
    call prnt_chr
    movb $0x65, %al
    call prnt_chr
    movb $0x6c, %al
    call prnt_chr
    movb $0x6c, %al
    call prnt_chr
    movb $0x6f, %al
    call prnt_chr
    movb $0x21, %al
    call prnt_chr
    ret
prnt_chr:
    movb $0x0e, %ah
    int  $0x10
    ret
    . = _start + 0x1fe 
    .word   0xaa55

要还原MBR,请执行以下操作:

dd if=/path/mbr-backup of=/dev/sda bs=512 count=1

应该只打印“ Hello!”。如果加载了MBR,则返回屏幕,然后停止。通过在qemu-system-x86_64,qemu-system-i386,VirtualBox,固定式Intel PC 32和64位下运行进行了测试。



首先感谢您的帮助。您能否向我解释为什么我应该设置sda5为启动分区。sda1设置为启动分区不是更好的选择吗?
brgr

好的,我现在已经尝试过了,但可悲的是结果还是一样……
brgr

它应该列出什么?
brgr

好的,我现在也尝试了您的第二条建议,但仍然没有结果:(
brgr

是的,它已列出。
brgr

0

我可能是错的,没有做正确的事,但起初我遇到了与您相同的问题。过了一会儿,我发现在这里GRUB has to have a 512MB EFI partition, with a vfat filesystem。以防您将系统安装为EFI:

对于EFI,您正在寻找具有vfat文件系统且启用了启动标志的小型分区(小于或等于512 MiB)。

这意味着在创建分区时必须要预见到这一事实。这样做时(例如,使用cfdisk),您必须将/ dev / sdX1设置为EFI,然后将其格式化为FAT32文件系统(mkfs.vfat -F32 /dev/sdX1在安装过程中使用命令)。只有这样才能识别出rub。

我假设Syslinux可以与您的ext2分区一起使用,如果您想尝试的话。

如果您没有将Arch作为EFI安装,则可能可以在Wiki上进行任何检查。在这种情况下,我无能为力。

我知道这篇文章很旧,但是以防万一有人来这里并希望找到解决方案。


1
回答旧帖子是很好的,甚至是鼓励的。但是,请编辑您的答案并突出显示实际答案的部分。您找到了什么解决方案?什么说法 提供指向可能包含答案的另一个页面的链接不是答案。相反,请在您的答案中直接引用相关部分,以便此处包含所有信息。
terdon

答案在那里,只是从我提供的链接中引用,但未突出显示。感谢您指出了这一点。如果您觉得还有其他需要,请告诉我。
Razakhel '16

现在添加了真实报价。并更正了512MB (at least),这是相反的方式
Razakhel
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.