☰
Arch Linux内核切换指南:从stable到LTS的完整步骤
2026/10/19 3:47:24 网站建设 项目流程

我最近把一台日常主力机的内核从 stable 换成了 LTS,起因是连续两次在滚动更新后碰到内核模块与现有驱动不匹配,一次是启动阶段卡在加载模块,一次是跑了一段时间突然重启。因为机器上有比较重要的长期任务,我决定不再跟着最新的 stable 内核走。如果你也在用 Arch Linux,又希望能少承担一点“追新”的内核风险,想从 stable 更换为 LTS,这篇文章可以做为参考。我会把前提分析、切换步骤、默认引导项设置、验证和清理、以及我踩过的几个坑,按实际操作顺序完整说一遍。

1. 为什么要把 stable 换成 LTS

1.1 stable 与 LTS 内核的真实差异

Arch Linux 官方仓库里默认的内核包叫 linux,对应的是内核主线的最新 stable 版本。这里的 stable 是相对内核开发周期而言,不是说它一定不修 bug。内核社区在发布新版本后,虽然会有少量后续修复,但生命周期很短,新版本一出现,老版本基本就进入维护尾声。滚动更新的 Arch 会不断把内核升级到最新,这个策略带来的好处是你很快能用上新的调度器、文件系统优化、硬件驱动等,但也意味着一次普通升级,可能跨越好几个内核小版本,某些第三方内核模块很可能跟不上。

linux-lts 这个包对应的是长期维护分支。它不会频繁引入新特性,主要修复安全漏洞和严重 bug,维护周期以年计算。也就是说,升级频率明显降低,版本跳变也小得多,对依赖特定内核版本编译模块的人来说,维护成本低很多。用生活里的例子讲:stable 内核是“每个季度都换新款手机的人”,LTS 内核是“手机不坏就一直用,只打安全补丁的人”。两者都能正常使用,但心态完全不一样。

还有一个很容易忽略的点:linux 和 linux-lts 是互相独立的软件包,生成的内核镜像和模块文件都放在不同的路径下。它们可以同时存在于系统里,GRUB 引导菜单也会同时出现对应的启动项。这就意味着我们不需要“先卸载旧内核再装新内核”,而是先把 LTS 内核装好,再调整默认引导项。整个切换过程是平滑的,中途不会出现系统里一个内核都没有的情况。

1.2 哪些场景应该换 LTS,哪些场景应该继续用 stable

如果你属于下面这些情况,换 LTS 的收益比较明显:

  • 机器承载长时间编译、下载、计算任务,不方便频繁重启。
  • 使用需要预编译内核模块的第三方工具或驱动,比如虚拟机加速、硬件加速、部分网络控制器驱动。
  • 对系统稳定性要求高于新功能,平时主要工作是办公、开发、写代码、跑服务。
  • 电脑硬件不是刚发售的型号,LTS 内核对硬件支持已经足够。

反过来,如果你刚买新电脑,CPU 或 GPU 太新,或者你在做内核相关开发、需要测试新文件系统特性,那 LTS 帮不上忙,甚至会让新硬件无法发挥完整性能。LTS 分支对最新硬件的支持往往滞后,因为新硬件通常需要新驱动和新的内核代码路径。切换之前要想清楚:LTS 不是“更好”,而是“更稳”。我选择 LTS,是因为我宁可放弃最新内核带来的那一点点性能提升,也要保证机器在我睡觉时不会因为内核升级莫名其妙重启。

1.3 共存的机制与整体切换思路

真正改变默认启动项的不是删除旧内核,而是让引导程序默认选中 linux-lts。Arch 的引导配置是独立于内核包的,引导程序会扫描 /boot 下存在哪些 vmlinuz 和 initramfs,生成对应的菜单项。所以 linux 和 linux-lts 可以长期共存,你随时能在引导菜单里切换回旧内核。这个机制给了我们很好的回滚窗口。

我在实际切换时也完全把旧内核留着,直到新内核跑满两周才清理。你可以把旧内核理解成一个“安全气囊”:平时不碰它,但一旦新内核出问题,你重启后在引导菜单里选旧内核就能回到原来的环境。这也是我觉得 Arch 切换内核最舒服的一点,它不像某些发行版那样必须重新安装系统才能回滚。

