我在运行 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 或任何相关的系统管理员提示。
我将回答我的问题的第三部分,关于在启用调试的情况下安装 GRUB 的过程。我仍然很感激有关问题可能出在哪里的明智建议,或者以最少的停机时间和最多的关于原因的信息来解决的策略。
一些一般要点: GRUB 提供其他调试方法 -
grub-mkrescue
将生成一个 .iso,其中包含您可能需要内置的所有模块,因此可以使用实时 USB 来尝试导航 RAID 阵列并尝试加载 .cfg文件甚至内核。模拟器在大多数发行版中grub-emu
都可用,但更侧重于菜单的外观。更高级的是标准 GRUB 模块,用于通过串行电缆进行调试gdb
。在启用调试的情况下安装 GRUB 的过程
因此,获取调试消息的过程在GRUB 手册第 6 节中有提及,但没有详细说明。您可能要考虑的第一件事是通过串行控制台进行调试并在
script
之前运行screen
以记录调试消息。显然你需要root权限。请注意,此答案中的驱动器布局不一定与问题匹配,只是一个示例。假设正常(非调试)GRUB 已安装到其他适当的驱动器:这只是将调试 GRUB 安装到您希望引导的驱动器的过程。(这意味着调试消息可以清楚地显示哪个驱动器正在引导。对于安装到 RAID 分区,两种情况下的前缀很可能是相同的,因此您可以对/dev/sda
as运行相同的命令/dev/sdb
。)首先,检查现有的 grub 文件在哪里,
/boot/grub
或者更有可能是/boot/grub/<platform>
. 在这种情况下,假设他们在/boot/grub/i386-pc/
. 我们不会修改已经存在的文件,而是添加一个启用调试的附加核心映像。如果.cfg
文件丢失或已被修改,请使用grub-mkconfig -o /boot/grub/grub.cfg
.检查已安装的模块和前缀
显示哪些模块已编译到您的核心映像中的快速而肮脏的方法是
grub-install
再次运行。这适用于 GRUB 2.02:在没有 RAID 或 lvm 的简单情况下,这可能会显示类似
ext2 part_gpt biosdisk
. 但是 GRUB 1.99 不-v
用于详细说明,因此请--debug
改用。我们将把它与不实际安装映像的技巧结合起来,以节省一点时间:请注意,它
grub-install
可以运行 shell 脚本来代替它调用的程序,因此我们可以这样做:当然,路径可能会根据您的发行版和选择的外壳而有所不同。
设置调试变量
我们现在创建一个可以
debug.cfg
使用调试设置调用的文件。(如果核心在这个阶段遇到注释,就会产生非致命错误,所以我们不会使用任何。)空格、 或 的任意组合
,
可;
用于|
分隔字符串中的模块名称。我从 GRUB 2.02 源代码中提取了调试工具列表,并对它们进行了语义排序。从解释器中
'all'
产生过多的内存信息。scripting
还有一些针对特定文件系统的附加工具,例如“xfs”和“reiserfs”,以及“net”、“partition”和“loader”(“loader”对于我们在菜单之前感兴趣的内容来说太迟了。如果我们可以得到一个菜单,我们可以在那里设置调试变量。)不幸的是,'mdraid_linux'源中没有调试消息,但disk
显示了最重要的操作。pager
如果您没有通过控制台捕获调试消息(例如使用script
) ,则需要该变量来读取调试消息。我发现如果pager
不包含像sleep
or之类的附加模块,它将无法工作configfile
,它会使图像的大小增加一倍以上。无论如何,调试环境变量都会生效。安装
现在制作您要调试的图像的变体图像:
其中模块列表是 grub-install 中您要调试的模块列表,包括
sleep
您需要的任何其他内容。前缀-p
应该从grub-install
too 的输出中复制,因为显然它对 GRUB 横幅之后发生的事情有巨大的影响。但是,您可能希望尝试使用 GRUB 设备代码(如本例所示)而不是标准 UUID。您可以在 RAID 驱动器上使用lsblk -o NAME,TYPE,FSTYPE,LABEL,SIZE,STATE,UUID
或和显示 UUID 。ls -l /dev/disk/by-id/
mdadm --detail /dev/sda
现在将刚刚创建的核心安装到正常启动的磁盘:
对于 2.0 之前的 GRUB 版本,该
grub-bios-setup
命令仍可以grub-setup
像手册中那样调用。重启。
Welcome to GRUB!
在显示菜单之前,您应该会看到几页调试消息(或视情况而定)。我现在正在回答我自己的问题 1。这是 4Kn(“高级格式”)问题吗?
是的。
4Kn 驱动器并没有您想象的那么广泛支持;例如,它们与 Windows 7 或 GRUB 1 或许多英特尔芯片组不兼容。就我而言,问题似乎是主板上的 Intel 82801I Enterprise Southbridge 控制器芯片(ICH9 系列)。我认为这也是驱动器即使通过 USB 也无法进行 md_resync 部分故障的原因。上述链接中的分析似乎发现 Linux ata_piix 驱动程序在英特尔 ICH10 上运行良好,尽管缺乏英特尔的官方支持。对于 ICH9,我可能发现不同。我还没有测试驱动器是否可以在 AHCI 或 SAS 模式下工作。
只有主板制造商或进行过彻底测试的其他人可能知道驱动器兼容性信息。我过早地得出结论,“这不是硬件不兼容”,只是因为简单的读写工作。此主板的更新 BIOS 不支持 4Kn 是有原因的:因为主板不能可靠地支持。
在这些情况下,等效的 512e 驱动器没有理由不工作。
要回答您的第二个问题,有一个与 raid1 相关的错误,该错误已在 2.02 中进行了修补。
我希望它会有所帮助,即使我无法判断此错误是否存在于 2.02~beta1(报告错误的版本)之前。
编辑:此外,发布此消息后立即想到一个问题:您的 RAID1 是软件还是硬件 RAID?