内核更新要不要重启: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
有点流量的站:
- 先做一次快照(商家面板里点一下,几分钟)
- 选低峰期(凌晨 3-5 点)重启
- 重启后检查服务都起来了:
systemctl --failed - 盯 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 里选旧内核进系统:
- VNC/控制台进 GRUB 菜单(云商家面板里一般有)
- Advanced options → 选上一个内核版本
- 进系统后把有问题的内核包删掉/锁定版本
# 锁定内核版本,不再升级
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% 是配置文件和新版本不兼容,回滚配置或看更新说明。
补丁日的流程
小够的"补丁日"流程,每月一次,半小时搞定:
- 快照:商家面板点一下,3 分钟
- 更新:
apt update && apt upgrade,看升级了什么 - 判断:
/var/run/reboot-required在不在,needrestart跑一遍 - 重启(如果需要):低峰期,
reboot - 检查:
systemctl --failed,网站打开看看 - 记录:备忘录记一笔"X月X日打补丁,无异常"
形成习惯后,补丁不再是负担。最怕的是"想起来才打",一拖三个月,漏洞攒一堆。
自动化的度
| 自动化程度 | 适合 |
|---|---|
| 全自动装+全自动重启 | 个人测试机 |
| 自动装,手动重启 | 个人博客 |
| 手动装,手动重启 | 业务机器 |
越重要的机器,人的参与越多。自动化是省力气,不是省责任。
内核版本锁定
业务机器上,内核版本别追新:
# 锁定当前内核,不再升级
sudo apt-mark hold linux-image-generic linux-headers-generic
# 想升级时再解开
sudo apt-mark unhold linux-image-generic
新内核偶尔有回归 bug,业务机器上"稳定压倒一切"。测试机上先跑两周,没问题再给业务机升级。
小够的提醒
- 重大漏洞(内核提权这种)别等补丁日,出来就打
- 重启前通知用户(如果有的话),哪怕只断 2 分钟
- 云商家的"计划维护重启"通知要看,宿主机维护你的 VPS 也会重启,提前做好准备