2. 动手前必须确认的四件事

2.1 先搞清当前内核和引导方式

切换前不要直接敲安装命令,先花两分钟确认环境。第一件事是看当前内核版本:

uname -r

输出类似6.13.x-arch1-1,这说明你目前用的是 stable 分支。接下来看引导方式。现在绝大多数机器是 UEFI 引导,但也不排除老机器还在用 BIOS。可用下面命令确认:

ls /sys/firmware/efi

如果这个目录存在,说明是 UEFI 模式。如果不存在,大概率是传统 BIOS 模式。这个区别会影响后续生成引导配置的方式,但 Arch 的官方引导方案基本都支持这两种模式。

然后检查 /boot 里的现有文件,确认当前引导程序是哪一种:

ls /boot

常见的引导程序包括 GRUB、systemd-boot 以及直接通过 EFI 启动条目管理。Arch 里最常见的是 GRUB,后面我的步骤会以 GRUB 为主,同时单独说明 systemd-boot 用户怎么处理。如果你自己用的是自定义引导方案,核心思路是一样的:让引导程序能识别新的 linux-lts 镜像,并把默认启动项指向它。

2.2 同步系统、清理缓存与检查磁盘

内核安装会更新 /boot 目录里的文件,还会在 /usr/lib/modules 下释放内核模块。如果 /boot 是独立分区,空间不够会导致 initramfs 写入失败。先用 df 看一眼:

df -h /boot

正常情况下几十 MB 空间就足够装一个新内核,但如果你的 /boot 分区设置得特别小,建议先清理旧的备份镜像。

再一个容易忽略的是系统同步状态。安装 LTS 内核对 pacman 数据库版本有要求,如果系统好久没更新,数据库和软件包版本可能不一致。我建议先完整同步一次:

sudo pacman -Syu

这一句会把系统升级到最新状态,然后再安装 linux-lts。否则可能出现某个依赖版本不满足的问题。做完系统升级后,清缓存也可以顺手执行,但要注意:pacman -Sc会清理掉 /var/cache/pacman/pkg 里不再被需要的旧包。如果你担心回滚问题,可以先不清理,或者只清理一部分。

sudo pacman -Sc

执行时会确认是否删除旧的缓存包。我的建议是:在切换内核的这个节骨眼上,先留下所有包含 linux 字样的缓存包,万一新内核有问题,你还能用pacman -U手动降级回去。

2.3 一定要留好回滚退路

很多人在装新内核时习惯性地先卸载旧内核,觉得“反正我要换 LTS,旧的还用得着吗”。这是一个非常危险的操作。更安全的顺序是:先安装 linux-lts,再验证它能正常启动,最后才决定是否删除旧内核。

在安装完 LTS 后,GRUB 菜单会出现新条目,但默认启动项还是原来的 stable 内核。这时候你重启,不进引导菜单的话,系统依然会启动旧内核。我们要的就是这种“装了但还不强制切换”的中间状态。

另外,如果你用的是 GRUB,平时开机如果有倒计时,你需要在那段时间按下方向键进入引导菜单,选择“Advanced options for Arch Linux”下的 linux-lts 项。这一步拼的是眼疾手快,但不用慌,就算你错过了,系统还是会正常进旧内核。多试几次总能成功。

3. 安装 linux-lts 以及配套头文件

3.1 安装命令与包内容

正式安装就是一条 pacman 命令:

sudo pacman -S linux-lts linux-lts-headers

linux-lts 包提供内核镜像、内核模块和 initramfs,linux-lts-headers 提供内核头文件。有人会问,我平时不编译内核模块,只装第一个包行不行?行,但我不建议。因为 Arch 环境里第三方内核模块非常常见,比如虚拟机加速模块、闭源显卡驱动、部分硬件监控工具。它们会在内核更新后自动调用 DKMS 重新编译,没有对应的 headers 包,编译必定失败。以后再补装 headers 也不是不行,但重新触发一次模块编译比较折腾。

安装过程的关键输出在末端。pacman 执行 linux-lts 的安装钩子时,会自动调用 mkinitcpio 生成 initramfs-linux-lts.img。你要留意屏幕上是不是出现了mkinitcpio相关的成功提示。如果看到类似 “Image generated” 的字样,说明 initramfs 已经生成。如果输出里出现 error,先不要重启,马上看日志。

