当我收到“尝试在磁盘 'hd0' 之外读取或写入”错误并且启动修复无法解决问题时该怎么办?

Mar*_*dik 41 grub2

我尝试在较旧的计算机上安装Xubuntu 13.10。我注意到安装过程中的一些困难可能与我的问题有关。尤其:

  1. 屏幕分辨率极低。窗户比屏幕大得多,我不得不四处移动它们才能到达“下一步”按钮。

  2. 鼠标光标是一团模糊的颜色,一直在闪烁。

安装完成,我尝试重新启动计算机。我立即得到:

error: attempt to read or write outside of disk 'hd0'. 
Entering rescue mode... 
grub rescue>
Run Code Online (Sandbox Code Playgroud)

我做了一个启动修复U盘,启动它并选择默认修复。应用程序告诉我问题已修复,如果这不能解决我的问题,我应该将此链接显示给可以帮助我的人。

我接下来该怎么做?我已经尝试安装 Ubuntu 和 Xubuntu,但都没有成功。

编辑:

我找到了一个解决方法。

  1. 插入Xubuntu live USB
  2. 选择“尝试Xubuntu”
  3. 在设置菜单中选择“安装Xubuntu”

这为我解决了问题。既然已经解决了,我无法测试答案。

小智 38

借助以下技术找到 linux 所在的分区

grub rescue > ls
(hd0) (hd0, msdos9)
grub rescue > ls (hd0,msdos9)/
grub rescue > ls (hd0,msdos8)/
grub rescue > ls (hd0,msdos5)/ # suppose this is root and bootloader of linux
grub rescue > ls (hd0,msdos5)/
grub rescue > set root=(hd0,msdos5)
grub rescue > set prefix=(hd0,msdos5)/boot/grub
grub rescue > insmod normal
grub rescue > normal
Run Code Online (Sandbox Code Playgroud)

现在,系统的启动菜单出现。开机进入linux。

sudo update-grub
sudo grub-install  /dev/sda # If the drive is hd0 the equivalent is sda, if it's hd1 then use sdb
Run Code Online (Sandbox Code Playgroud)

这修复了引导加载程序。

  • 只要我输入`insmod normal`,我就会再次收到消息:“错误:尝试在分区外读取或写入。” (21认同)
  • 我不明白这应该做什么。你指定了一大堆命令,对我来说没有任何意义。请添加更多说明文字!为什么你从msdos9“倒计时”到5?你怎么看“这是linux”?就我而言,它显示 (hd0,msdos1)!我无法“倒计时”——一旦我设置了 root 和前缀并执行了“insmod normal”,我就会收到与以前完全相同的错误消息。对不起。这不是任何人都可以使用的答案。:( (17认同)
  • 你说“假设这是 linux”,但没有说我如何分辨哪个是 linux。每当我输入 insmod normal 时,我都会返回“错误:未知文件系统”,这对我不起作用。另外,你能解释一下为什么会发生这种情况吗? (3认同)
  • 我同意@Zordid - 只是一个神秘命令列表而不解释这些命令的作用不仅不够,而且可能有潜在危险。 (2认同)

And*_*rew 30

对于有此问题的其他人:

这发生在我身上,新安装或 grub 修复可以工作并重新启动,但是下次我重新启动时,它会得到同样的“尝试读取错误”。大多数情况下,我会遇到内核崩溃并且计算机需要硬重启。

我遵循了一些建议,并使用以下分区设置使用高级选项(不要使用“擦除磁盘并安装 ubuntu”)进行了新安装:

  1. 在磁盘开头创建一个 1 GB (1024 MB) ext4 分区;安装在“/boot”中
  2. 在安装在“/”中的 ext4 中创建所需的安装空间 减去您的交换区域
  3. 使用剩余空间进行交换。(所有分区都将是主分区)
  4. 在引导安装下拉菜单中,选择您的“/boot”分区。不是默认的驱动器根!


小智 8

可以通过 Grub 救援提示轻松解决。第一个答案不是很完整,一开始我也遇到了同样的错误。下面是它的工作原理:

第一,我们需要找到主分区。这将是 linux 启动所需的基本文件所在的位置,因此我们输入 -

Grub> ls
Run Code Online (Sandbox Code Playgroud)

您现在应该看到一个与 (hd0) (hd0,msdos5) (hd0,msdos1) 相当的列表。请注意,您可能有与我不同的分区,以及多个驱动器,但过程是相同的。

现在搜索分区以找到主要 -

Grub> ls (hd0)
Grub> ls (hd0,msdos5)
Grub> ls (hd0,msdos1)
Run Code Online (Sandbox Code Playgroud)

直到 grub 输出该分区上的文件列表或显示文件系统类型和上次修改日期。

第二,一旦找到主分区,我们需要设置一些东西 -

Grub> set prefix=(hd0,msdos1)/boot/grub
Grub> set root=(hd0,msdos1)
Grub> set
Run Code Online (Sandbox Code Playgroud)

一旦执行最后一个 set 命令,Grub 将输出不同参数的列表。现在让我们检查我们是否设置了正确的根和前缀 -

Grub> ls /boot
Run Code Online (Sandbox Code Playgroud)

Grub 应该输出包含在 /boot 中的文件列表。

第三,我们需要设置挂载点并加载内核 -

Grub> linux /vmlinuz root=/dev/sda1
Grub> initrd /initrd.img
Run Code Online (Sandbox Code Playgroud)

最后我们启动系统 -

Grub> boot
Run Code Online (Sandbox Code Playgroud)

如果您最终启动到 busybox shell,只需输入fsck /dev/sda1. 之后只需输入exit,您的系统将正常启动。

  • 当我输入“linux /vmlinuz root=/dev/sda1”时,我收到以下错误:未知命令“linux”。我还尝试指定 /vmlinuz-5.8.0-63-generic。 (2认同)
  • 相同``未知命令'linux'```` (2认同)