这是 CentOS 6.4,包含 Virtualbox OSE 中的所有更新(相当旧的版本)。以下所有信息均指 VM,我认为主机上没有任何问题。
/boot 是 /dev/sda1 (hd0,0) 上的单独 ext2 fs
我做了什么:
- cp /boot/grub/菜单.lst /boot/grub/菜单.lst.old
- vi /boot/grub/menu.lst
重启后,grub 菜单没有反映我所做的更改(对内核命令行的一些更改)。启动失败,因为旧命令不再起作用。
如果在 grub 命令行上我调用
- cat (hd0,0)/grub/menu.lst 新内容将按预期显示
- cat (hd0,0)/grub/menu.lst.old 旧内容将按预期显示
如果我以交互方式重复我在 grub 命令编辑中的更改,启动就会成功。
我已经重复多次了。我复制了 menu.lst(以便更改阻止列表),但问题始终存在。Grub 在其 cat 命令中“看到”新版本,但在菜单中却看不到。
该机器只有一个磁盘,单个磁盘只有一个 ext2 分区(其余为 LVM2),单个 ext2 分区仅包含一个名为 menu.lst 的文件。因此,应排除有关磁盘、分区或路径的任何混淆。
(由于某些奇怪的原因,grub 显示同一个磁盘 5 次:hd0、hd8、hd9、hd10 和 hd11,但它们都具有相同的内容,并且根目录正确设置为(hd0,0),所以我认为这不应该导致问题)
因此,看起来旧的 menu.lst 已被复制到某个隐藏位置,并且 grub 从该隐藏位置使用它作为菜单。编辑文件并没有修改“隐藏位置”。但首先,该文件有一个注释
# Note that you do not have to rerun grub after making changes to this file
对于第二点,我很确定在 Ubuntu 仍使用旧版 grub 的时候我已经多次做过这样的更新;对于第三点,据我了解,grub 可以读取 ext2 文件系统(grub 的 cat 命令是否可以支持这一点)所以没有理由使用“隐藏的地方”。
答案1
啊,我把问题发错了网站,我本想发在 serverfault 上。Superuser 对我来说听起来像 Unix su。只是调试时间太长,而且是在深夜……
无论如何我找到了解决方案:
RHEL 和 CentOS 根本不使用 menu.lst,而是使用 grub.conf。(可以在 grub 安装期间指定要使用的文件名。)
但是,有一个符号链接 menu.lst --> grub.conf
因此,如果管理员不知道 menu.lst 上的不同名称调用 vi 就会神奇地做正确的事情。
但是现在我记得当我调用 vi 时,我看到有太多地方需要更改,再次退出 vi 并调用
sed -i s/foo/bar/g menu.lst
进行更改。我甚至打电话
diff menu.lst.old menu.lst
验证一切正常并且确实看起来正确。
但是,sed -i 并没有像 vi 那样编辑符号链接的目标,而是用包含新内容的新文件替换了符号链接。grub.conf 仍未修改,所以它确实是我怀疑的“隐藏位置”
呼唤
sed -i s/foo/bar/g grub.conf
解决了所有问题。