我在运行 Debian wheezy 和 GRUB 1.99-27+deb7u3 的 4 x 1 TB 驱动器的服务器上遇到问题。
sda 和 sdb 具有使用(Linux 软件)RAID1 镜像的分区,包括/boot
. sdc 和 sdd 各有一个分区,为数据镜像一个 LVM 物理卷。GRUB 安装到 sda 和 sdb。我曾经使用mdadm
1 TB sdc,--fail
并--remove
用新的 2 TB ST2000NX0243 替换了旧驱动器(ST91000640NS)。
有了新的驱动器,GRUB 就更远了
GRUB loading.
Welcome to GRUB!
但无法显示菜单。sdc 上的驱动器指示灯持续亮起,因此推测 GRUB 内核正在尝试读取该驱动器,即使它不需要访问 /boot/grub。我已经尝试了两个相同型号的驱动器,两者都用 测试良好smartctl
,结果相同。在 sdc 驱动器托架为空的情况下,一切正常启动。系统从 live USB 启动并且可以访问新驱动器,因此这不是硬件不兼容 (*)。我确定是 sdc 被删除了,并且没有迹象表明 BIOS 重新排序了驱动器。
(*)这可能不是一个安全的假设。查看答案。
所以我有以下相关问题:
- 更改的逻辑扇区大小(4096 而不是 512 字节)是否会导致问题,也许是在 GRUB 内核中内置的 RAID 支持中?为什么我至少没有得到
grub rescue>
提示?4K 问题也会阻止将驱动器用于 Linux RAID 吗? - 解决这个问题的最快方法是什么?[以前的建议包括:我是否需要在新驱动器就位的情况下重新安装 GRUB,在这种情况下如何?GRUB 救援 USB(由同一系统制成)会出现同样的问题吗?它是 GRUB 中的一个已知错误,我应该升级吗?这些问题的答案似乎是:不,是和否。] 我可以永久配置 Debian 使用的 GRUB 映像前缀吗?
- 如何调试这个阶段的 GRUB?它可能对内置的模块很敏感,但是您如何找到它呢?
我正在考虑一个 debug.cfgdebug=all
和类似的东西:
grub-mkimage -c debug.cfg -o dcore.img configfile normal raid fs multiboot
grub-setup -c dcore.img /dev/sda
那行得通吗?(我在自己的回答中提到了第 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]
这是 2010 年之前的 BIOS,没有 EFI 功能。
无关:在正在运行的系统上,以下给出了与 grub-install 相同的 grub-probe 1.99 的 LVM 错误,尽管一切似乎都可以正常工作(这在 GRUB 2.02 中似乎已修复)。
# grub-fstest /dev/sda cp '(loop0,msdos1)/grub/grub.cfg' grub.cfg
error: unknown LVM metadata header.
以下答案中的调试方法显示正在安装到 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
我不知道为什么重复“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
。使用 SATA 测试驱动器dd
一切正常。)。Linux MD 驱动程序肯定能够将 4Kn 驱动器与旧驱动器同步并且不使用 BIOS 吗?
因此解决方法可能包括将非 RAID 分区挂载为/boot/
; 安装带有设备相关前缀的 GRUB;或刷新 BIOS。最明智的做法可能是联系供应商更换驱动器。
换句话说,问题 3 有一个解决方案,其无效性可能是 GRUB 功能请求的主题;问题 2 说错了树,所以我修改了它;问题 1,如果不是太离题的话,现在也是关于为什么驱动器显然不能用于 Linux RAID。
我很乐意将赏金奖励给任何一个体面的解释,关于 RAID 重新同步错误,或使用flashrom
4Kn 支持的轶事,如何告诉 grub-install 不要使用 UUID 或任何相关的系统管理员提示。