openSUSE 使用 Zypper 作为默认的命令行包管理器,与 YaST 图形工具形成互补。在服务器、远程终端或最小化安装环境中,掌握 Zypper 命令是完成系统维护的基本功。本文把常用命令按操作类型分类整理,帮助用户快速查询和记忆,也便于在日常运维中直接复制使用。

一、仓库管理与元数据刷新
Zypper 的所有操作都依赖已配置的软件仓库。所谓仓库,就是存储 RPM 软件包及其元数据的远程或本地目录。openSUSE 安装完成后会自带官方仓库,但用户经常需要添加第三方仓库,例如 Packman、NVIDIA 驱动仓库或企业内部镜像。查看当前仓库列表的命令是 zypper lr,它等价于 zypper repos。输出中会显示仓库别名、名称、是否启用、是否自动刷新以及优先级。优先级数值越小,该仓库的包越优先被选中。当两个仓库提供同一个软件包时,Zypper 会根据优先级决定安装来源。
添加仓库使用 zypper addrepo,基本格式为 zypper addrepo 仓库地址 别名。例如把 openSUSE Tumbleweed 的阿里云镜像添加为 tumbleweed-oss,可以写成下面这样。添加后需要刷新元数据,让本地缓存与远端同步。删除仓库使用 zypper removerepo 别名,如果指定 --loose-auth 或 --loose-query 参数就能按部分名称匹配。仓库的启用与禁用可以通过 zypper modifyrepo --enable 别名 或 zypper modifyrepo --disable 别名 完成,也可以直接编辑 /etc/zypp/repos.d 目录下的 .repo 文件,但命令行方式更安全。
刷新所有仓库元数据使用 zypper refresh,简写 zypper ref。滚动发行版 Tumbleweed 几乎每天都有更新,因此在执行升级前最好先刷新一次,避免因元数据过期而找不到最新包。需要注意的是,刷新操作会占用一定网络带宽和时间,批量管理多台主机时建议错峰执行。如果只想刷新单个仓库,可以在命令后添加仓库别名,例如 zypper refresh packman。下面的命令块演示了从添加仓库到刷新的完整流程。
# 添加阿里云镜像仓库 zypper addrepo https://mirrors.aliyun.com/opensuse/tumbleweed/repo/oss/ tumbleweed-oss # 刷新全部仓库 zypper refresh # 查看仓库列表 zypper lr
二、软件包查询、安装与卸载
在安装软件之前,通常需要先搜索软件包。Zypper 的搜索命令是 zypper search,简写 zypper se。它支持模糊匹配,也可以加 -i 参数只查看已安装的软件包。例如 zypper se -i firefox 会列出所有名称或摘要中包含 firefox 且已经安装的包。如果只想搜索可安装的包,可以使用 -u 参数。搜索结果会显示包名、摘要和仓库来源,其中包名区分大小写,但搜索关键词不区分。
查询软件包的详细信息使用 zypper info,简写 zypper if。它会显示版本号、架构、仓库、安装状态、依赖关系以及包大小等信息,对判断是否适合安装非常有用。安装软件包使用 zypper install,简写 zypper in,后面可以跟一个或多个包名。Zypper 会自动解析依赖并提示需要的额外包。如果想在执行前先模拟一遍,可以加 --dry-run 参数,这样不会真正修改系统,但能看到将要安装或删除哪些包。下面的示例演示了搜索、查看详情和安装 htop 的过程。
# 搜索 htop zypper se htop # 查看 htop 的详细信息 zypper info htop # 模拟安装 htop,不实际执行 zypper in --dry-run htop # 实际安装 htop zypper in htop
卸载软件包使用 zypper remove,简写 zypper rm。卸载时会同时检查依赖关系,如果其他包依赖该软件包,Zypper 会提示可能一并删除这些包。使用 --clean-deps 参数可以自动删除因卸载而不再被需要的依赖包,例如 zypper rm --clean-deps htop。如果遇到依赖冲突,可以尝试 zypper verify 来修复损坏的依赖关系。执行 zypper verify 会检查系统中所有已安装包的依赖完整性,并尝试自动安装缺失的包或删除冲突包。
三、系统升级与发行版切换
Zypper 提供了两种主要的升级命令:zypper update(简写 zypper up)和 zypper dup。两者虽然都能让系统获得新版本软件包,但使用场景完全不同。zypper up 只会在当前已配置仓库的版本范围内更新软件包,不会改变软件包的供应商,也不会删除因版本冲突而无法满足的包。它更适合 Leap 稳定版系统的日常安全更新,或作为服务器计划的补丁升级方式。
zypper dup 是发行版升级命令,全称为 distribution upgrade。它会把系统中的所有包重新解析,允许更换供应商、删除过时包、安装新依赖,因此更适合 Tumbleweed 滚动更新或从 Leap 一个版本迁移到另一个版本。例如从 openSUSE Leap 15.5 升级到 15.6,通常就是先修改仓库地址再执行 zypper dup。由于这个操作可能会删除部分包,建议在执行前备份重要数据,并使用 --dry-run 模拟一次,确认无误后再正式运行。下面的代码块对比了两种升级命令的用法。
# 保守更新所有已安装包 zypper up # 滚动发行版升级 zypper dup # 模拟发行版升级,查看将要发生的变化 zypper dup --dry-run
除了常规升级,openSUSE 还提供安全补丁管理命令 zypper patch。它会根据官方公告安装带有安全修复或关键更新的补丁包。执行 zypper list-patches 可以查看当前可用的补丁列表,包括补丁编号、严重程度和是否需要重启。对于服务器运维来说,定期检查并应用补丁是保证系统安全的重要环节。使用 zypper patch --updatestack-only 可以只更新包管理器自身的更新栈。
四、高级管理:锁定、清理与脚本化
在部分生产环境中,某个软件包的新版本可能与其他组件不兼容,此时可以锁定该包,防止后续 zypper up 或 zypper dup 将其升级。锁定操作使用 zypper addlock,后面跟包名或通配符,例如 zypper addlock kernel-default 可以阻止内核被升级。查看当前所有锁定使用 zypper locks,简写 zypper ll。移除锁定使用 zypper removelock。需要注意的是,锁定过多可能导致升级时出现大量依赖冲突,建议只对确实需要保持版本的包使用。
Zypper 在运行时会下载大量 RPM 包到本地缓存目录,默认位于 /var/cache/zypp/packages。如果长时间不清理,这些缓存会占用不少磁盘空间。使用 zypper clean 可以清空下载的包缓存,而 zypper clean --all 会同时清理元数据缓存。旧内核也会累积占用空间,openSUSE 提供了 zypper purge-kernels 命令,它会保留正在运行的内核和最近一两个版本,删除其余旧内核。对于磁盘空间紧张的 VPS 或容器环境,定期执行清理操作非常必要。下面的代码块展示了锁定和清理的常用命令。
# 锁定 htop,禁止升级 zypper addlock htop # 查看锁定列表 zypper locks # 移除 htop 的锁定 zypper removelock htop # 清理下载缓存 zypper clean # 清理旧内核,只保留当前和上一个版本 zypper purge-kernels
在自动化脚本中调用 Zypper 时,需要避免交互式确认。可以使用 --non-interactive 参数让 Zypper 自动选择默认答案,或使用 -y 直接回答 yes。结合 --quiet 或 -q 可以减少输出信息,便于写入日志。例如在 cron 任务中执行 zypper --non-interactive up 实现无人值守更新。如果希望输出更易于解析,可以使用 --xmlout 参数获取 XML 格式结果。掌握这些参数后,Zypper 就能很好地融入自动化运维体系,减少重复的手动操作。
以上命令覆盖了 openSUSE 系统管理中的绝大多数包管理场景。初学者可以先从查询和安装命令入手,逐步熟悉仓库、升级和锁定等高级操作。把常用命令整理成自己的速查表,贴在终端旁边或保存为脚本注释,能显著提高日常维护效率。