我正在尝试解决涉及旧版 grub (0.97)、LVM2 和 dracut 的 Linux 启动配置问题,并尝试消除一些干扰因素。
我的反复试验过程如下:
- 修改grub.conf
- 通过 grub shell 将 grub.conf 安装到 MBR 中
- 重启
- 内核崩溃
为了删除#4,我是否错过了需要更新 initramfs 映像的步骤?
initramfs 映像包含哪些可能与启动期间安装的文件系统有关的内容?
我正在尝试弄清楚如何通过将新操作系统放在备用 LVM 分区上,然后修改 grub.conf/menu.lst 以从备用分区启动,以最少的停机时间编写正在运行的系统的整体升级脚本。
该操作系统基于 CentOS 6,我们使用 Anaconda 安装程序 - 出于某种原因,Anaconda 创建了一个/boot/grub/grub.conf
文件并将其符号链接到/boot/grub/menu.lst
。
答案1
您提到了 grub.conf 和 Grub 0.97。Grub 0.97 不使用grub.conf
。它使用menu.lst
。听起来好像您在系统上安装了两个二进制文件,但您把事情弄得有点混乱。
你不需要重建 initramfs/initrd 文件更改 grub.conf 或 menu.list 时。这两者之间几乎没有关系,至少在我见过的任何发行版中都没有关系。
grub 文件必须存在于 initramfs 之外,因为它们在加载 ramdisk 之前被使用。Grub 调用内核并将其指向 ramdisk 映像的位置。例如,如果您在 grub 菜单中添加另一个选项来启动另一个操作系统,则您无需对 initramfs 进行任何操作。
如果您确实更改了系统启动方式,那么您可能需要更改 grub 配置和其他配置,这可能需要您更新 initramfs。因此,您可能需要更新两者,但您不需要因为更新 grub 而更新 initramfs,反之亦然。
答案2
必须有一个启动分区,其中包含
- grub.conf,
- 要加载的内核,
- initramfs 映像,
- 一些 grub 组件(通常安装到 /boot/grub)。
此启动分区必须可由 grub 读取,因此它不能位于 LVM 中。在启动磁盘的前面创建一个单独的小型主分区(我通常为此使用 100MB,通常安装为 /boot)是一种很好的做法。
initramfs 中的内容及其配置方式取决于您的实现。通常,您的 Linux 发行版包含其特定的 initramfs 实现(因此这完全取决于您使用的发行版)。
initramfs 必须能够挂载根文件系统,为此,它需要必要的内核模块来访问该磁盘、分区和文件系统,除非它们已经编译到内核本身中。它还需要某种方式来指定您选择的根文件系统和要使用的挂载选项。某些实现在更改某些设置、选择不同的根文件系统或使用不同的挂载选项时必须更新 initramfs 映像。但是,可以编写一个不需要任何更新的 initramfs 实现,除非更改/升级/重新编译内核和模块,方法是从内核命令行读取必要的参数。因此,要了解您的 initramfs 实现的具体工作原理,您必须阅读里面的脚本,或者阅读特定于您的发行版的文档。