手上有一台Ubuntu机器,系统版本有点老,新买的无线网卡驱动编译需要新内核,或者单纯想让老硬件在新内核下发挥点余热,这时候必然要面对一个问题:Ubuntu到底怎么升级内核?网上教程一抓一大把,有让你下脚本的,有让你自己编译的,还有直接甩给你一个.deb包让你装的,乱七八糟,照着做还有可能把系统搞到进不去桌面。
我自己的习惯是,凡是系统级操作,先看官方怎么说。Ubuntu官网和官方Wiki其实把升级内核的几种方案写得明明白白,只是很多人一上来就搜中文教程,把官方渠道给忽略了。这篇文章我就把官网给的那套升级内核方案整理出来,加上我自己实操时的细节处理,尽量让没接触过内核升级的人也能一次搞定。
1. 升级之前先把这些事情搞清楚
1.1 搞清楚当前内核版本和系统架构
内核升级不像装个普通软件那么随意,下手之前必须知道自己现在跑的是什么环境。打开终端,执行:
uname -r这是查看当前内核版本,比如输出5.15.0-91-generic,说明你用的是5.15内核系列,generic是Ubuntu默认的通用内核变体,绝大多数桌面和服务器用户用的都是它。
然后确认系统架构:
dpkg --print-architecture正常输出是amd64。这一步非常重要,因为下载内核安装包时必须严格匹配架构,装错了会直接报错,甚至损坏系统。很多人忽略这一点,到官网下载页面看到一堆文件就懵了,不知道下哪个,其实就是没搞明白自己的架构类型。
还需要知道自己的Ubuntu版本代号:
lsb_release -a比如输出22.04 LTS,代号是jammy。这个信息在后面选择HWE内核时用得上。
1.2 想清楚自己到底为什么升级内核
官网给出的升级方案不止一种,选哪种完全取决于你的目的。如果你的系统正常运行,只是想要新硬件支持,用HWE内核栈就够了,这是最稳妥的方式。如果你追求新内核特性,比如想要最新的调度器优化、文件系统改进,那就去Mainline归档下载最新内核。如果只是想折腾一下,或者做内核开发测试,那就用UKUU工具,这个工具本质上是把Mainline归档的下载和安装过程图形化、自动化。
我个人不推荐一上来就追最新版内核。内核不是越新越好,Ubuntu官方仓库里维护的内核版本经历过大量测试和补丁适配,稳定性有保障。而Mainline归档里的新内核是上游版本,Ubuntu没有做过深度定制和测试,用在生产环境会有一定风险。这一点官网的文档里也说得比较含蓄,但意思很明确:普通用户优先用官方仓库内的HWE内核。
2. 官网给出的三种升级方案
2.1 方案一:使用HWE内核栈
HWE是Hardware Enablement的缩写,翻译过来就是硬件支持栈。这是Ubuntu官方针对桌面和服务器长期支持版本提供的内核平滑升级机制。
具体来说,比如你安装了Ubuntu 20.04 LTS,默认内核是5.4。HWE内核栈会把这个内核升级到5.15,这个内核和22.04 LTS用的是同一个版本。22.04 LTS的HWE内核则来自24.04的6.8内核。简单理解就是:老版LTS系统通过HWE机制,用上新版LTS系统同款内核。
为什么官方要提供这个机制?因为长期支持版本的生命周期是5年,甚至扩展后可以达到10年。在这么长的时间里,市面上会不断出现新的硬件设备,比如新出的无线网卡、显卡、声卡。如果老系统一直锁死在内核版本上,用户买了新硬件插上没反应,体验就很糟糕。HWE机制就是让老系统具备识别新硬件的能力,同时内核版本又是经过Ubuntu团队测试验证的,不会像Mainline内核那样带有实验性质。
安装HWE内核的方法很简单:
sudo apt update sudo apt install --install-recommends linux-generic-hwe-22.04注意版本号要对齐自己的系统版本。如果你是22.04的系统,就把命令里的22.04对应上;如果是20.04,就改成20.04。这里的--install-recommends参数不能省,它会自动带上HWE内核栈推荐的相关驱动包,特别是显卡驱动和固件包。不加这个参数,装完内核之后可能还是认不到新硬件。
装完重启:
sudo reboot重启后查看当前内核版本:
uname -r如果看到5.15或者更高版本,说明HWE内核已经生效。
2.2 方案二:从Mainline归档手动安装
Mainline是Ubuntu官方的上游内核归档站点,地址是kernel.ubuntu.com。这里有每个正式发布版本的内核构建产物,全部以.deb包形式提供。
这个方案适合想用最新版本内核的玩家。比如你看到Linux内核发布了6.9版本,但Ubuntu仓库里还没有,那就可以来Mainline归档下载安装。
访问Mainline页面后,找到目标版本号,比如v6.5.7,点击进入文件夹,里面通常是这些文件:
linux-headers-6.5.7-060507-generic_*.deblinux-headers-6.5.7-060507_*.deblinux-image-unsigned-6.5.7-060507-generic_*.deblinux-modules-6.5.7-060507-generic_*.deb
这些文件各有用处,不是随便装一下就行。三个都必须下载,缺一个都不行。linux-headers-*_all.deb是通用头文件,linux-headers-*-generic_*.deb是当前内核的头文件,linux-image是内核本体,linux-modules是内核模块。模块包尤其重要,里面包含了各种驱动程序,没有它内核根本起不来。
有人说Generic包看着麻烦,下载时可以直接用通配符,在下载目录下执行:
wget https://kernel.ubuntu.com/~kernel-ppa/mainline/v6.5.7/amd64/linux-headers-6.5.7-060507-generic_6.5.7-060507.202310120936_amd64.deb但更好的做法是直接在浏览器里进入页面,把页面里所有amd64相关的linux-*包点一遍,逐个下载。下载完成后,在终端里进入下载目录,执行:
sudo dpkg -i *.debdpkg会按照依赖关系自动安装这三个包。如果提示依赖错误,先执行:
sudo apt install -f修复依赖后再安装。
2.3 方案三:使用UKUU工具
UKUU是Ubuntu Kernel Update Utility的缩写,这是Ubuntu官方推荐的第三方内核管理工具,它其实是在Mainline归档外面包了一层图形化外壳,集成在软件仓库里。
安装方法:
sudo add-apt-repository ppa:cappelikan/ppa sudo apt update sudo apt install ukuu安装完成后,在应用列表里找到UKUU并打开,界面上会列出所有Mainline内核版本。列表里每个版本都有状态标记,绿色是正在使用的版本,黄色是已安装版本,白色是未安装版本。选择目标版本,点击右侧的安装按钮,它会自动下载并安装对应的内核头文件和模块包。
使用UKUU时有一个小细节需要注意:它的安装本质上也是调用的dpkg,所以同样会有依赖问题处理。和手动下载相比,UKUU的优势是不用自己去区分哪些包是需要的,它会自动处理,同时还能方便地删除旧内核。
3. 实操完整流程和遇到的问题记录
3.1 手动安装Mainline内核的全过程
为了让大家看得更明白,我用一次真实的升级过程来做演示。这台机器系统是Ubuntu 22.04,默认内核是5.15,准备升级到6.5.7版本。
首先是下载安装包。我在/opt下建了一个专门目录:
sudo mkdir -p /opt/kernel-6.5.7 cd /opt/kernel-6.5.7然后逐一下载。内核归档页面里有多个包,我只选择amd64架构需要的三个。下载命令如下:
sudo wget https://kernel.ubuntu.com/~kernel-ppa/mainline/v6.5.7/amd64/linux-headers-6.5.7-060507-generic_6.5.7-060507.202310120936_amd64.deb sudo wget https://kernel.ubuntu.com/~kernel-ppa/mainline/v6.5.7/amd64/linux-headers-6.5.7-060507_6.5.7-060507.202310120936_all.deb sudo wget https://kernel.ubuntu.com/~kernel-ppa/mainline/v6.5.7/amd64/linux-image-unsigned-6.5.7-060507-generic_6.5.7-060507.202310120936_amd64.deb sudo wget https://kernel.ubuntu.com/~kernel-ppa/mainline/v6.5.7/amd64/linux-modules-6.5.7-060507-generic_6.5.7-060507.202310120936_amd64.deb下载完成后,先核对一下文件大小和版本号,确认没有下载不完整的文件,再执行安装:
sudo dpkg -i *.deb这一步的输出会刷很长一串日志,看到Setting up linux-image-6.5.7-060507-generic相关字样,说明内核本体安装成功。紧接着执行:
sudo update-grub这个命令的作用是更新GRUB引导菜单,让系统在下次启动时能识别到新内核。GRUB是Linux的引导加载器,可以理解为开机时那个让你选择系统的界面底层机制。如果你不执行这一步,可能会重启后直接进了旧内核。
一切就绪后重启:
sudo reboot启动时在GRUB菜单里选择Advanced options for Ubuntu,能看到新的6.5.7内核已经在列表里。如果没手动选择,默认会进GRUB记住的上一次内核。进入系统后输入uname -r确认版本:
6.5.7-060507-generic到这里,内核升级已经完成。
3.2 升级后必须做的几件事
内核升级成功不代表所有事情都结束了,接下来这几件才是真正考验系统稳定性的时候。
第一件是确认驱动是否正常。新内核自带的驱动模块和你原来用的驱动模块版本不一样,特别是显卡驱动、无线网卡驱动这种复杂模块,容易出问题。我在升级后一般会跑一遍:
sudo dmesg | grep -i error看看内核日志有没有报错。如果输出为空或者没有关键错误,驱动基本没问题。如果出现failed to load或者not found之类的字样,那就是驱动需要在新的内核下重新编译或者重新安装。
第二件是安装内核头文件对应的编译工具链。如果以后要自己编译驱动模块,比如NVIDIA显卡驱动、VirtualBox内核模块,必须确保当前运行的内核头文件和相关编译工具链是完整的:
sudo apt install build-essential第三件是保留旧内核。升级内核对老系统来说算是一次大动作,别急着删除旧内核。旧内核是回退的唯一保障。如果在用新内核时遇到异常,重启后从GRUB菜单里选择旧内核就能回到原来的环境。至少连续使用新内核几天,确认没问题后再考虑清理旧内核。
3.3 回退到旧内核的方法
万一新内核让你遇到的问题比解决的多,回退是有必要的。重启机器,在GRUB菜单里按向下方向键选中Advanced options for Ubuntu,回车进入子菜单,里面会列出所有已安装的内核版本。选择老的版本进入系统。
进入系统后,如果你确定不想要新内核了,可以把它卸载:
sudo dpkg --remove linux-image-6.5.7-060507-generic sudo dpkg --remove linux-headers-6.5.7-060507-generic sudo dpkg --remove linux-headers-6.5.7-060507 sudo dpkg --remove linux-modules-6.5.7-060507-generic然后更新GRUB:
sudo update-grub这样系统回到原来的内核,干净的卸载不会留下任何残留。官网文档里其实没有把回退写得很透彻,但这是实际操作中最重要的一环,一定要掌握。
4. 实操中常见的坑和排查技巧
4.1 /boot分区空间不足导致安装失败
这是遇到最多的问题。/boot是独立分区的用户,旧内核装了一大堆,空间被占满了,新内核写入时直接报No space left on device。查看空间占用:
df -h /boot如果空间确实满了,清理旧内核。注意我是说清理,不是让你把所有旧内核删光,至少留一个当前能正常启动的版本。列出当前内核:
dpkg --list | grep linux-image找到不需要的老版本内核,逐个删除:
sudo apt purge linux-image-5.15.0-91-generic这里有一个经验:如果/boot空间很小,打开自动清理旧内核的功能会省心很多:
sudo apt autoremove --purge这个命令会把已经不再被需要的旧内核包一并清理掉,腾出可用空间。但我更建议在删除之前先确认当前系统一切正常,至少能正常进入桌面或控制台。
4.2 安装过程中提示依赖关系无法满足
Mainline归档里下载的包,有些会依赖特定版本的linux-modules-extra或其他辅助包。如果执行dpkg -i时看到依赖不满足的错误,解决方法是:
sudo apt install -f-f参数会尝试修复破损的依赖关系。如果这还不够,说明你少下载了某个包,到归档页面把所有amd64相关的包都下载下来再安装。还有另外一种情况:你的Ubuntu版本过旧,仓库源里某些基础包版本太低,这时候需要先:
sudo apt update && sudo apt upgrade把系统基础软件包升到最新,再回头安装内核。
4.3 安装完成后无线网卡或显卡驱动失效
升级内核后最常见的现象就是无线网卡搜不到WiFi,或者NVIDIA显卡驱动加载失败。这背后是DKMS动态内核模块支持的机制问题。当内核发生改变时,DKMS会自动重新编译所有已经注册的驱动模块,但编译过程需要对应的内核头文件。如果你只装了image没装headers,DKMS就会编译失败。
解决方法是在安装内核包时,确保linux-headers-*包已经安装。如果驱动已经失效,重新安装对应驱动即可。以NVIDIA显卡驱动为例:
sudo apt install --reinstall nvidia-driver-550执行完毕后重启,驱动就能恢复正常。如果是DKMS编译失败,还可以用:
sudo dkms status查看哪些模块编译失败,然后重新编译或重新安装。
4.4 启动时卡在紫色界面或黑屏
出现这种情况,多半是内核参数和显卡驱动之间有冲突。在新内核启动项上按e键进入编辑模式,找到quiet splash这一行,把这两个参数删掉,替换成:
nomodesetnomodeset参数让内核在加载显卡驱动时不做模式设置,强制使用基本显示输出。这是一个排查用的临时参数,能让你至少看到系统启动过程,进入系统后再处理驱动问题。如果加了nomodeset能进系统,说明问题确实出在显卡驱动上,而不是内核本体有问题。
4.5 Secure Boot导致内核无法加载
如果机器开启了UEFI Secure Boot,手动安装的Mainline内核可能会因为没有正确签名而被拒绝加载,表现为启动时直接报Security policy violation。解决办法有两个方向:一是进入BIOS临时关闭Secure Boot,等系统装好后再打开;二是使用Ubuntu官方仓库里的HWE内核,因为它是有签名的。UKUU工具在新版本中也加入了针对Secure Boot的签名处理,但实际推导下来,Ubuntu官方对第三方内核的Secure Boot支持本身就不够完善,遇到这种问题直接在BIOS里关掉Secure Boot省心得多。
5. 最终的选型建议
前面介绍的三种方案,适用人群其实很明确:
- HWE内核是给绝大多数普通用户用的。不折腾、要稳定、只是想要新硬件支持,直接装它,不用纠结。
- Mainline归档是给喜欢新特性、愿意承担一定风险的用户准备的。升级过程中出现问题自己要有排查能力。
- UKUU工具本质上只是把Mainline归档的安装过程图形化,适合不想敲太多命令,但又追求新内核的用户。
在升级完新的内核之后,我还习惯检查一遍系统日志里有没有异常,用了一个星期左右确认没问题,才敢把旧内核清掉。上个月我帮朋友的一台旧笔记本升级内核,就是为了让它的蓝牙模块能被正确识别,用的就是HWE方案,装完重启蓝牙就能用了。整个过程中没有遇到任何大的坑,说明官方仓库的稳稳妥妥适合大多数人。
内核升级这个操作本身不算难,难的是对版本、驱动、引导、回退这些环节心里有数。把官网方案读懂吃透,再配合这篇文章里的细节处理,基本就能顺利完成了。如果你恰好有一台老机器想焕发新生,不妨从HWE方案开始试起。