3.2 确认镜像文件已经生成

安装完成后再核实一遍文件是否存在,不要只看 pacman 返回成功就认为万事大吉:

ls -l /boot/vmlinuz-linux-lts /boot/initramfs-linux-lts.img

正常情况下能看到 vmlinuz 和 initramfs 两个文件,并且文件时间戳就是刚刚安装的时间。还需要确认对应的模块目录也创建好了:

ls /usr/lib/modules

如果系统里有多个内核版本,这个目录下会有多个子目录,其中一个是 linux-lts 对应的版本号。可以用uname -r查到的版本号和这里对比,确保一致。

如果发现 initramfs 没有生成,可以手动执行一次全量重建:

sudo mkinitcpio -P

-P 表示处理所有内核镜像,不指定内核版本也会自动找到当前的 linux-lts。这个命令在后续排查问题时也经常用到,可以记住它。

3.3 自定义 mkinitcpio 配置的人要特别注意

如果你改过 /etc/mkinitcpio.conf,哪怕只改了一个钩子顺序,安装内核后也要重新生成 initramfs。mkinitcpio 会根据配置里的 HOOKS 列表把必要的模块和工具打包进 initramfs,配置和实际启动环境不一致,就会出现启动时找不到根文件系统、卡在引导阶段的情况。

常见的例子是使用 Btrfs 或 LVM 的人,需要确保 HOOKS 里包含 btrfs 或 lvm2 相关钩子。如果你用了全盘加密,还要确认 encrypt 或 sd-encrypt 钩子在合适的位置。我见过有人新装内核后忘记重新生成 initramfs,结果重启后直接掉进 emergency 模式。其实问题很简单:模块在 /usr/lib/modules 下存在,但 initramfs 里没有打包进去,系统启动时找不到存储驱动。

所以我的习惯是,每次安装或升级内核后手动执行一次:

sudo mkinitcpio -P

第一次装 linux-lts 时,这样能确保万无一失。后续如果再升级 linux-lts 包,pacman 钩子通常也会自动执行,但手动跑一次成本很低,能排除很多诡异问题。

4. 把默认引导项切换到 LTS

4.1 重新生成引导配置

安装完成后,GRUB 并不会自动意识到多了个新内核,需要重新生成配置:

sudo grub-mkconfig -o /boot/grub/grub.cfg

执行后会在屏幕上输出生成的菜单项列表,通常能看到类似Found linux image: /boot/vmlinuz-linux-lts和Found initrd image: /boot/initramfs-linux-lts.img的文字。如果没看到这两行,说明引导程序没有找到 LTS 内核,先停下来查一下 /boot 目录有没有对应文件。

生成完毕可以查看菜单项名称:

grep menuentry /boot/grub/grub.cfg

输出里会有一大串菜单标题,其中有一个带 “linux-lts” 字样的项目。我把完整名字记下来,后面设置默认项时要用。不要只靠编号,因为编号会随着内核数量变化改变,用名字最稳。

4.2 先临时启动一次,确认没问题

GRUB 配置生成好之后,先不要急着改默认项。重启电脑,在 GRUB 菜单出现时,通过方向键进入 “Advanced options for Arch Linux” 子菜单,选中带 linux-lts 的那一项启动。系统进入桌面后,先用 uname 确认当前内核:

uname -r

只要输出里的版本号和 linux-lts 对应,就说明这次启动成功。我建议在这个临时启动的 LTS 环境里用一段时间,把日常操作都过一遍,比如网络、声音、显卡、虚拟机、容器。不要只看能开机就完事,因为有些硬件驱动要等到真正加载时才暴露问题。

如果你连 GRUB 菜单都进不去,还有一个办法:在启动过程中按住 Shift 或 Esc 键强制显示菜单,不同机器键位略有不同。实在不行,可以先保持默认 stable 内核不动,别急着切换默认项,优先把“为什么进不了菜单”的问题解决掉。

4.3 永久设置默认启动项

确认 LTS 内核一切正常后,再把它设为默认启动项。编辑 /etc/default/grub:

sudo nano /etc/default/grub

把 GRUB_DEFAULT 这一行改成目标菜单项的完整名称。比如:

GRUB_DEFAULT="Advanced options for Arch Linux>Arch Linux, with Linux linux-lts"

