内核升级时自动在 GRUB / GRUB2 菜单中包含 N 个最新内核版本

内核升级时自动在 GRUB / GRUB2 菜单中包含 N 个最新内核版本

我喜欢 Ubuntu 的一点是,GRUB 菜单总是允许我在启动时选择最新(默认)或第二最新(等)内核版本。

在 Arch Linux 中,默认情况下我不能这样做。唯一的选项是普通映像和后备映像,并且都引导最新的内核。如何在 Arch 中实现类似 Ubuntu 的行为?我使用 Grub 和 Grub2,但我想我不需要对引导加载程序进行太多配置。它可能会/boot自动包含在菜单中找到的图像。不过,我可能是错的。

所以,我需要的,从最重要到最不重要的是:

  1. 升级期间创建的新内核映像mkinitcpio不会覆盖之前的内核映像;
  2. 最新的内核作为默认选项出现在引导加载程序菜单中;
  3. 非常旧的版本被排除在菜单之外或隐藏到“旧版本”菜单项中(没那么重要)

人们会怎样做呢?我应该查看mkinitcpio配置还是也许pacman配置?我实际上已经尝试查看两者的配置文件,到目前为止还没有任何想法。

答案1

看到这个错误: https://bugs.archlinux.org/task/16702#comment80122

还有这篇博文: http://losing Generation.homelinux.org/2009/10/16/why-arch-linuxs-kernel-upgrades-suck/

到目前为止我还没有找到好的解决方案,但如果找到的话我会更新。

除了 grub、内核和 initrd 之外,需要记住的一件事是 /usr/lib/modules/。当 linux 软件包更新时,旧软件包会删除 /usr/lib/modules/ 中的文件夹,而新内核会添加新模块。如果您希望两个内核都工作,您将需要两组模块。 /usr/src/ 包含内核头文件(需要构建新模块,例如 nvidia 驱动程序),因此您可能也想保留它们。

我猜的步骤是这样的:
1. 检测 linux 软件包将要升级。
2. 备份卸载时要删除的内容(/usr/src/$(uname -r)、/usr/lib/modules/$(uname -r)、/boot/{vmlinuz-linux,initramfs-linux.img ,initramfs-linux-fallback.img})
3. 让 pacman 进行升级
4. 恢复 2 中的所有内容(可能为 /boot 中的内容指定一个新名称
5. 编辑 grub 或其他内容。

替代步骤(不太好)
1. 让 pacman 更新
2. 检测内核是否已更新
3. 从 /var/cache/packman/pkg/linux-${previous_version}-pkg.tar.xz 提取 /usr/src/, / usr/lib/{modules,extramodules} 和 /boot/vmlinuz (显然,重命名了 /boot 中的那个)
4. 使用 -k 选项运行 mkinitcpio 来构建旧的 init
5. 编辑 grub 或其他内容

在这种替代方法中,您会丢失第 3 方模块(虚拟机、ATI/Nvidia 等),但您可能可以从 cron 运行并自动检测已发生的内核更新。

答案2

据我记得最新的内核始终是 /boot/grub/grub.conf 文件中的第一个内核。要自动加载第一个条目,您需要将以下两行放在 grub.conf 的顶部

default         0
timeout         1

grub 加载程序等待timeout时间(以秒为单位)。是default内核列表中的 x 内核。

关于mkinitcpio:我认为没有简单的方法。但我认为最后一个和当前的内核总是在启动时可用,并且最新的内核始终位于 grub.conf 中的位置 0。

相关内容