保持系统和软件包处于最新版本是服务器安全运维的基本功。及时更新能修复已知安全漏洞、提升稳定性,也是防止被入侵的第一道屏障。本文讲清 Debian/Ubuntu 系统下的更新流程,涵盖内核更新与重启判断,以及升级后的清理操作。

本文要点

  • apt update 刷新软件包索引
  • apt upgrade 与 dist-upgrade 的区别
  • 内核更新后如何判断是否需要重启
  • 升级后清理无用包释放磁盘空间

update vs upgrade:先刷新再升级

命令作用是否下载/安装软件
apt update从软件源刷新软件包列表否,只更新索引
apt upgrade升级已安装软件包(不移除依赖)
apt dist-upgrade / full-upgrade升级并自动处理依赖变化(包括移除旧依赖)

标准更新流程

# 刷新软件包索引
apt update

# 查看有哪些可升级的包
apt list --upgradable

# 升级所有可升级的包
apt upgrade -y

# 处理复杂依赖(如内核版本升级)
apt dist-upgrade -y

CentOS/AlmaLinux 用户

CentOS 系发行版使用 dnf:dnf update -y 一条命令即可完成刷新并升级所有包,效果等同于 apt update + apt upgrade。

内核更新与重启判断

升级过程中若更新了内核,需要重启才能切换到新内核。如何判断是否需要重启:

# 方法一:查看是否存在 reboot-required 标记
ls /var/run/reboot-required 2>/dev/null && echo '需要重启' || echo '无需重启'

# 方法二:比较运行内核与已安装内核
uname -r                          # 当前运行的内核版本
dpkg -l linux-image-* | grep ^ii  # 已安装的内核

重启前检查业务状态

内核更新后若需重启,请在业务低峰期执行,并提前通知相关用户。重启前用 screentmux 保存未完成的工作,重启后验证服务是否正常启动。

非交互式更新(适合自动化)

在脚本中运行更新时,设置环境变量避免交互式提示:

DEBIAN_FRONTEND=noninteractive apt update -y
DEBIAN_FRONTEND=noninteractive apt upgrade -y
DEBIAN_FRONTEND=noninteractive apt dist-upgrade -y

配置自动安全更新

对于不想手动操作的用户,可以启用 unattended-upgrades 自动安装安全更新:

apt install -y unattended-upgrades
dpkg-reconfigure -plow unattended-upgrades

升级后清理

升级后系统会残留旧版本包和缓存,定期清理释放磁盘空间:

# 移除不再需要的依赖包
apt autoremove -y

# 清理下载缓存
apt clean

# 删除旧内核(autoremove 通常会处理)
dpkg -l 'linux-image-*' | grep '^rc' | awk '{print $2}' | xargs dpkg -P

养成定期更新习惯

建议每月至少执行一次完整更新流程。安全漏洞的利用代码往往在公开后数天内就出现,定期更新是最有效的预防手段之一。

小结

  • 先 apt update(刷新索引),再 apt upgrade(升级包)
  • 内核更新后检查 /var/run/reboot-required 决定是否重启
  • 升级后 apt autoremove && apt clean 清理废包和缓存
  • 可用 unattended-upgrades 自动处理安全更新

常见问题

apt upgrade 和 apt dist-upgrade 有什么区别?

upgrade 不会移除任何包;dist-upgrade 会自动处理依赖变化,包括移除不再需要的旧依赖,升级内核时通常需要用 dist-upgrade。

升级过程中出现交互式提示怎么办?

常见的是配置文件冲突提示,通常选择保留当前配置(N)即可;也可在命令前加 DEBIAN_FRONTEND=noninteractive 避免交互。

多久更新一次比较合适?

至少每月一次,遇到重大安全漏洞公告时应立即更新。可配置 unattended-upgrades 自动处理日常安全更新。