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

Lev*_*sky 5 boot arch-linux grub2 linux-kernel

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

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

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

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

怎么办呢?我应该查看mkinitcpio配置还是pacman配置?我实际上已经尝试查看两者的配置文件,到目前为止还没有想法。

bob*_*aul 2

查看此错误: 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 运行并自动检测已发生的内核更新。