ubuntu更改使用期望的内核版本
背景
因为要安装驱动固件,但是这个ubuntu的内核版本太新需要降低版本,所以写个流程记录下更改内核的简单配置。
环境在kvm的虚拟机环境下进行,实际和物理机没有区别。
执行流程
首先虚机的ubuntu都会默认使用ubuntu的软件源,这里直接查看。
原版本是5.15.0-160-generic,我们的期望是改成5.15.0-72-generic版本。
首先查看ubuntu的内核源,
apt search linux-image-5.15.0.72-generic

发现有接着我们下载
sudo apt install -y \linux-image-5.15.0-72-generic \linux-headers-5.15.0-72-generic \linux-modules-5.15.0-72-generic
接着创建并执行脚本,作用是生成将当前内核改为5.15.0-72-generic 需要在grub中做什么配置
TARGET_KERNEL="5.15.0-72-generic"echo "正在查找内核 $TARGET_KERNEL 在 GRUB 菜单中的位置..."
echo "================================================"# 获取 GRUB 配置
GRUB_CFG="/boot/grub/grub.cfg"if [ ! -f "$GRUB_CFG" ]; thenecho "错误: 找不到 $GRUB_CFG"exit 1
fi# 查找目标内核
echo "搜索目标内核: $TARGET_KERNEL"
echoFOUND=0
MENU_INDEX=0
SUBMENU_INDEX=0
IN_SUBMENU=0while IFS= read -r line; do# 检测子菜单开始if [[ $line =~ "submenu" ]] && [[ $line =~ "Advanced options" ]]; thenIN_SUBMENU=1SUBMENU_TITLE=$(echo "$line" | sed -n "s/.*'\(.*\)'.*/\1/p")echo "找到子菜单: $SUBMENU_TITLE"continuefi# 检测菜单项if [[ $line =~ "menuentry" ]]; thenMENU_TITLE=$(echo "$line" | sed -n "s/.*'\(.*\)'.*/\1/p")if [[ $IN_SUBMENU -eq 1 ]]; thenSUBMENU_INDEX=$((SUBMENU_INDEX + 1))CURRENT_INDEX="1>$((SUBMENU_INDEX - 1))"elseMENU_INDEX=$((MENU_INDEX + 1))CURRENT_INDEX="$((MENU_INDEX - 1))"fi# 检查是否包含目标内核if [[ $MENU_TITLE =~ $TARGET_KERNEL ]]; thenFOUND=1echo "✅ 找到目标内核!"echo " 菜单标题: $MENU_TITLE"if [[ $IN_SUBMENU -eq 1 ]]; thenecho " GRUB_DEFAULT 设置: \"$SUBMENU_TITLE>$MENU_TITLE\""echo " 或者使用数字索引: \"1>$((SUBMENU_INDEX - 1))\""elseecho " GRUB_DEFAULT 设置: \"$MENU_TITLE\""echo " 或者使用数字索引: \"$((MENU_INDEX - 1))\""fibreakfifi
done < "$GRUB_CFG"if [[ $FOUND -eq 0 ]]; thenecho "❌ 未找到内核 $TARGET_KERNEL"echo "当前 GRUB 菜单中的内核:"grep "menuentry" "$GRUB_CFG" | grep "Linux" | head -10
fi

接着把那个提示的GRUB_DEFAULT配置复制,贴到/etc/default/grub文件的GRUB_DEFAULT配置项

执行更新配置
update-grub

接着重启后验证内核是否为我们期望的版本
reboot

