内核更新要不要重启:VPS 打补丁的重启策略

apt upgrade 升了内核,到底要不要重启?小够讲 needrestart 判断、重启时机选择、kexec 快速重启,以及生产环境打补丁不翻车的流程。

我是小够。apt upgrade 跑完,经常看到提示 *** System restart required ***。重启吧,网站要断几分钟;不重启吧,心里不踏实——到底要不要重启?这篇把内核更新的重启策略讲清楚。

为什么内核更新要重启

Linux 内核是正在运行的那个,不重启,新内核只躺在磁盘上,实际跑的还是旧内核。安全补丁如果在内核里,不重启等于没打。这就是提示让你重启的原因。

但注意:不是所有更新都要重启。只有内核、glibc、systemd 这些核心组件才需要,普通的 nginx、php 升级 reload 一下就行。

怎么判断要不要重启

# 看有没有这个文件,有就表示需要重启
ls /var/run/reboot-required
cat /var/run/reboot-required.pkgs   # 看是哪些包要求的

更精细的工具是 needrestart,它能告诉你哪些服务需要重启(不一定是整机):

sudo apt install needrestart
sudo needrestart

很多时候只是某个服务要重启,systemctl restart xxx 就行,不用整机重启。

重启策略:分场景

个人博客/测试机:直接重启,半夜业务低峰期,一条命令的事。

sudo reboot

有点流量的站:

  1. 先做一次快照(商家面板里点一下,几分钟)
  2. 选低峰期(凌晨 3-5 点)重启
  3. 重启后检查服务都起来了:systemctl --failed
  4. 盯 10 分钟,没问题再去睡

不能断的业务:两台机器轮流重启(先备机后主机),或者用前面讲的主备容灾架构。单台 VPS 就别追求零停机了,不现实。

kexec:快速重启

正常重启要过 BIOS/UEFI,慢。kexec 跳过硬件自检,直接加载新内核,重启快很多:

sudo apt install kexec-tools
# 开启后,reboot 会自动走 kexec

适合经常要重启的机器。注意:kexec 跳过了固件初始化,极少数硬件会有怪问题,先在测试机上试。

实时补丁:不重启打内核补丁

Canonical(Ubuntu)和一些厂商提供实时补丁服务,内核安全更新不用重启就能生效。适合"一年都不能停"的场景,但通常是付费服务。个人用户知道有这东西就行,绝大多数情况用不上。

小够的建议

  • 安全更新别拖:内核漏洞的利用代码出现得很快,补丁出来就尽快安排重启
  • 重启前快照,这是铁律,快照几分钟,翻车了能回滚
  • unattended-upgrades 可以自动装安全更新,但别让它自动重启——重启时机要自己定
  • 建个日历提醒,每月固定一天做"补丁日",养成习惯比什么都强

补丁要打,重启要讲究。快照先行、低峰执行、重启后检查,三步走,半夜不翻车。

needrestart 深入

sudo needrestart

它会列出"用了旧库/旧内核的进程",分三类处理:

  • 服务进程:systemctl restart xxx,单个重启
  • 内核:必须整机重启
  • 容器/用户会话:重新登录就行

小技巧:needrestart -r a 自动重启所有需要重启的服务(别在生产环境无脑用,先看列表)。

kexec 配置

sudo apt install kexec-tools
# 安装时会问,选 Yes,启用 kexec

之后 reboot 会自动走 kexec,跳过 BIOS 自检,重启快 30 秒到几分钟。云 VPS 上效果最明显,因为虚拟机的"BIOS"阶段往往很慢。

验证是否生效:journalctl -b | grep kexec。

无人值守的重启策略

unattended-upgrades 可以配成"装完需要重启的更新后,自动在指定时间重启":

// /etc/apt/apt.conf.d/50unattended-upgrades
Unattended-Upgrade::Automatic-Reboot "true";
Unattended-Upgrade::Automatic-Reboot-Time "03:00";

小够的建议:个人机器可以开,业务机器别开。自动重启的时间再"低峰",也不如你亲手按。真要开,配好监控,重启后服务没起来要立刻知道。

回滚:内核起不来了

新内核有小概率起不来(驱动兼容问题),GRUB 里选旧内核进系统:

  1. VNC/控制台进 GRUB 菜单(云商家面板里一般有)
  2. Advanced options → 选上一个内核版本
  3. 进系统后把有问题的内核包删掉/锁定版本
# 锁定内核版本,不再升级
sudo apt-mark hold linux-image-generic

所以重启前做快照,云 VPS 上这是最快的回滚——快照恢复比折腾 GRUB 快得多。

常见问题

Q:uptime 很长很自豪,要不要重启? A:uptime 长说明稳定,但也说明补丁没打。安全更新和 uptime 纪录,选前者。真想要两个,可以上实时补丁服务。

Q:Docker 容器需要重启吗? A:容器和宿主机共用内核,宿主机内核更新了要重启宿主机,容器本身不用动。但容器里的应用如果依赖更新的库,重新创建容器即可。

Q:重启后服务没起来怎么办? A:systemctl --failed 看哪些挂了,journalctl -u xxx 看日志。90% 是配置文件和新版本不兼容,回滚配置或看更新说明。

补丁日的流程

小够的"补丁日"流程,每月一次,半小时搞定:

  1. 快照:商家面板点一下,3 分钟
  2. 更新:apt update && apt upgrade,看升级了什么
  3. 判断:/var/run/reboot-required 在不在,needrestart 跑一遍
  4. 重启(如果需要):低峰期,reboot
  5. 检查:systemctl --failed,网站打开看看
  6. 记录:备忘录记一笔"X月X日打补丁,无异常"

形成习惯后,补丁不再是负担。最怕的是"想起来才打",一拖三个月,漏洞攒一堆。

自动化的度

自动化程度适合
全自动装+全自动重启个人测试机
自动装,手动重启个人博客
手动装,手动重启业务机器

越重要的机器,人的参与越多。自动化是省力气,不是省责任。

内核版本锁定

业务机器上,内核版本别追新:

# 锁定当前内核,不再升级
sudo apt-mark hold linux-image-generic linux-headers-generic
# 想升级时再解开
sudo apt-mark unhold linux-image-generic

新内核偶尔有回归 bug,业务机器上"稳定压倒一切"。测试机上先跑两周,没问题再给业务机升级。

小够的提醒

  • 重大漏洞(内核提权这种)别等补丁日,出来就打
  • 重启前通知用户(如果有的话),哪怕只断 2 分钟
  • 云商家的"计划维护重启"通知要看,宿主机维护你的 VPS 也会重启,提前做好准备