我用流行操作系统20.04最近内核升级,导致了一些问题,所以我不得不切换回以前的内核版本。 (更具体地说,内核已升级到,由于某些旧版本的 ElasticSearch 出现问题,v5.16
我不得不恢复到)。v5.15
您可能知道,Pop OS 使用systemd-boot
,几个月前我使用 systemd 启动菜单选择旧内核作为默认启动选项。一切又恢复正常,直到几天前我注意到系统是用内核 v5.16 启动的!我仔细检查了 systemd 启动菜单,它仍然设置为使用旧内核选项启动!我的猜测是旧的内核选项已升级并切换到 v5.16,这是不可取的!
不幸的是,与 相比grub
,它似乎systemd-boot
试图过度简化事情并且没有显示明确的内核版本可供选择!
所以我搜索了其他选项来更改默认启动内核,我发现的只是本文。所以我使用以下命令来更改我的默认内核选项:
me@pop-os:~$ sudo kernelstub -v -l -k /boot/vmlinuz-5.15.23-76051523-generic -i /boot/initrd.img-5.15.23-76051523-generic
kernelstub.Config : INFO Looking for configuration...
kernelstub : INFO System information:
OS:..................Pop!_OS 20.04
Root partition:....../dev/sda3
ESP Path:............/boot/efi
ESP Partition:......./dev/sda1
ESP Partition #:.....1
NVRAM entry #:.......-1
Boot Variable #:.....0000
Kernel Boot Options:.quiet loglevel=0 systemd.show_status=false splash
Kernel Image Path:.../boot/vmlinuz-5.15.23-76051523-generic
Initrd Image Path:.../boot/initrd.img-5.15.23-76051523-generic
Force-overwrite:.....False
kernelstub.Installer : INFO Copying Kernel into ESP
kernelstub.Installer : INFO Copying initrd.img into ESP
kernelstub.Installer : INFO Setting up loader.conf configuration
kernelstub.Installer : INFO Making entry file for Pop!_OS
kernelstub.Installer : INFO Backing up old kernel
kernelstub.Installer : INFO Making entry file for Pop!_OS
me@pop-os:~$ echo $?
0
从上面可以看到,命令成功运行,并显示退出代码0
;但并不生效!当我仔细检查它的输出时,kernelstub
它仍然和以前一样!
me@pop-os:~$ sudo kernelstub -p
kernelstub.Config : INFO Looking for configuration...
kernelstub : INFO System information:
OS:..................Pop!_OS 20.04
Root partition:....../dev/sda3
ESP Path:............/boot/efi
ESP Partition:......./dev/sda1
ESP Partition #:.....1
NVRAM entry #:.......-1
Boot Variable #:.....0000
Kernel Boot Options:.quiet loglevel=0 systemd.show_status=false splash
Kernel Image Path:.../boot/vmlinuz-5.17.5-76051705-generic
Initrd Image Path:.../boot/initrd.img-5.17.5-76051705-generic
Force-overwrite:.....False
kernelstub : INFO Configuration details:
ESP Location:................../boot/efi
Management Mode:...............True
Install Loader configuration:..True
Configuration version:.........3
以下是我在系统上安装的内核:
me@pop-os:~$ dpkg --list | grep linux-image | grep ii
ii linux-image-5.15.23-76051523-generic Linux kernel image for version 5.15.23 on 64 bit x86 SMP
ii linux-image-5.16.19-76051619-generic Linux kernel image for version 5.16.19 on 64 bit x86 SMP
ii linux-image-5.17.5-76051705-generic Linux kernel image for version 5.17.5 on 64 bit x86 SMP
ii linux-image-generic Generic Linux kernel image
更新:根据 @telcoM 的回答,以下是 的输出bootctl list
:
me@pop-os:~$ sudo bootctl list
Boot Loader Entries:
title: Pop!_OS (Pop_OS-current.conf)
id: Pop_OS-current.conf
source: /boot/efi/loader/entries/Pop_OS-current.conf
linux: /EFI/Pop_OS-4574dd5b-40ad-462f-bfbe-22676dd09bdc/vmlinuz.efi
initrd: /EFI/Pop_OS-4574dd5b-40ad-462f-bfbe-22676dd09bdc/initrd.img
options: root=UUID=4574dd5b-40ad-462f-bfbe-22676dd09bdc ro quiet loglevel=0 systemd.show_status=false splash
title: Pop!_OS (Pop_OS-oldkern.conf) (default)
id: Pop_OS-oldkern.conf
source: /boot/efi/loader/entries/Pop_OS-oldkern.conf
linux: /EFI/Pop_OS-4574dd5b-40ad-462f-bfbe-22676dd09bdc/vmlinuz-previous.efi
initrd: /EFI/Pop_OS-4574dd5b-40ad-462f-bfbe-22676dd09bdc/initrd.img-previous
options: root=UUID=4574dd5b-40ad-462f-bfbe-22676dd09bdc ro quiet loglevel=0 systemd.show_status=false splash
title: Pop!_OS recovery
id: Recovery-9D1B-C521.conf
source: /boot/efi/loader/entries/Recovery-9D1B-C521.conf
linux: /EFI/Recovery-9D1B-C521/vmlinuz.efi
initrd: /EFI/Recovery-9D1B-C521/initrd.gz
options: boot=casper hostname=recovery userfullname=Recovery username=recovery live-media-path=/casper-9D1B-C521 live-media=>
title: Reboot Into Firmware Interface
id: auto-reboot-to-firmware-setup
source: /sys/firmware/efi/efivars/LoaderEntries-4a67b082-0a4c-41cf-b6c7-440b29bb8c4f
如您所见,默认启动内核设置为该old-kernel
选项;但没有指定明确的内核版本,我无法弄清楚旧的和当前的内核是什么版本。但根据我看到的行为,我可以猜测old = 5.16
并且current = 5.17
。
我怎样才能解决这个问题?我想将默认启动内核设置为 v5.15 并且不再更改。
答案1
首先,您的系统现已更新至内核 5。17 号.5,而 5.16.19 现在可能是old-kernel
.请显示 的输出sudo bootctl list
。
我自己不使用Pop OS,但据我了解systemd-boot
,设置默认启动项的命令可能是bootctl set-default
,查看可用启动项的命令是bootctl list
。
假设我理解正确,kernelstub
命令只是管理每个内核的详细信息,如果您不指定确切的内核,则默认在最新的内核上运行。
由于您的kernelstub -v -l ...
命令显然有效,现在应该有 Pop OS 的第三个条目bootctl list
,其中 5.15 内核首先在 5.16 中被推入插槽old-kernel
,然后在 5.17 的引入中完全从列表中删除(?)。所以您的方向是正确的,但只需要采取更多步骤。
通过使用sudo bootctl list
和sudo bootctl set-default
您应该能够将 5.15 内核恢复为默认启动选项。
之后,只要您需要坚持使用旧的 ElasticSearch,您就需要阻止新内核包的到来。您应该设置一个包管理器抓住对于内核元包具有最新的内核包作为依赖项。正是元包的升级触发了新内核镜像包的安装。
在 Debian 中,这将是linux-image-amd64
,最高级别linux-image-generic
将是虚拟包。看来 Pop OS 构建者已经简化了结构,在您的情况下,元包似乎是linux-image-generic
相反的。
您也可以使用 GUI 包管理器来设置保留,但在命令行上它将是:
sudo apt-mark hold linux-image-generic
或者
echo "linux-image-generic hold" | sudo dpkg --set-selections
要查看现有的包保留:
dpkg --get-selections | grep "\<hold$"
或者
apt-mark showhold
最终,您可能会升级 ElasticSearch 或以其他方式摆脱与 5.15 内核保持一致的要求。此时,您需要删除保留以允许再次更新内核:
sudo apt-mark unhold linux-image-generic
或者
echo "linux-image-generic install" | sudo dpkg --set-selections
答案2
您的命令可能kernelstub
工作正常,但您仍然引导到错误的内核。我最近遇到了类似的问题,并注意到两件事:
kernelstub -p
即使正确配置了引导到不同的内核,输出也不会更改以显示不同的内核。- Kernelstub 只会更改“当前”启动选项。
因此,该命令可能正在工作,但是,当您重新启动时,默认选项“old-kernel”意味着您没有使用您设置的内核。如果您运行问题中的命令,然后重新启动并选择“当前”选项,您应该使用您选择的内核启动。您可以通过运行uname -r
检查当前使用的内核版本来确认这一点。
答案3
我也遇到过类似的问题,我弄乱了 Pop!_OS 22.04 上的内核版本,不得不在版本之间来回切换才能找到最好的版本。
要将我的内核版本设置为 6.6.10,我使用了
# update-initramfs -u -k 6.6.10-76060610-generic
应该使用内核版本 6.6.10-...“更新现有的 initramfs”(如果您只知道它的开头,您可以使用 tab 自动填充完整的内核版本)
这修复了kernelstub -p
显示并在启动时使用所需的内核(6.6.10)。重启后:
$ uname -r
6.6.10-76060610-generic
$ sudo kernelstub -p
...
Kernel Boot Options:.quiet loglevel=0 systemd.show_status=false splash systemd.unified_cgroup_hierarchy=0
Kernel Image Path:.../boot/vmlinuz-6.6.10-76060610-generic
Initrd Image Path:.../boot/initrd.img-6.6.10-76060610-generic
Force-overwrite:.....False
...
至于检查“当前”和“旧”配置使用的内核版本,我比较了目录/boot/efi/EFI/Pop.../
和/boot/
目录中内核映像的校验和,因为 中的内核映像的/boot/
文件名中包含版本。哈基,但它有效。