Grub 1.98:“错误:未指定参数”

Grub 1.98:“错误:未指定参数”

最近,我更新了 Ubuntu 10.04 Server LTS。服务器报告自己为

DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=10.04
DISTRIB_CODENAME=lucid
DISTRIB_DESCRIPTION="Ubuntu 10.04.3 LTS"

这里有多台机器,安装和硬件都相同,除一台外,其他机器都运行正常。这台机器在启动过程中出现问题:

  1. 当 GRUB 加载时,它会停在主菜单并等待键盘输入。
  2. 按下某个键后,GRUB 会报告error: no argument specified并继续(无论是否有按键)。
  3. 网络没有出现:eth0 和 eth1 被重新定义为 eth4 和 eth5,并且 eth5 没有出现。ifup eth5在命令行上运行良好。

我仍在研究最后一个问题 - 但我怀疑前两个问题属于同一问题。检查一个工作版本/boot/grub/grub.cfg和这个版本之间的差异没有发现显著差异:只有(以前的)内核版本和根 UUID。

此系统与我们数据中心内其他类似(可运行)系统之间的显著区别在于,该系统是 Dell R710;其他系统是 Dell 2950。我们各地的 R710 都运行着 Ubuntu Server 10.04,但没有一个像这个一样更新得如此之快。

这个问题最近才出现;在过去的 48 小时内,我更新并重启了包括这个系统在内的三个系统。只有这一个有问题 - 但只有这一个在 GRUB 菜单上停止了。其他的都自动恢复了 - 所以也许我只是没看到这个错误?

Grub 是 1.98 版本:

