背景
做过 FPGA 的朋友都知道,在使用 xilinx 官方的一些驱动、工具或者使用其他大佬的开源项目时,往往对 linux 内核版本有所要求,但是很多内核版本并没有包含在已有的 linux 发行版中,需要通过指定升级的方式才能变成特定内核的 linux 系统,本文就以 ubuntu 为例做 linux 内核版本固定的讲解。
本文以 ubuntu20.04LTS 发行版为例,安装具有 5.4.0-125-generic 内核的 ubuntu20.04。
方法介绍
对于有钱的人来说,其中一种方法是直接下载 linux 内核的源码,自己编译一套特定内核的系统,但是这个方案太吃存储和网速,不太符合正常的使用场景,往往正常的使用场景使用 cubic 修改获得特定内核版本的镜像或者通过安装低版本内核的 ubuntu 再指定安装特定版本的内核来实现。但即使使用 cubic 生成特定内核版本的镜像也逃不开内核版本固定的宿命,因此本文介绍后一种较为简单的方案。
1.系统要求
一般来说系统需要选择安装内核版本低于指定版本的系统镜像
2.安装内核
在正常安装完系统进入系统后,使用如下命令安装特定版本的内核:
sudo apt update
sudo apt install linux-image-5.4.0-125-generic \
linux-modules-5.4.0-125-generic \
linux-modules-extra-5.4.0-125-generic3.保护内核防止被移除
虽然现在安装了特定版本的内核,但是如果不对内核做保护,在日常的更新中新的内核就会占据旧内核的位置将其淘汰。
sudo apt-mark hold linux-image-5.4.0-125-generic \
linux-modules-5.4.0-125-generic \
linux-modules-extra-5.4.0-125-generic
sudo apt-mark hold linux-headers-5.4.0-125 \
linux-headers-5.4.0-125-generic4.防止自动更新
Ubuntu 通常通过内核“元软件包”安装新版本。如果还希望停止自动安装新内核,先查看安装了哪些:
apt list --installed 2>/dev/null | grep -E '^linux-(generic|image-generic|headers-generic)'普通 generic 内核通常锁定以下三个:
sudo apt-mark hold linux-generic linux-image-generic linux-headers-generic如果显示的是带 -hwe-20.04 等后缀的包,请使用实际完整包名;未安装的包不需要锁定。
sudo apt-mark hold linux-generic-hwe-20.04 \
linux-headers-generic-hwe-20.04 \
linux-image-generic-hwe-20.04这里的包名可以通过 apt list --upgradable 来查看(往往指定内核版本是低于最新版本的,因此可以看到包名是否为这种后缀包)。
5.设置GRUB默认启动指定内核
以下适用于使用 GRUB 启动的 Ubuntu。先查看菜单名称:
grep -E "^[[:space:]]*(submenu|menuentry) " /boot/grub/grub.cfg编辑 GRUB 配置:
sudo nano /etc/default/grub将 GRUB_DEFAULT 改为下面这一行,菜单文字需要与你上一步看到的名称一致:
GRUB_DEFAULT="Advanced options for Ubuntu>Ubuntu, with Linux 5.4.0-125-generic"PS:这里选择普通启动项,不要选带 recovery mode 的项。然后更新并重启:
sudo update-grub
sudo reboot6.重启后确认
uname -r
apt-mark showhold7.Pinning内核版本,防止update内核
往往做到以上 6 步并不足以保证内核锁定在对应版本,往往随着 apt update 和 upgrade,内核版本依然会被更新,因此需要 pinning 内核版本,防止更新时将内核也更新。
sudo tee /etc/apt/preferences.d/99-freeze-kernel.pref >/dev/null <<'EOF'
Package: linux-image-5.4.0-125-generic linux-image-unsigned-5.4.0-125-generic linux-modules-5.4.0-125-generic linux-modules-extra-5.4.0-125-generic linux-headers-5.4.0-125 linux-headers-5.4.0-125-generic
Pin: version *
Pin-Priority: 500
Package: linux-generic* linux-image-* linux-headers-* linux-modules-*
Pin: version *
Pin-Priority: -1
EOF通过这种方式就可以彻底将内核版本定死在特定版本上,不同版本的内核需要修改上面命令中的内核版本为对应的内核。另外,可以通过下面的命令查看内核版本是否还会更新:
apt-cache policy linux-generic linux-image-generic \
linux-image-5.4.0-125-generic
apt-get -s dist-upgrade其中:
结果主要看 installed、candidate 和 Version table 三行,installed 是当前安装的版本,candidate 是 APT 默认会选择的版本,Version table 是已知版本、优先级及来源;优先级为 -1 是禁止 APT 选择该版本安装,500 是允许正常安装。
经过这样设置的 linux 内核就可以放心大胆地 update、upgrade 而不用担心会更新内核版本了。
默认评论
Halo系统提供的评论