Ubuntu 系统系列 | 第 14 天:系统更新与升级管理——apt update、do-release-upgrade、安全补丁

第 14/30 天

引言

“你的系统有多久没更新了?”——这是每个运维工程师最怕被问到的问题。系统更新是 Linux 管理的基石,也是最容易被忽视的安全防线。据统计,超过 60% 的已知漏洞利用发生在补丁发布 30 天以内,而大部分被攻陷的服务器在漏洞曝光时仍未安装补丁。

今天,我们将深入 Ubuntu 的更新与升级管理体系,从最基础的 apt update/upgrade 到跨版本发行版升级 do-release-upgrade,再到自动化安全补丁策略,帮你构建一套既安全又可靠的更新工作流。

核心概念

APT 包管理系统

Ubuntu 基于 Debian,使用 APT(Advanced Package Tool)作为包管理前端。理解以下三个核心命令的差异至关重要:

命令 作用 是否升级软件 是否安装新依赖 是否删除旧包
apt update 刷新软件包索引
apt upgrade 升级已安装包
apt full-upgrade 智能升级,处理依赖变更
apt dist-upgrade 同 full-upgrade(别名)

版本号解读

Ubuntu 的版本号格式为 YY.MM(年份.月份),例如 22.04 代表 2022 年 4 月发布。LTS(Long Term Support)版本享有 5 年(社区版)至 10 年(Ubuntu Pro)的支持周期,是生产环境的首选。

更新 vs 升级

  • 更新(Update):在同一版本内安装安全补丁和 bug 修复,风险低,应频繁执行。
  • 升级(Upgrade):从一个 Ubuntu 版本升级到下一个(如 22.04 → 24.04),涉及大量系统组件变更,风险较高,需谨慎规划。

实战步骤

一、基础更新:保持系统安全

日常维护中最基础也最重要的操作:

# 1. 刷新软件包索引
sudo apt update

# 输出示例:
# Hit:1 http://archive.ubuntu.com/ubuntu jammy InRelease
# Get:2 http://security.ubuntu.com/ubuntu jammy-security InRelease [110 kB]
# Get:3 http://archive.ubuntu.com/ubuntu jammy-updates InRelease [119 kB]
# Reading package lists... Done
# Building dependency tree... Done
# 1 package can be upgraded. Run 'apt list --upgradable' to see it.

# 2. 查看可升级的包
apt list --upgradable

# 输出示例:
# Listing... Done
# openssl/jammy-updates 3.0.2-0ubuntu1.18 amd64 [upgradable from: 3.0.2-0ubuntu1.15]
# libssl3/jammy-updates 3.0.2-0ubuntu1.18 amd64 [upgradable from: 3.0.2-0ubuntu1.15]
# N: There are 2 additional versions. Please use the '-a' flag to see them.

# 3. 执行升级(仅升级已有包,不安装新包/不删除包)
sudo apt upgrade -y

# 输出示例:
# Reading package lists... Done
# Building dependency tree... Done
# Reading state information... Done
# Calculating upgrade... Done
# The following packages will be upgraded:
#   openssl libssl3
# 2 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
# Need to get 1,512 kB of archives.
# After this operation, 1,024 B of additional disk space will be used.
# Get:1 http://archive.ubuntu.com/ubuntu jammy-updates/main amd64 openssl amd64 3.0.2-0ubuntu1.18 [1,158 kB]
# Get:2 http://archive.ubuntu.com/ubuntu jammy-updates/main amd64 libssl3 amd64 3.0.2-0ubuntu1.18 [354 kB]
# Fetched 1,512 kB in 2s (756 kB/s)
# (Reading database ... 123456 files and directories currently installed.)
# Preparing to unpack .../openssl_3.0.2-0ubuntu1.18_amd64.deb ...
# Unpacking openssl (3.0.2-0ubuntu1.18) over (3.0.2-0ubuntu1.15) ...
# Setting up openssl (3.0.2-0ubuntu1.18) ...

二、安全补丁自动化:无人值守升级

手动更新并不可靠——人总会忘记。Ubuntu 提供了 unattended-upgrades 包实现自动化安全更新。

# 1. 安装无人值守升级工具
sudo apt install unattended-upgrades apt-listchanges -y

# 2. 查看配置
sudo cat /etc/apt/apt.conf.d/50unattended-upgrades

# 关键配置段(精简版):
# Unattended-Upgrade::Allowed-Origins {
#     "${distro_id}:${distro_codename}";          # 常规更新
#     "${distro_id}:${distro_codename}-security"; # 安全更新(推荐启用)
#     // "${distro_id}ESM:${distro_codename}";    # Ubuntu Pro ESM(启用需订阅)
# };
#
# Unattended-Upgrade::AutoFixInterruptedDpkg "true";
# Unattended-Upgrade::MinimalSteps "true";
# Unattended-Upgrade::Remove-Unused-Kernel-Packages "true";
# Unattended-Upgrade::Remove-Unused-Dependencies "true";
# Unattended-Upgrade::Automatic-Reboot "false";   # 生产环境建议 false
# Unattended-Upgrade::Automatic-Reboot-Time "02:00";

