在 HDD 升级之后,GRUB 在菜单之前挂起。如何调试?

Ced*_*ght 7 raid bios grub advanced-format grub2

我在运行 Debian wheezy 和 GRUB 1.99-27+deb7u3 的 4 x 1 TB 驱动器的服务器上遇到问题。

sda 和 sdb 具有使用(Linux 软件)RAID1 镜像的分区,包括/boot. sdc 和 sdd 各有一个分区,为数据镜像一个 LVM 物理卷。GRUB 安装到 sda 和 sdb。我用mdadm--fail--remove1个TB SDC,并取代了旧的驱动器(一个ST91000640NS)用新的2 TB ST2000NX0243。

安装新驱动器后,GRUB 可以达到

GRUB loading.
Welcome to GRUB!
Run Code Online (Sandbox Code Playgroud)

但无法显示菜单。sdc 上的驱动器指示灯持续亮起,因此推测 GRUB 核心正在尝试读取该驱动器,即使它不需要访问 /boot/grub。我试过两个相同型号的驱动器,都用 测试得很好smartctl,结果相同。在 sdc 驱动器托架为空的情况下,一切正常启动。系统从实时 USB 启动并且可以访问新驱动器,因此这不是硬件不兼容 (*)。我确定是 sdc 被删除了,并且没有迹象表明 BIOS 对驱动器进行了重新排序。

(*)这可能不是一个安全的假设。见答案。

所以我有以下相关问题:

  1. 更改后的逻辑扇区大小(4096 而不是 512 字节)是否会导致问题,可能是在 GRUB 核心内置的 RAID 支持中?为什么我至少不会得到grub rescue>提示?4K 问题是否也会阻止将驱动器用于 Linux RAID?
  2. 解决这个问题的最快方法是什么?[以前的建议包括:我是否需要在新驱动器就位的情况下重新安装 GRUB,在这种情况下如何?GRUB 救援 USB(由同一系统制成)是否有同样的问题?这是 GRUB 中的已知错误,我应该升级吗?这些问题的答案似乎是:否、是和否。] 我可以永久配置 Debian 使用的 GRUB 映像前缀吗?
  3. 如何调试 GRUB 的这一阶段?它可能对内置的模块很敏感,但你如何发现呢?

我正在考虑一个 debug.cfgdebug=all和类似的东西:

grub-mkimage -c debug.cfg -o dcore.img configfile normal raid fs multiboot
grub-setup -c dcore.img /dev/sda
Run Code Online (Sandbox Code Playgroud)

那行得通吗?(我在自己的回答中解决了第 3 点,但在我的情况下,挂起似乎发生在对嵌入式配置执行操作之前。)

更多系统详情

如果它有助于可视化,这是lsblk输出的一部分:

NAME                             MAJ:MIN RM   SIZE RO TYPE  MOUNTPOINT
sdb                                8:16   0 931.5G  0 disk  
??sdb1                             8:17   0   957M  0 part  
? ??md0                            9:0    0 956.9M  0 raid1 /boot
??sdb2                             8:18   0   9.3G  0 part  
? ??md1                            9:1    0   9.3G  0 raid1 /
??sdb3                             8:19   0 279.4G  0 part  
? ??md2                            9:2    0 279.4G  0 raid1 /var
??sdb4                             8:20   0 641.9G  0 part  
  ??md3                            9:3    0 641.9G  0 raid1 
    ??vg0-home (dm-0)            253:0    0   1.4T  0 lvm   /home
    ??vg0-swap (dm-2)            253:2    0    32G  0 lvm   [SWAP]
sdc                                8:32   0 931.5G  0 disk  
??sdc1                             8:33   0 931.5G  0 part  
  ??md4                            9:4    0 931.5G  0 raid1 
    ??vg0-home (dm-0)            253:0    0   1.4T  0 lvm   /home
sdd                                8:48   0 931.5G  0 disk  
??sdd1                             8:49   0 931.5G  0 part  
  ??md4                            9:4    0 931.5G  0 raid1 
    ??vg0-home (dm-0)            253:0    0   1.4T  0 lvm   /home
sda                                8:0    0 931.5G  0 disk  
??sda1                             8:1    0   957M  0 part  
? ??md0                            9:0    0 956.9M  0 raid1 /boot
??sda2                             8:2    0   9.3G  0 part  
? ??md1                            9:1    0   9.3G  0 raid1 /
??sda3                             8:3    0 279.4G  0 part  
? ??md2                            9:2    0 279.4G  0 raid1 /var
??sda4                             8:4    0 641.9G  0 part  
  ??md3                            9:3    0 641.9G  0 raid1 
    ??vg0-home (dm-0)            253:0    0   1.4T  0 lvm   /home
    ??vg0-swap (dm-2)            253:2    0    32G  0 lvm   [SWAP]