| Status=Not/Inst/Cfg-files/Unpacked/Failed-cfg/Half-inst/trig-aWait/Trig-pend
|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)
||/ Name                            Version                           Description
+++-===============================-=================================-============================================
ii  grub-common                     1.98-1ubuntu12                    GRand Unified Bootloader, version 2 (common 
ii  grub-pc                         1.98-1ubuntu12                    GRand Unified Bootloader, version 2 (PC/BIOS

我发现此主题在 Ubuntu 论坛上,但它似乎与 Natty (11.10) 有关。一些报告表明,此错误出现在从 Lucid (10.04) 升级到 Maverick (11.04) 或从 Maverick 升级到 Natty 时;我只运行 Lucid LTS。此线程还与 GRUB 1.99 有关,此版本为 1.98。

该线程建议

search --no-floppy --fs-uuid --set 857d5af9-23cd-4d9b-908b-cc075e866758

应该是

search --no-floppy --fs-uuid --set=root 857d5af9-23cd-4d9b-908b-cc075e866758

有人能帮忙解决这个问题吗?我在这里看到这个错误是因为 GRUB 停在菜单上吗?为什么 GRUB 在一个系统上停在菜单上,而在其他系统上却不停?

更新:虽然实际版本是1.98GRUB 的真实版本是 GRUB 2;这也适用于 1.99 版本。

我越想越觉得,其他系统可能也报告了同样的错误,但仍然继续运行;这里真正的问题(无论如何,GRUB 的问题)是系统在菜单处停止。我无法测试其他系统进行比较,因为它们已经重新投入使用。

更新:我再次重启了机器。首先显示的消息(粗体)菜单出现。选择适当的选项后,它会显示(在干净的屏幕上)如上所述的消息Press any key to continue...。大约 5 秒钟后,屏幕再次清除并继续启动(不包括网络)。

GRUB2 安装报告的版本1.99~rc1-13ubuntu3与软件包报告的版本不同。我不确定这是不是现状,还是情况已经发生了变化。

更新:更多关于提到的 GRUB2 的两个版本。第一个是安装包,它是1.98-1ubuntu12;第二个是 GRUB2 菜单报告的版本,即1.99~rc1-13ubuntu3. 根据变更日志对于 GRUB2 软件包,版本 1.99~rc1-13ubuntu3 于 2011 年 4 月 21 日在 Natty 中推出(注意,不是Lucid) 和版本 1.98-1ubuntu12 于 2011 年 6 月 17 日在 Lucid 更新中推出。此系统上从未安装过 Ubuntu Natty 或 Oneric;但它安装了 Red Hat Enterprise Linux 5。但是,RHEL 5 使用的 GRUB 版本(在撰写本文时)是 0.97-13.5,即 GRUB Legacy。

所以在哪里1.99~rc1-13ubuntu3 版本从何而来?我强烈怀疑这是我的问题的根源,将 GRUB2 完全重新安装到 MBR 可以解决我的问题。但是,我不得不让系统恢复完全运行;因此,测试必须等待。

答案1

问题似乎是安装了两个不同版本的 GRUB。一个处于活动状态并加载到 MBR 中;另一个处于“待命”状态。中的文件/boot/grub是从其他地方填充的,不属于任何软件包。中的文件/usr/lib/grub/i386-pc应该是相同的,但在这种情况下却不是。

我创建了这个程序来检查差异:

#!/usr/bin/ruby

# The directory dir1 is the directory owned by the Debian package
# grub-pc.
dir1 = "/usr/lib/grub/i386-pc"

# The directory dir2 is populated presumably by a script in the
# grub-pc package.
dir2 = "/boot/grub"

# First, compare directories: compare files in package to
# files copied into the second directory (/boot/grub)
print "Directory comparisons:\n"
print "\nComparing #{dir1} to #{dir2}\n\n"

Dir.chdir(dir1)
Dir["*.img","*.mod","*.lst","*.o"].each { |x|
    printf("%27s... ", x)

    if File.exists?("#{dir1}/#{x}")
        if File.exists?("#{dir2}/#{x}")
            `diff -u #{x} #{dir2}/#{x} 2>&1`
            print ($? == 0 ? "ok\n" : "*** MISMATCH\n")
        else
            print "*** MISSING from #{dir2}\n"
        end
    end
}

# Scan certain files (in both directories) looking for version numbers
# and report
print "\nVersion numbers:\n\n"

Dir["#{dir1}/multiboot*","#{dir2}/multiboot*"].each { |x|
    printf("%70s", `strings --print-file-name #{x}`.grep(/GRUB/))
}

在其他(工作启动)系统上,我得到了这种输出(缩写):

Directory comparisons:

Comparing /usr/lib/grub/i386-pc to /boot/grub

                 cdboot.img... ok
               diskboot.img... ok
                 kernel.img... ok
                lnxboot.img... ok
                pxeboot.img... ok
                  grldr.img... ok

...剪辑...

               terminal.lst... ok
                 efiemu32.o... ok
                 efiemu64.o... ok

Version numbers:

             /usr/lib/grub/i386-pc/multiboot.mod: GRUB 1.98-1ubuntu12
            /usr/lib/grub/i386-pc/multiboot2.mod: GRUB 1.98-1ubuntu12
                        /boot/grub/multiboot.mod: GRUB 1.98-1ubuntu12
                       /boot/grub/multiboot2.mod: GRUB 1.98-1ubuntu12

在未按预期运行的系统上,从同一脚本可以看到以下输出:

Directory comparisons:

Comparing /usr/lib/grub/i386-pc to /boot/grub

                 cdboot.img... ok
               diskboot.img... ok
                 kernel.img... *** MISMATCH
                lnxboot.img... *** MISMATCH
                pxeboot.img... ok
                  grldr.img... *** MISMATCH
                   boot.img... *** MISMATCH
               biosdisk.mod... *** MISMATCH
                  chain.mod... *** MISMATCH
                 reboot.mod... *** MISMATCH
                   halt.mod... *** MISMATCH
                    vbe.mod... *** MISMATCH
                vbetest.mod... *** MISSING from /boot/grub
                vbeinfo.mod... *** MISSING from /boot/grub
                   play.mod... *** MISMATCH
                 serial.mod... *** MISMATCH
                    vga.mod... *** MISMATCH
                memdisk.mod... *** MISMATCH

...剪辑...

               parttool.lst... *** MISMATCH
                handler.lst... *** MISSING from /boot/grub
                  video.lst... *** MISMATCH
                 crypto.lst... *** MISMATCH
               terminal.lst... *** MISMATCH
                 efiemu32.o... *** MISMATCH
                 efiemu64.o... *** MISMATCH

Version numbers:

             /usr/lib/grub/i386-pc/multiboot.mod: GRUB 1.98-1ubuntu12
            /usr/lib/grub/i386-pc/multiboot2.mod: GRUB 1.98-1ubuntu12
                   /boot/grub/multiboot2.mod: GRUB 1.99~rc1-13ubuntu3
                    /boot/grub/multiboot.mod: GRUB 1.99~rc1-13ubuntu3

为了解决这个问题,我复制了 /boot/grub 并重新安装了 grub-pc:

rsync -Wav --progress /boot/grub /boot/grub.sav
apt-get --reinstall install grub-pc

这个可以工作,然后打包的 grub 会替换 /boot/grub 中以及大概 MBR 中的原始内容。

我还没有在系统重启时测试其结果;读者须知

相关内容