ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Ubuntu内核升级全攻略:HWE、Mainline与UKUU详解

Ubuntu内核升级全攻略:HWE、Mainline与UKUU详解 手上有一台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然后更新GRUBsudo 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没装headersDKMS就会编译失败。解决方法是在安装内核包时确保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方案开始试起。
返回列表