这里有个容易踩坑的地方:>是 GRUB 里表示子菜单层级分隔符。如果菜单项名字本身包含空格,整个字符串必须用引号包住。改完后保存,再执行:

sudo grub-mkconfig -o /boot/grub/grub.cfg

修改 GRUB_DEFAULT 之后不重新生成配置,设置不会生效。我早期就犯过这个错误,改完文件直接重启,结果还是进了旧内核。

如果你更喜欢使用saved方案,可以保持GRUB_DEFAULT=saved,然后用grub-set-default指定默认项。但很多人的系统里根本没开启 save 功能,反而更混乱。直接写菜单名是最简单、最直观的方式。

4.4 systemd-boot 用户的操作差异

如果你用的是 systemd-boot,而不是 GRUB,切换流程略有不同。先看现有引导条目:

ls /boot/loader/entries/

会看到类似 arch.conf、arch-lts.conf 这样的文件。安装 linux-lts 后,一般会自动生成 arch-lts.conf。然后编辑 /boot/loader/loader.conf,把 default 指向 LTS 条目:

default arch-lts.conf

保存后重启即可。systemd-boot 不依赖 grub-mkconfig,因为它直接读取 ESP 分区的内核镜像文件。如果你没有看到 arch-lts.conf,可以手动创建一个,内容大致指向 /boot/vmlinuz-linux-lts 和对应的 initramfs。

我这里主要提 GRUB 是因为 Arch 默认安装引导流程用 GRUB 的比例更高。无论用什么引导程序,核心原则不变:先让新内核出现在菜单里,再修改默认选中项。

5. 重启验证与旧内核清理

5.1 重启后怎么确认自己真的在用 LTS

设置好默认项后重启,进入系统第一件事就是确认当前内核:

uname -r

如果你看到的版本号是 linux-lts 对应的长期维护版本,说明默认启动项切换成功。还可以用下面命令确认模块路径:

ls /usr/lib/modules/$(uname -r)

这个目录必须存在,如果不存在,说明内核模块没有安装完整,需要重新安装 linux-lts。另外可以用cat /proc/version查看编译信息和版本后缀,也能确认内核分支。

我在切换后还会特意跑一次pacman -Syu。这一步不是必须的,但我习惯在新内核环境下把系统更新到最新,确保后续安装其他软件时不会因为依赖版本不一致出问题。注意,升级过程中如果 linux-lts 有新版本,pacman 会更新它,这属于正常现象。

5.2 什么时候可以删除 stable 内核

我强烈建议不要第一次启动成功后立刻删除旧内核。LTS 内核跑一天、两天可能都很正常,但有些问题要等到特定负载下才出现,比如休眠、挂起、GPU 高负载。我的习惯是等一到两周,确认没有异常后,再执行删除:

sudo pacman -R linux

如果你之前还单独安装过 linux-headers,也一起删:

sudo pacman -R linux linux-headers

执行前 pacman 会列出将删除的软件包和依赖关系。仔细看一遍,确保它不会顺手删掉你正在用的其他软件包。如果提示哪些包依赖 linux,先停下来,不要强制删除。某些第三方软件包把 linux 写进依赖,删除时可能影响它们。

删除 stable 内核后,GRUB 菜单里对应的启动项也会消失。如果你想保留旧内核但不在菜单里显示,那不是删包能解决的,而是引导配置问题。对大多数人来说,直接留着早期缓存里的安装包也行,没必要让系统同时存在三四个内核版本。

5.3 删除后的收尾工作

删除旧内核后可以检查一下系统里是否出现孤儿包:

pacman -Qdt

运行结果会列出不再被任何软件包依赖的包。其中可能有旧内核相关的头文件残留,也可能有你自己手动装的 AUR 包。不要看到列表就全删,先逐个人工确认。如果确定没有用:

sudo pacman -Rns $(pacman -Qdtq)

不过我一般不推荐这条命令全自动执行。比如有些包虽然不被依赖,但你还在主动使用,只是 pacman 不知道而已。更安全的做法是在 /var/cache/pacman/pkg 里保留所有 linux 相关的安装包,宁可多占一点磁盘空间,也别给自己制造没有回滚机会的困境。

6. 切换后我遇到的几个问题与排查过程

