最近,我更新了 Ubuntu 10.04 Server LTS。服务器报告自己为
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=10.04
DISTRIB_CODENAME=lucid
DISTRIB_DESCRIPTION="Ubuntu 10.04.3 LTS"
这里有多台机器,安装和硬件都相同,除一台外,其他机器都运行正常。这台机器在启动过程中出现问题:
- 当 GRUB 加载时,它会停在主菜单并等待键盘输入。
- 按下某个键后,GRUB 会报告
error: no argument specified
并继续(无论是否有按键)。 - 网络没有出现: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 中的原始内容。
我还没有在系统重启时测试其结果;读者须知。