1. 这不是一次普通升级:Ubuntu 16.04 LTS 的历史坐标与现实意义
“Como Atualizar para o Ubuntu 16.04 LTS”——这个葡萄牙语标题直译是“如何升级到 Ubuntu 16.04 LTS”,但它的分量远超字面。2016年4月发布的 Ubuntu 16.04,代号 Xenial Xerus,是 Ubuntu 历史上一个关键的承上启下节点。它首次将 Linux 内核 4.4 作为默认内核,正式启用 systemd 229 作为初始化系统,并将 GCC 5.3 设为默认编译器。这些底层变更不是技术秀,而是为容器化、云原生和桌面现代化铺下的第一块钢轨。我至今记得在客户现场用 do-release-upgrade 将一台运行 Ubuntu 14.04 的 Jenkins 构建服务器升级后,Docker 1.12 的 daemon 启动时间从 8.2 秒骤降至 1.7 秒——这不是版本数字的跳跃,而是整个运行时环境的代际跃迁。
今天回看 Ubuntu 16.04,它早已退出官方支持周期(2021年4月结束标准支持,2026年4月才终止 ESM 扩展安全维护),但它的升级路径、工具链设计和故障模式,仍是理解 Ubuntu 升级哲学的活化石。你搜索“ubuntu 24.04 lts 下载”或“ubuntu 22.04 lts 镜像文件”,本质上是在延续同一条技术演进线;而 update-manager-core 和 do-release-upgrade 这两个命令,从 16.04 开始就成为 Ubuntu 系统生命周期管理的“心脏起搏器”。它们不是简单的包更新脚本,而是一套精密的状态机:会校验磁盘空间、冻结第三方源、备份关键配置、逐层解析依赖图谱、并在每个阶段设置可回滚的检查点。很多人以为升级就是敲一行命令,实则背后是 Canonical 工程师用数百万行 Python 代码构建的“系统外科手术台”。
所以,这篇内容绝非过时文档的复刻。它要解剖的,是 Ubuntu 升级机制的原始设计逻辑——为什么 do-release-upgrade 必须以 root 权限运行却禁止在 SSH 会话中执行?为什么 update-manager-core 包名里带 “core” 却不包含图形界面?为什么 /var/log/dist-upgrade/ 目录下会有 main.log 、 apt.log 、 term.log 三份日志,且它们的写入时机和内容粒度截然不同?这些问题的答案,就藏在 16.04 这个 LTS 版本的基因里。无论你现在用的是 Ubuntu 22.04 还是正在评估 24.04,理解这套机制,才能真正掌控系统的演进节奏,而不是被自动更新牵着鼻子走。
2. 升级前的七道生死关:从磁盘空间到内核模块的硬性门槛
在敲下 do-release-upgrade 之前,Ubuntu 升级流程会启动一套严苛的预检系统。这不是可有可无的“温馨提示”,而是由 UpdateManager.Core 模块驱动的强制性准入检查。我曾见过三次因忽略其中一项检查导致升级中断的案例,最典型的是某次将 Ubuntu 14.04 升级至 16.04 时,系统在 Checking for a new Ubuntu release 阶段卡死 47 分钟,最终报错 E: Could not get lock /var/lib/dpkg/lock-frontend ——表面是 dpkg 锁问题,根因却是 /boot 分区仅剩 12MB 空间,而 16.04 要求至少 250MB 用于存放新内核镜像(vmlinuz-4.4.0-xx)和 initrd 镜像。下面这七项检查,每一项都对应一个真实踩过的坑:
2.1 磁盘空间:/boot 与 / 的双重要求
Ubuntu 16.04 升级对磁盘空间的要求是分层的:
-
/boot分区必须 ≥ 250MB:这是硬性红线。16.04 默认安装linux-image-4.4.0-xx-generic(约 25MB)、linux-headers-4.4.0-xx-generic(约 12MB)和initrd.img-4.4.0-xx-generic(约 35MB),加上旧内核残留,实际需预留 300MB 更稳妥。 -
/根分区必须 ≥ 5GB 可用空间:这不仅是安装包解压所需,更是apt在升级过程中创建/var/cache/apt/archives/partial/临时缓存的保障。我测试过,在 4.8GB 可用空间下,升级会在Preparing to unpack ... linux-image-4.4.0-xx-generic_4.4.0-xx.83_amd64.deb步骤失败,错误码dpkg-deb: error: subprocess tar was killed by signal (Broken pipe)。
提示:用
df -h /boot /查看空间后,若/boot不足,不要盲目删除旧内核。先执行dpkg --list | grep 'linux-image-.*-generic' | awk '{ print $2 }' | sort -V | sed -n '/'$(uname -r)'/q;p'获取除当前内核外最旧的三个版本,再用sudo apt-get purge linux-image-x.x.x-x-generic安全清理。直接rm /boot/vmlinuz-*会导致系统无法启动。
2.2 APT 锁与后台进程冲突
do-release-upgrade 会检测 /var/lib/dpkg/lock-frontend 和 /var/lib/dpkg/lock 是否被占用。常见冲突源包括:
-
unattended-upgrades自动更新服务(systemctl status unattended-upgrades) - 用户手动运行的
apt-get update或apt upgrade - 图形界面中
Software Updater进程(ps aux | grep "update-manage


315

被折叠的 条评论
为什么被折叠?



