掌控 Linux 软件包更新的“定海神针”——apt-mark
在 Linux 系统维护(尤其是 Debian/Ubuntu 体系)中,我们经常面临一个矛盾:既希望通过 apt upgrade 获取最新的安全补丁,又担心某些核心组件(如 PHP、Nginx 或特定驱动)在升级后因为版本不兼容而导致业务崩溃。这时候, apt-mark就是你的“定海神针”。
1.什么是 apt-mark?
apt-mark 是 APT 工具集中的一个实用程序,它允许用户手动更改软件包的“标记”状态。通过这些标记,你可以告诉系统哪些包需要保持现状,哪些包是手动安装的,从而精细化地管理软件包的生命周期。
2.核心功能:锁定版本 (Hold)
这是 apt-mark 最常用的场景。当一个软件包被打上 hold 标记后,无论仓库里有多少更新, apt upgrade 都会跳过它。
基本操作:
# 锁定单个软件包
sudo apt-mark hold php8.2
# 锁定一系列相关的软件包(支持通配符)
sudo apt-mark hold php8.2*
# 解除锁定
sudo apt-mark unhold php8.2
3.自动与手动标记 (Auto/Manual)
APT 会区分包是“你主动要装的”还是“作为依赖被带进来的”。
- auto:标记为自动安装。如果没有任何手动安装的包依赖它,它会被 apt autoremove 清理掉。
- manual:标记为手动安装。即使没有其他包依赖它,系统也会保留它。
# 将包标记为手动安装,防止被自动清理
sudo apt-mark manual libssl-dev
# 将包标记为自动安装,以便后续清理冗余
sudo apt-mark auto some-unused-library
4.实战案例
可以一次性锁定所有 PHP 8.2 组件:
sudo apt-mark hold php8.2*
在 PVE 虚拟机中,如果你直通了硬件,有时特定的旧内核版本更稳定。你可以锁定当前运行的内核:
sudo apt-mark hold linux-image-$(uname -r)
查看锁定了哪些包?
apt-mark showhold
5.总结
| 指令 | 作用描述 |
hold | 锁定版本,禁止自动更新 |
unhold | 解除锁定,恢复正常更新 |
manual | 设置为“用户主动安装”,防止误删 |
auto | 设置为“系统自动安装”,允许被清理 |
showhold | 列出所有处于锁定状态的软件包 |
如果在升级,不想某个软件升级,一定要记得提前锁定。