# 3. 启用自动更新
sudo dpkg-reconfigure --priority=low unattended-upgrades

# 4. 启用自动下载和安装(编辑 /etc/apt/apt.conf.d/20auto-upgrades)
# 内容应包含:
# APT::Periodic::Update-Package-Lists "1";      # 每天自动 apt update
# APT::Periodic::Download-Upgradeable-Packages "1";  # 下载更新
# APT::Periodic::AutocleanInterval "7";          # 每周清理缓存
# APT::Periodic::Unattended-Upgrade "1";          # 自动安装安全更新

# 5. 查看日志确认运行正常
sudo cat /var/log/unattended-upgrades/unattended-upgrades.log | tail -20

# 输出示例:
# 2026-07-21 03:15:01,123 INFO Initial blacklist:
# 2026-07-21 03:15:01,123 INFO Initial whitelist:
# 2026-07-21 03:15:01,456 INFO Packages that are upgraded:
# 2026-07-21 03:15:01,456 INFO   libssl3 (3.0.2-0ubuntu1.15 => 3.0.2-0ubuntu1.18)
# 2026-07-21 03:15:01,456 INFO   openssl (3.0.2-0ubuntu1.15 => 3.0.2-0ubuntu1.18)
# 2026-07-21 03:15:02,789 INFO All upgrades installed

三、跨版本发行版升级:do-release-upgrade

当需要从 Ubuntu 22.04 LTS 升级到 24.04 LTS 时,使用 do-release-upgrade 工具。

# 1. 确保当前系统是最新状态
sudo apt update && sudo apt upgrade -y && sudo apt autoremove -y

# 2. 安装升级工具(如果未安装)
sudo apt install update-manager-core -y

# 3. 查看当前版本
lsb_release -a

# 输出示例:
# No LSB modules are available.
# Distributor ID: Ubuntu
# Description:    Ubuntu 22.04.5 LTS
# Description:    Ubuntu 22.04.5 LTS
# Release:        22.04
# Codename:       jammy

# 4. 检查是否有新版本可用
sudo do-release-upgrade --check-dist-upgrade-only

# 输出示例:
# Checking for a new Ubuntu release
# New release '24.04.1 LTS' available.
# Run 'do-release-upgrade' to upgrade to it.

# 5. 执行升级(生产环境建议先在测试环境演练)
# sudo do-release-upgrade
# ⚠️ 注意:此命令会:
#   - 下载数百 MB 到数 GB 的包
#   - 替换系统关键组件(内核、glibc、systemd)
#   - 自动重启服务
#   - 建议在 tmux/screen 中运行,防止 SSH 断开中断

四、系统更新后的维护工作

更新完成后,有一些重要的收尾操作不可跳过:

# 1. 清理旧内核(保留当前运行的 + 1 个备用)
sudo apt autoremove --purge -y

# 输出示例:
# The following packages will be REMOVED:
#   linux-image-5.15.0-86-generic linux-headers-5.15.0-86-generic
#   linux-modules-5.15.0-86-generic
# After this operation, 412 MB disk space will be freed.
# Do you want to continue? [Y/n] Y

# 2. 清理 apt 缓存
sudo apt autoclean   # 只删除过期的 deb 包
# 或
sudo apt clean       # 删除所有缓存的 deb 包

# 3. 检查是否有残留的配置文件
sudo dpkg --configure -a

# 4. 重启需要重启的服务(自动检测)
sudo needrestart

# 输出示例:
# Scanning processes...                                                      
# Scanning linux images...                                                    
# 
# Running kernel seems to be up-to-date.                                      
# 
# Services to restart:
#  systemctl restart ssh.service
#  systemctl restart cron.service
#  systemctl restart systemd-journald.service
# 
# No containers need to be restarted.
# No user sessions are running outdated binaries.

# 5. 查看系统可用的安全更新源
sudo apt-cache policy

五、Ubuntu Pro 与 ESM(扩展安全维护)

对于无法立即升级的旧版系统,Canonical 提供 ESM(Extended Security Maintenance)服务:

# 1. 查看是否已启用 Ubuntu Pro
sudo pro status

# 输出示例:
# SERVICE       ENTITLED  STATUS    DESCRIPTION
# esm-infra     yes       enabled   Expanded Security Maintenance for Infrastructure
# esm-apps      yes       enabled   Expanded Security Maintenance for Applications
# livepatch     yes       enabled   Canonical Livepatch service
# 
# This machine is attached to an Ubuntu Pro subscription.

# 2. 免费订阅(个人用户最多 5 台机器)
sudo pro attach <你的免费Token>

# 3. 启用 Livepatch(内核热补丁,无需重启)
sudo pro enable livepatch

# 4. 查看 ESM 提供的额外安全更新
apt list --upgradable 2>/dev/null | grep -E "(~esm|~security)"

