如何在VPS上更新Ubuntu
部署好服务器之后,第一件事往往是更新系统。定期更新能修补安全漏洞、修复软件缺陷,并保证软件包与最新依赖库的兼容性。长期不更新的服务器更容易被攻击者盯上,安装新软件时也更容易出问题。
更新 Ubuntu 只需在终端执行几条命令。你也可以开启自动安全更新,即使没有手动登录,系统也能自动打补丁。
注意:用 `apt` 更新软件包,和把系统升级到新的 Ubuntu 大版本(例如从 22.04 升到 24.04)是两件事。版本升级会替换系统级文件,是一个独立的流程,需要单独操作。
执行以下步骤需要通过 SSH 或终端访问服务器。在生产服务器上操作前,建议先创建快照或备份。
完整命令如下:
```bash
sudo apt update
apt list --upgradable
sudo apt upgrade
sudo apt autoremove
cat /var/run/reboot-required
sudo reboot
```
---
1. 连接到 Ubuntu 服务器
在本机终端运行 `ssh` 命令连接服务器:
```bash
ssh username@your_server_ip
```
将 `username` 替换为实际用户名(新服务器通常是 `root`),`your_server_ip` 替换为服务器 IP。
用户可以在 hPanel 的 VPS 面板中找到 IP 地址和登录信息。macOS / Linux 直接使用系统终端,Windows 可以用终端或 PuTTY。
如果是第一次使用远程服务器,建议先完成基本的 VPS 初始化配置再开始更新。`ls`、`cd`、`pwd` 这几条基础命令有助于在服务器中导航。如果想避免每次都输密码,可以配置 SSH 密钥登录。
2. 确认当前 Ubuntu 版本
更新前,先用 `lsb_release -a` 或 `hostnamectl` 确认服务器运行的版本:
```bash
lsb_release -a
```
输出会显示发行商、描述、版本号和代号。`Release` 一行对应版本号(如 `24.04`),`Codename` 是版本名称(如 `noble`)。
也可以用:
```bash
hostnamectl
```
输出中的 `Operating System` 一行会确认 Ubuntu 版本,同时显示内核版本和系统架构。
搞清楚版本很重要,因为部分软件包和更新是针对特定版本的。如果这两条命令都不可用,也可以通过 `/etc/os-release` 查看版本信息。
3. 刷新软件包列表
`sudo apt update` 会从 Ubuntu 仓库拉取最新的软件包信息:
```bash
sudo apt update
```
这条命令不会安装任何东西,只下载最新的包元数据,让系统知道哪些包可以升级、从哪里获取。
输出末尾如果显示类似"8 packages can be upgraded",说明有更新可用;显示"All packages are up to date"则说明当前已是最新。
每次升级前都应该先执行这条命令。没有刷新列表,`apt upgrade` 可能会跳过更新,或者尝试下载已经不存在的旧版本。
4. 查看可升级的软件包
`apt list --upgradable` 列出所有有新版本可用的软件包:
```bash
apt list --upgradable
```
输出包含每个软件包的名称、当前版本,以及将要升级到的目标版本。大多数名字可能不熟悉——它们通常是系统库或后台依赖,这是正常的。
在生产 VPS 上,升级前值得看一眼这份列表,确认数据库、Web 服务器或语言运行时是否在本次更新范围内。
如果某个软件包暂时不想升级,可以先锁定它:
```bash
sudo apt-mark hold package_name
```
建议:在生产服务器上升级前,先创建一个快照或备份。一旦更新出现问题,快照能比现场排查快得多地恢复到正常状态。
5. 升级已安装的软件包
`sudo apt upgrade` 将所有可用更新安装到服务器上:
```bash
sudo apt upgrade
```
APT 会先显示本次变更摘要,输入 `Y` 并回车确认。
这条命令只安装现有软件包的新版本,会补全缺失的依赖,但不会删除已安装的软件。
Nginx、MySQL 等正在运行的服务在软件包更新后可能会自动重启。在生产服务器上,建议安排在低流量时段升级。
如果某个软件包因依赖冲突被跳过(内核或主要库更新时偶尔发生),需要改用:
```bash
sudo apt full-upgrade
```
警告:`full-upgrade` 可能会删除软件包来解决依赖冲突。确认前请仔细检查摘要,确认 APT 不会删除你依赖的关键组件。
6. 清理无用软件包
`sudo apt autoremove` 删除那些作为依赖被安装、但当前已不再需要的软件包:
```bash
sudo apt autoremove
``
升级后,旧版本的依赖(如过期的内核镜像或已被替换的库)通常会残留在系统中,`autoremove` 负责找出并清理它们。
---
7. 按需重启 VPS
检查是否需要重启,查看以下文件是否存在:
```bash
cat /var/run/reboot-required
```
文件存在时会输出 ` System restart required `;如果什么都没有,则无需重启。内核和系统库更新是该文件出现的最常见原因。
需要注意的是,这个文件依赖软件包安装后的钩子脚本来生成。在精简版或定制镜像中,钩子可能不存在,即使文件没有出现,也可能需要重启。刚更新过内核的话,不管有没有这个文件,都建议重启。
查看是哪些软件包触发了重启提示:
```bash
cat /var/run/reboot-required.pkgs
```
确认可以重启后执行:
```bash
sudo reboot
```
SSH 会话会断开,等一两分钟后重新连接即可。
注意:重启前保存好所有工作,并提前告知团队。重启期间所有运行中的服务都会停止,应安排在维护窗口内进行。
8. 确认更新完成
重启后重新运行 `sudo apt update`,并检查是否还有待升级的软件包:
```bash
sudo apt update
apt list --upgradable
```
`apt list --upgradable` 在"Listing..."之后如果没有任何输出,说明所有软件包都已是最新版本。
确认内核版本:
```bash
uname -r
```
版本号应与刚安装的最新内核一致。也可以重新运行 `lsb_release -a` 验证 Ubuntu 版本——软件包更新不会改变大版本号,版本升级(如升到 24.04 或 26.04)需要单独用 `do-release-upgrade` 来完成。
如何开启自动安全更新
安装 `unattended-upgrades` 软件包,可以让系统在两次手动更新之间自动应用安全补丁。
很多 Ubuntu Server 默认已经安装了这个包,先确认一下:
```bash
dpkg -s unattended-upgrades | grep Status
```
输出显示 `install ok installed` 说明已安装;否则手动安装:
```bash
sudo apt install unattended-upgrades
```
然后启用它:
```bash
sudo dpkg-reconfigure unattended-upgrades
```
提示询问是否自动下载并安装稳定更新,选择"是"即可。
这会生成配置文件 `/etc/apt/apt.conf.d/20auto-upgrades`,指示 APT 每天检查并自动应用来自 Ubuntu `-security` 仓库的安全更新。
如需调整更新范围、屏蔽特定软件包或配置自动重启规则,编辑 `/etc/apt/apt.conf.d/50unattended-upgrades`。
开启自动更新并不意味着可以完全不管服务器。应定期登录检查:`/var/run/reboot-required` 是否出现、`/var/log/unattended-upgrades/` 中有无失败记录、各项服务是否运行正常。
常见更新错误
更新时遇到的问题大多归结为五类:包文件被锁、更新中断、依赖损坏、仓库丢失,以及软件包配置询问。
APT 进程被锁
报错类似"Could not get lock /var/lib/dpkg/lock-frontend",说明有另一个包管理进程正在运行。先查看是什么占着锁:
```bash
sudo lsof /var/lib/dpkg/lock-frontend
```
等现有进程完成。如果进程已崩溃但锁文件残留,确认没有任何包管理操作在运行后再删除:
```bash
sudo rm /var/lib/dpkg/lock-frontend
sudo dpkg --configure -a
```
更新中断
SSH 掉线或更新被强制中断可能导致软件包处于半安装状态,用以下命令恢复:
```bash
sudo dpkg --configure -a
```
这会补全那些被遗留在异常状态的软件包的配置流程。
依赖关系损坏
软件包缺少依赖时,运行:
```bash
sudo apt --fix-broken install
```
APT 会自动下载缺失的依赖并重新配置,使依赖关系恢复一致。
仓库不可访问
`apt update` 报告无法访问某个仓库时,检查 `/etc/apt/sources.list` 和 `/etc/apt/sources.list.d/` 中的源配置,删除或修正指向已失效仓库的条目。
软件包配置询问
更新过程中有时会询问是保留当前配置文件还是替换为软件包自带的新版本。如果服务器上有自定义的配置,除非明确知道需要新文件,否则选择保留本地版本。
遇到其他问题时,`grep`、`cat`、`ps` 这几条常用 Linux 命令在排查时很有帮助。
---
更新后的安全维护
更新软件包只是 VPS 安全维护的一个环节。完整的维护还包括:加固 SSH 配置、设置防火墙、监控系统状态和定期备份。
SSH 安全:禁用 root 直接登录,修改默认 SSH 端口,切换为密钥认证。这几步结合定期更新,能堵住绝大多数常见攻击路径。
防火墙:Ubuntu 内置 UFW(Uncomplicated Firewall),几条命令就能完成配置,控制哪些流量可以到达服务器。
建议制定一个固定的每周维护计划:更新软件包、检查是否有待重启、审查防火墙规则、测试备份可用性。形成文档记录有助于保持执行的一致性。
