apt避坑:命令相似,结果差很大
apt避坑最难的地方,不是记不住命令,而是几个相似选项背后的处理逻辑完全不同。upgrade和full-upgrade、remove和purge、hold和版本锁定,看起来只差一个词,实际会影响依赖删除、配置保留以及下一次系统升级。
update、upgrade与full-upgrade对比
update只下载仓库索引,不安装新版;upgrade更新已安装软件,apt版本的upgrade可以引入满足升级所需的新依赖,但不会主动删除已安装包;full-upgrade则允许为解决依赖而移除包。服务器维护时,前两者更适合常规检查,full-upgrade要先用apt -s full-upgrade预演。真正的坑不是命令危险,而是你没读删除列表。
remove、purge与autoremove对比
remove卸载程序,通常保留由软件包管理的系统配置,方便以后重装;purge连这部分配置一起清除,但不会保证删除用户家目录内自行生成的文件。autoremove处理不再被其他包依赖的自动安装项,它和「清空垃圾」不是一回事。若某个库被你自己的脚本直接调用,APT并不知道,执行前应逐个检查待删包。
hold、指定版本与Pin对比
apt-mark hold 包名适合临时冻结已安装包,操作简单,但时间久了容易忘。apt install 包名=版本号是一次性安装指定版本,该版本必须仍能从当前仓库取得。APT Pinning通过/etc/apt/preferences或preferences.d设置优先级,能长期控制多个仓库间的候选版本,威力最大也最容易写错。普通用户优先hold,混合仓库才考虑Pin。
旧式apt-key与独立密钥对比
apt-key把密钥放进全局信任范围,已经被弃用。更稳的方式是把仓库密钥保存为独立keyring文件,并在对应的deb条目或deb822格式.sources文件里使用Signed-By限定。这样某个第三方仓库的密钥不会无条件替其他仓库签名。添加源前还要核对发行版代号和架构,签名有效只说明来源持有密钥,不等于软件本身适合你的系统。
常见问题
- apt full-upgrade会删除系统吗?
- 它不会以删除系统为目标,但允许移除冲突包。若软件源混乱,确实可能提出删除桌面、驱动等关键组件,因此必须先模拟并检查列表。
- apt-mark hold后怎么恢复更新?
- 先用apt-mark showhold查看冻结项,再执行sudo apt-mark unhold 包名,随后运行apt update和apt upgrade检查候选版本。
- 第三方apt源为什么要使用Signed-By?
- 它把某把密钥的信任范围限制到指定仓库,比加入全局可信密钥库更小权限,也方便单独撤销和排查。