常见问题

Q1:更新后系统无法启动怎么办?

A: 启动时按住 Shift 进入 GRUB 菜单,选择”Advanced options for Ubuntu”,然后选择旧内核版本启动。进入系统后,使用 sudo apt remove linux-image-新版本号 卸载有问题的内核,或者使用 sudo apt install linux-image-旧版本号 重新安装稳定版。

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

A: apt upgrade 是保守升级——不会安装新包或删除已有包,即使依赖关系需要。apt dist-upgrade(或 full-upgrade)会智能处理依赖变更,必要时安装新包或删除冲突包。日常维护用 upgrade,跨版本升级或大版本依赖变更时用 dist-upgrade

Q3:do-release-upgrade 升级到一半中断了怎么办?

A: 首先不要重启!检查终端是否还在运行。如果连接断开,重新 SSH 并执行 screen -rtmux attach 恢复会话。如果升级工具已退出,运行 sudo dpkg --configure -a 修复中断的包,然后重新执行 sudo do-release-upgrade。升级工具会从断点继续。

Q4:如何查看系统上次更新的时间?

A: 使用以下命令:

# 查看 apt 历史日志
grep -E "^(Start-Date|Commandline)" /var/log/apt/history.log | tail -10

# 输出示例:
# Start-Date: 2026-07-21  03:15:01
# Commandline: /usr/bin/unattended-upgrade
# Start-Date: 2026-07-20  14:30:22
# Commandline: apt upgrade -y

Q5:升级后软件版本太高,和现有应用不兼容怎么办?

A: 使用 apt-cache policy 包名 查看可用版本,然后通过 sudo apt install 包名=版本号 降级到指定版本。更推荐的做法是使用 apt-mark hold 包名 锁定特定包的版本,防止被意外升级。生产环境建议在升级前使用测试环境验证兼容性。

总结

今天我们从日常更新、安全补丁自动化、跨版本升级到 ESM 安全扩展,全面覆盖了 Ubuntu 系统更新管理的方方面面。以下是核心要点:

  1. 每日必做sudo apt update && sudo apt upgrade -y,至少每周执行一次
  2. 安全自动化:配置 unattended-upgrades 自动安装安全补丁,减少人为疏忽
  3. 升级前准备:备份数据、记录当前配置、在测试环境验证
  4. 升级后检查:运行 needrestart 重启需要重启的服务,清理旧内核释放空间
  5. 长期维护:Ubuntu Pro + ESM 为旧系统提供持续安全支持,livepatch 实现零重启更新

记住:更新不是一次性的任务,而是持续的安全策略。 一个从不更新的系统,等于向攻击者敞开了大门。

Ubuntu 系统系列目录

天数 主题 状态
第 1 天 Ubuntu 系统概述与安装指南 ✅ 已发布
第 2 天 桌面环境与基本操作 ✅ 已发布
第 3 天 文件系统与目录结构 ✅ 已发布
第 4 天 用户与权限管理 ✅ 已发布
第 5 天 软件包管理(apt、snap、deb) ✅ 已发布
第 6 天 进程管理与系统监视 ✅ 已发布
第 7 天 文本处理与文件操作命令 ✅ 已发布
第 8 天 磁盘管理与分区 ✅ 已发布
第 9 天 网络配置与故障排查 ✅ 已发布
第 10 天 Shell 脚本编程基础 ✅ 已发布
第 11 天 防火墙与网络安全(UFW、iptables) ✅ 已发布
第 12 天 SSH 服务配置与远程管理 ✅ 已发布
第 13 天 备份与恢复策略——rsync、tar、duplicity、borg ✅ 已发布
第 14 天 系统更新与升级管理——apt update、do-release-upgrade、安全补丁 📝 今日发布
第 15 天 系统监控与性能分析 🔜 明日预告
第 16 天 Web 服务器(Nginx/Apache)部署 ⏳ 待发布
第 17 天 数据库安装与管理(MySQL/PostgreSQL) ⏳ 待发布
第 18 天 Docker 容器化入门 ⏳ 待发布
第 19 天 DevOps 工具链(Git、Ansible) ⏳ 待发布
第 20 天 日志管理与 ELK Stack ⏳ 待发布
第 21 天 高可用与负载均衡 ⏳ 待发布
第 22 天 容器编排(Docker Compose) ⏳ 待发布
第 23 天 CI/CD 流水线搭建 ⏳ 待发布
第 24 天 Kubernetes 基础 ⏳ 待发布
第 25 天 监控告警(Prometheus + Grafana) ⏳ 待发布
第 26 天 自动化运维(Ansible Playbook) ⏳ 待发布
第 27 天 安全加固与审计 ⏳ 待发布
第 28 天 虚拟化技术(KVM、QEMU) ⏳ 待发布
第 29 天 性能调优与内核参数 ⏳ 待发布
第 30 天 故障排查实战 ⏳ 待发布
© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片快捷回复

    暂无评论内容