6.1 引导菜单里找不到 LTS 项

有一次我在一台测试机上安装完 linux-lts,重新生成 GRUB 配置后发现菜单里只有旧的 stable 内核,没有 linux-lts。当时第一反应是 /boot 没有挂载,因为很多机器的 /boot 是独立分区,如果忘记 mount,grub-mkconfig扫描到的还是根目录下的空目录。

排查命令很简单:

mount | grep /boot

如果没有输出,说明 /boot 没挂载,把 /boot 挂上后重新执行 grub-mkconfig。另一种可能是有多个磁盘或多个 EFI 分区,引导程序扫描的是错误的那个分区,导致新内核文件没被看到。这个解决起来比较麻烦,需要你先确认 linux-lts 文件到底在哪个分区:

find /boot -name "vmlinuz-linux-lts"

如果文件存在,再检查 grub-mkconfig 的扫描路径。还有一种情况是安装过程报错了,vmlinuz-linux-lts 根本没生成,回到第 3 节的检查步骤。

6.2 启动时卡在加载初始内存盘或直接黑屏

切换 LTS 内核后最容易遇到的问题之一,是启动时卡在加载 initramfs,或者出现黑屏。这不一定说明 LTS 内核有问题,更多是 initramfs 生成不规范,或者某些内核模块没有正确装载。

处理办法很简单:重启进入 GRUB,选择旧内核启动,然后重新生成 initramfs:

sudo mkinitcpio -P

如果重新生成后还是卡住,检查 /etc/mkinitcpio.conf 里的 HOOKS 顺序。文件系统驱动相关的钩子必须放在适当位置,比如加密、LVM 这些钩子如果顺序不对,系统可能能在编译时生成镜像,但启动时却找不到真正的根分区。这个跟你是否手动改过配置有关,普通默认配置一般不会出问题。

如果你和我一样装了闭源显卡驱动或第三方内核模块,还要考虑驱动模块是否与 LTS 内核版本兼容。很多时候新内核升级后,第三方模块还没来得及适配,加载时就导致启动黑屏。在 GRUB 启动项上临时加一个nomodeset参数往往能进系统,但根本解决方案是更新驱动程序,或者干脆先用旧内核跑。

6.3 第三方模块编译失败,提示内核头文件版本不对

安装 LTS 内核后,一些第三方模块会通过 DKMS 自动重新编译。常见报错是找不到/usr/lib/modules/$(uname -r)/build,或者版本号不匹配。原因通常只有一个:没有安装 linux-lts-headers。

安装好 headers 后执行:

sudo dkms autoinstall

它会扫描当前运行的 LTS 内核,把所有注册过的 DKMS 模块重新编译一遍。如果你只用某一个模块,也可以指定模块名和内核版本。确认编译成功的办法是:

dkms status

看到模块名称后显示installed状态,基本就正常了。如果编译报错,日志里会写明具体原因,常见的就是内核 API 变化导致源码不兼容。这种情况你得去模块项目的发布页面找新版,或者在旧内核上继续运行,直到对应模块完成适配。

6.4 升级后 LTS 内核与 stable 内核同时存在会不会冲突

不会冲突。linux 和 linux-lts 两个包虽然都提供内核文件,但文件名与路径互相独立,GRUB 菜单也能把它们区分为不同块。真正要留意的是,如果你之前通过 AUR 安装过第三方内核,比如某些带有优化补丁的自定义内核,需要确认这些包和新装包之间没有 Meta 包依赖冲突。

还有一点:更新系统时,linux 和 linux-lts 会同时出现在升级列表里。如果你已经决定只保留 LTS,可以像第 5 节那样彻底删除 stable 内核包,这样后续 pacman 更新时就不会再出现 linux 包了。但如果你还没确定是否长期使用 LTS,两个包都留着也无所谓,磁盘空间占用并不大。

最后一个小建议:在你完全信任 LTS 内核之前,不要把系统里所有内核相关配置一次性改完。我当初就是太自信,第一天就删了 stable 内核,结果第二天发现某个自编译模块在 LTS 下编译不过去,只能从缓存里把 stable 内核装回来。后来我改成“先临时启动验证,再改默认项,最后删旧内核”的顺序,整个过程再也没有出现过无法回滚的情况。内核切换这件事,慢就是快,稳才是重点。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询