Run Code Online (Sandbox Code Playgroud)

这是 2010 年之前的 BIOS,没有 EFI 功能。

不相关:在正在运行的系统上,以下给出了 grub-probe 1.99 中与我进行 grub-install 相同的 LVM 错误,尽管一切似乎都有效(这在 GRUB 2.02 中似乎已修复)。

# grub-fstest /dev/sda cp '(loop0,msdos1)/grub/grub.cfg' grub.cfg
error: unknown LVM metadata header.
Run Code Online (Sandbox Code Playgroud)

下面答案中的调试方法显示安装到 sd[ab] 的图像的前缀是:

grub-mkimage -d /usr/lib/grub/i386-pc -O i386-pc --output=/boot/grub/core.img '--prefix=(mduuid/<UUID of sdN1>)/grub' biosdisk ext2 part_msdos part_msdos raid mdraid09
Run Code Online (Sandbox Code Playgroud)

我不知道为什么重复 'part_msdos'。没有 gpt 表。md0(引导)使用 RAID 超级块版本 0.9,md1、md2 和 md4(这些是旧阵列)也是如此。md3 是超级 1.2,但不应该参与启动。


更新

感谢您到目前为止的建议。进一步测试后:

  • BIOS 已设置为使用 sda (ata1.00) 启动。用 将 GRUB 重新安装到所有驱动器后dpkg-reconfigure grub-pc,没有任何变化,当新驱动器通过 SATA 连接时,GRUB 仍然挂在菜单之前。这不可能由 /boot/grub 内容与核心映像不匹配来解释。同样,物理重新排列驱动器也没有区别。
  • 在 Debian Jessie 中将 GRUB 升级到 2.02 只会产生Welcome to GRUB!不打印消息的效果- 相反,它会更改图形模式。它仍然在相同的条件下挂起。
  • 挂起似乎发生在嵌入式配置设置debug变量之前。不会发出有用的调试信息。
  • 当从前缀不使用 UUID 的可移动介质引导时,GRUB 会显示一个菜单,这样就可以在驱动器物理存在的情况下引导系统。但是,驱动器的 TAB 枚举会冻结。正如预期的那样,从硬盘驱动器链式加载 GRUB 会像以前一样挂起。从grub-mkrescue同一系统制作的 USB 驱动器引导也会挂起。
  • 作为一个单独的故障,在实时系统 (Linux 3.2.0-4-amd64) 上,尝试通过内部 SATA 或 USB 将新的 4Kn 驱动器添加到 RAID1 阵列导致Bad block number requested设备上的结果,随后 md 系统失败驱动器BUG: unable to handle kernel paging request和内核哎呀。(mdadm --remove说失败的元素正忙,并且 md-resync 进程不响应 SIGKILL。我没有尝试echo frozen > /sys/block/mdX/md/sync_action。使用ddSATA测试驱动器一切看起来都很好。)。当然,Linux MD 驱动程序能够将 4Kn 驱动器与旧驱动器同步并且不使用 BIOS?

因此,解决方法可能包括将非 RAID 分区安装为/boot/; 使用依赖于设备的前缀安装 GRUB;或者刷BIOS。最明智的做法可能是联系供应商更换驱动器。

换句话说,问题 3 有一个解决方案,其无效性可能是 GRUB 功能请求的主题;问题 2 提出了错误的树,所以我对其进行了修改;和问题 1,如果它不是离题太远,现在另外是关于为什么该驱动器显然不能用于 Linux RAID。

我很乐意将赏金授予对其中任何一个的体面解释,有关 RAID 重新同步错误的内容,或flashrom用于 4Kn 支持的轶事,如何告诉 grub-install 不使用 UUID 或任何相关的系统管理员提示。

Ced*_*ght 1

我现在正在回答我自己的问题 1。这是 4Kn(“高级格式”)问题吗?

是的。

4Kn 驱动器并未像您想象的那样得到广泛支持;例如,它们与 Windows 7 或 GRUB 1 或许多 Intel 芯片组不兼容。就我而言,问题似乎出在主板上的 Intel 82801I 企业南桥控制器芯片(ICH9 系列)。我认为这也是即使通过 USB 驱动器 md_resync 部分失败的原因。上述链接中的分析似乎发现 Linux ata_piix 驱动程序在 Intel ICH10 上适用于 4Kn,尽管缺乏 Intel 的官方支持。我可能对 ICH9 有不同的发现。我尚未测试该驱动器是否可以在 AHCI 或 SAS 模式下工作。

只有主板制造商或进行过彻底测试的其他人可能知道驱动器兼容性信息。我很快就得出结论,“这不是硬件不兼容”,只是因为简单的读写工作有效。该主板的更新 BIOS 不支持 4Kn 是有原因的:因为主板不能可靠地支持 4Kn。

同等 512e 驱动器没有理由不能在这些情况下工作。