如何把甲骨文免费VPS的默认内核换成其他版本

文章导读
手上有一台甲骨文免费VPS,装的是Oracle Linux,默认内核用起来没问题,但想换成主线内核来试试新特性或修某个驱动问题——这需要提前做好几项检查。云主机换内核不像本地机器,引导和网络配置都可能受平台限制,所以下面按操作顺序理了一遍。
📋 目录
  1. 换内核前先确认引导方式和安全启动
  2. 用包管理器安装目标内核,不要直接编译
  3. 清理旧内核前先看 /boot 空间,网卡命名变化也要提前想到
  4. 重启后先验证内核版本、模块和日志
  5. 回滚边界:保留旧内核,善用控制台
A A

手上有一台甲骨文免费VPS,装的是Oracle Linux,默认内核用起来没问题,但想换成主线内核来试试新特性或修某个驱动问题——这需要提前做好几项检查。云主机换内核不像本地机器,引导和网络配置都可能受平台限制,所以下面按操作顺序理了一遍。

换内核前先确认引导方式和安全启动

甲骨文免费VPS默认使用Oracle Linux或Ubuntu自带的发行版内核,不少用户需要换成其他版本的原因集中在兼容性、网络性能或特定驱动支持上。在动手之前,建议先确认当前引导方式和内核版本,执行uname -r查看运行中内核,执行grub2-editenv list检查默认引导项。只有确认了grub配置路径和/boot分区挂载情况,才能避免后续替换后无法启动。若机器使用了云平台自定义引导卷,还要留意是否启用了安全启动,因为开启Secure Boot会限制非签名内核的加载,这是换内核前必须排查的第一个硬性条件。

这里要特别区分Oracle Linux和Ubuntu的引导配置目录:Oracle Linux常见路径是/boot/grub2/,Ubuntu常见路径是/boot/grub/。执行ls /boot/grub*可以快速确认。如果/boot目录是独立分区,还要记下分区的剩余空间,因为后面安装多个内核镜像时,空间不足会直接导致引导配置写入失败。安全启动可以先在BIOS设置或云控制台里确认能不能关闭,如果平台锁死了开启状态,那只能选择带签名或平台兼容的内核,否则换完连系统都进不去。

用包管理器安装目标内核,不要直接编译

确定目标版本后,最省事的方式是使用发行版自带的包管理器。手动编译需要处理模块签名和依赖关系,而且云厂商往往没有为自定义内核预编译virtio等驱动,编译时漏一个模块,重启后网络就断。

获取目标内核源码或二进制包后,优先用包管理器安装,而不是直接编译。以Ubuntu为例,可以先用apt-cache search linux-image-5.15列出候选版本,再通过apt install linux-image-5.15.0-xxx-generic安装,并保留原有内核不删除。安装完成后,执行update-grub生成新配置,然后修改/etc/default/grub中的GRUB_DEFAULT,可以设为saved并配合grub2-editenv set saved_entry指定新内核,也可以在GRUB_DEFAULT中直接使用菜单项名称。修改后务必执行grub2-mkconfig -o /boot/grub2/grub.cfg或update-grub,否则重启不会生效。

在这个环节里,最容易出错的是GRUB_DEFAULT的设置。使用菜单项名称时,必须先通过grep menuentry /boot/grub*/grub.cfg查看实际条目,名称里通常包含版本号,顺序错一个字符就会导致重启后仍然进入旧内核。使用saved方式时,要确保/etc/default/grub中写的是GRUB_DEFAULT=saved,并且执行过grub2-editenv set saved_entry=...或grub-set-default '新菜单名',两种方式都要在修改后重新生成grub.cfg。建议先不删除旧内核引导项,让grub保留自动探测到的所有条目,这样至少多一个保险。

清理旧内核前先看 /boot 空间,网卡命名变化也要提前想到

最容易被忽略的是/boot分区空间不足。默认分区方案通常给/boot分配几百MB,而多个内核镜像加上initramfs很容易占满,导致update-grub时写入失败。操作前用df -h /boot检查剩余空间,若低于200MB需先清理旧内核,但注意不能删当前运行的内核。另一个坑是Oracle Cloud的DHCP配置依赖特定内核模块,换成纯社区内核后,网卡名可能从ens3变为eth0,而/etc/netplan或/etc/sysconfig/network-scripts中的配置对应不上就会断网。遇到这种情况,可以在启动参数中加net.ifnames=0来固定传统命名,或提前修改网络配置中的匹配规则。

如何把甲骨文免费VPS的默认内核换成其他版本

清理旧内核时,直接到/boot目录下rm文件会绕过包管理器的数据库,后续安装或卸载都会报错。应该用apt purge linux-image-旧版本或yum remove kernel-旧版本。判断哪些旧内核可以删,用dpkg --list | grep linux-image或rpm -qa | grep kernel,再对照当前运行内核uname -r来排除。网络配置建议在重启前就改好,例如在/etc/default/grub的GRUB_CMDLINE_LINUX中加入net.ifnames=0,然后重新生成grub配置;如果用netplan,需要先记录网卡MAC,然后写match配置,否则重启后SSH会掉。

重启后先验证内核版本、模块和日志

重启完成后,第一件事不是开服务,而是检查uname -r是否变成目标版本。如果仍然显示旧内核,说明GRUB_DEFAULT没有生效,或者grub.cfg没有重新生成。进入grub菜单手动选择新条目是临时解决办法,要彻底改好还是需要回到系统里重做配置。

确认内核版本后,再用journalctl -k -b 0查看启动日志,重点看有没有virtio相关错误。lsmod检查virtio_net是否存在,因为甲骨文云实例的网卡依赖这个模块。如果加载了但网络不通,可能是网络接口名变了或者DHCP客户端没起来,这时候用ip a查看接口名,再对照网络配置是否匹配。如果dmesg里有关于模块缺失的错误,就要考虑换回原来的内核,或者编译对应模块。

回滚边界:保留旧内核,善用控制台

换内核的底线是保证能回滚,所以原有内核的引导项必须保留,grub.cfg里不要手动删掉旧菜单。万一新内核完全起不来,Oracle控制台提供的VNC和串行控制台还能接入系统,选择旧内核启动项即可恢复。但如果因为清理空间把旧内核镜像也删了,回滚就只能重装系统,所以清理动作要克制,至少保留一个可用的旧内核。

另外,如果原本用的是Oracle Linux UEK内核,换到标准主线内核后,部分硬件模块路径不同,可能需要安装DKMS包。这种情况建议先在测试机上试一遍,确认网络和块设备驱动都正常,再决定是否对主用实例操作。如果只是想要一个更新的版本,优先看官方仓库是否已经提供,这样可以最大程度减少兼容性问题。