软件包管理工具是一组命令的集合,其作用是在操作系统中提供安装、更新、删除及卸载软件的方法,同时提供对系统中所有软件状态信息的查询。在不同的操作系统中,确实存在不同的默认包管理工具。以下是一些常见的操作系统的默认包管理工具。

包管理器 包格式 适用操作系统/发行版 简要说明
apt .deb Ubuntu、Debian 及其衍生发行版 Debian 系默认工具链。apt 是高层命令(如 apt install),底层由 dpkg 处理 .deb 包安装。支持依赖自动解析、仓库管理。
yum .rpm CentOS 7 及更早、RHEL 7、旧版 Fedora 基于 RPM 的传统包管理器,依赖解析较慢,已被 DNF 取代。
DNF .rpm Fedora(≥22)、RHEL 8+、CentOS Stream YUM 的下一代替代品,使用 libsolv 进行快速依赖解析,性能更好,内存占用更低。
zypper .rpm openSUSE(Tumbleweed / Leap) 功能强大,支持事务回滚(结合 Btrfs/Snapper),交互式体验好。
pacman 自定义二进制包(.pkg.tar.zst 等) Arch Linux、Manjaro 极简高效,单命令完成安装/更新/清理。滚动更新模型,软件版本新。
pkgtools .tgz / .txz(压缩 tarball) Slackware 最古老的 Linux 包管理系统之一,无自动依赖解析,强调“KISS”原则(Keep It Simple, Stupid)。
winget 多种(MSIX、EXE、MSI 等) Windows 10(1709+)、Windows 11 微软官方包管理器,通过清单(YAML)描述安装源,支持从 GitHub 或私有源安装应用。
Chocolatey nupkg(基于 NuGet) Windows 第三方包管理器,需管理员权限。支持自动化脚本、企业部署,社区和商业版本并存。
Scoop JSON 清单(描述安装方式) Windows(推荐 PowerShell + 用户权限) 轻量级,面向开发者。默认安装到用户目录(无需管理员),支持 buckets(类似仓库)扩展。

由于生态的复杂性,Windows 系统至今未出现一个一统江湖的包管理器。


apt/apt-get(Ubuntu、Debian)

apt 是 ubuntu 系统默认的软件包管理工具,是 apt-get 的现代改进版本,旨在提供更简洁、更友好的用户体验‌。在 shell 中通常使用 apt,因为可以少打 4 个字符。在脚本中安装软件通常使用 apt-get,兼容性更好,实现更底层。


apt 的基本语法

apt apt-get 命令含义
apt install <包名> apt-get install <包名> 安装软件包
apt remove <包名> apt-get remove <包名> 移除软件包
apt purge <包名> apt-get purge <包名> 移除软件包及配置文件
apt update apt-get update 刷新存储库索引
apt upgrade apt-get upgrade 升级所有可升级的软件包
apt autoremove <包名> apt-get autoremove <包名> 自动删除所有不需要的软件包
apt full-upgrade apt-get dist-upgrade 在升级软件包时自动处理依赖关系
apt search <正则表达式> apt-cache search <正则表达式> 搜索应用程序
apt show <包名> apt-cache show <包名> 显示安装细节
apt clean apt-get clean 清理已下载的软件包,不会影响软件的正常使用
apt autoclean apt-get autoclean 删除已经卸载的软件的软件包备份

apt 的使用(wget为例)

更新存储库

apt 从软件源安装软件,它需要在本地维护一个软件源的存储库,这样就能在存储库中搜索软件包了。但软件源中的软件包信息是频繁更新的,如果你想使用更新版本的软件,你就需要先更新本地的存储库,再进行软件安装。

apt update

搜索软件包

apt search ^wget

安装软件包

apt install wget
# 使用 dpkg 安装软件包
dpkg -i xx.deb

查看软件包

# 查看本地是否安装 wget
apt list | grep ^wget
# 查看软件包的具体信息
apt show wget
# 查看软件包对应的文件信息
dpkg -L rstudio-server

卸载软件包

# 卸载软件,保留相关文件
apt remove rstudio-server
# 卸载软件并删除相关文件
apt autoremove rstudio-server

更新软件包

# 先更新存储库,确保获取到更新的版本包信息
apt update
# 更新系统中所有的软件包,使用 installing/upgrading packages 的方式来处理依赖
apt upgrade
# 更新系统中所有的软件包,使用 removing/installing/upgrading packages 的方式来处理依赖
apt full-upgrade

yum(CentOS、RHEL)

yum 是一种基于 RPM 包管理系统的包管理工具,它是在基于 Red Hat 的 Linux 发行版中默认提供的。Red Hat Enterprise Linux (RHEL)、CentOS 和 Fedora 等许多常见的 Linux 发行版都默认安装了 yum。它是一个强大而常用的工具,用于在 Linux 系统中方便地管理软件包的安装、更新和卸载。

yum 的命令形式为:yum [options] [command] [package ...]。其中 [package ...] 是操作的对象,[command] 为所要进行的操作,包括 installupdateremovelist 等,而 [options] 是可选项,包括:

  1. -h —– 帮助
  2. -y —– 当安装过程提示选择全部为"yes"
  3. -q —– 不显示安装的过程
  4. ……

以下是一些常用的 yum 命令和功能:

yum 命令含义 说明
yum install <包名> 安装软件包 使用 yum install 命令安装指定的软件包
yum update 更新软件包 使用 yum update 命令更新系统中已安装的软件包到最新版本
yum upgrade 升级系统 使用 yum upgrade 命令升级整个系统以获取最新的软件包和安全修复
yum search <关键字> 搜索软件包 使用 yum search 命令搜索软件包的名称或关键字
yum list installed 列出已安装的软件包 使用 yum list installed 命令列出系统中已安装的软件包
yum remove <包名> 删除软件包 使用 yum remove 命令卸载指定的软件包
yum clean all 清理缓存 使用 yum clean 命令清理 yum 的缓存文件,以释放磁盘空间

zypper(OpenSUSE)

Zypper 是 OpenSUSE 和企业版 SUSE 中软件包管理器 ZYpp 的命令行接口。 主要用于管理软件包(用来安装、删除、更新和查询本地或远程的软件包),以及管理仓库(用命令行添加、删除、启用或禁用库)。

以下是一些常用的 zypper 命令和功能:

zypper 命令含义 说明
zypper install <包名> 安装软件包
zypper source-install <包名> 安装源码包
zypper update <包名> 更新某一软件包
zypper update 更新所有软件包
zypper list-updates 查看所有可用的更新列表
zypper remove <包名> 删除软件包
zypper search <关键字> 搜索软件包
zypper info <包名> 查看有关包的信息
zypper patches 查看所有可打补丁
zypper patch <补丁名> 安装指定补丁
zypper al <包名> 锁住软件包(al 是 add lock的缩写) 软件包被锁之后将不能被移除或升级
zypper ll 查看所有已被锁住的软件包
zypper rl <包名> 解锁软件包(rl 是 remove lock的缩写)

常用包管理操作

安装包

# 示例:安装Mozilla firefox
[root@linuxprobe ~]# zypper install MozillaFirefox
Loading repository data...
Reading installed packages...
Resolving package dependencies...
The following NEW packages are going to be installed:
  MozillaFirefox MozillaFirefox-branding-SLED
The following packages are not supported by their vendor:
  MozillaFirefox MozillaFirefox-branding-SLED
2 new packages to install.
Overall download size: 964.0 KiB. After the operation, additional 3.4 MiB will be used.
Continue? [y/n/?] (y): y
Retrieving package MozillaFirefox-3.6.16-0.2.1.x86_64 (1/2), 949.0 KiB (3.4 MiB unpacked)
Retrieving: MozillaFirefox-3.6.16-0.2.1.x86_64.rpm [done]
Installing: MozillaFirefox-3.6.16-0.2.1 [done]
Retrieving package MozillaFirefox-branding-SLED-3.5-1.1.5.x86_64 (2/2), 15.0 KiB (34.0 KiB unpacked)
Retrieving: MozillaFirefox-branding-SLED-3.5-1.1.5.x86_64.rpm [done]
Installing: MozillaFirefox-branding-SLED-3.5-1.1.5 [done]

安装源码包

# 示例:从库中安装 apache
[root@linuxprobe ~]# zypper source-install apache2-mod_nss
Reading installed packages...
Loading repository data...
Resolving package dependencies...
Retrieving package mozilla-nss-devel-3.12.8-1.2.1.x86_64 (2/3), 473.0 KiB (2.6 MiB unpacked)
Retrieving: mozilla-nss-devel-3.12.8-1.2.1.x86_64.rpm [done]
Installing: mozilla-nss-devel-3.12.8-1.2.1 [done]
Retrieving: apache2-mod_nss-1.0.8-17.5.src.rpm [done]

删除包

# 示例:移除 Mozilla Firefox
[root@linuxprobe ~]# zypper remove MozillaFirefox
Loading repository data...
Reading installed packages...
Resolving package dependencies...
The following packages are going to be REMOVED:
  MozillaFirefox MozillaFirefox-branding-SLED
2 packages to remove.
After the operation, 3.4 MiB will be freed.
Continue? [y/n/?] (y): y
Removing MozillaFirefox-branding-SLED-3.5-1.1.5 [done]
Removing MozillaFirefox-3.6.16-0.2.1 [done]

查找包

# 示例:查找所有usb开头的软件包
[root@linuxprobe ~]# zypper search usb*
Loading repository data...
Reading installed packages...
S | Name                | Summary                                                        | Type
--+---------------------+----------------------------------------------------------------+--------
     | usb_modeswitch      | A mode switching tool for controlling multiple-device USB gear | package
     | usb_modeswitch-data | A mode switching tool for controlling multiple-device USB gear | package
     | usbip-devel         | Headers and static libraries                                   | package
i | usbutils            | Tools and libraries for USB devices                            | package

查看软件包详情

# 示例:查看usbutils的信息
[root@linuxprobe ~]# zypper info usbutils
Loading repository data...
Reading installed packages...
Information for package usbutils:
Repository: LINUXPROBE
Name: usbutils
Version: 0.73-38.19
Arch: x86_64
Vendor: SUSE LINUX Products GmbH, Nuernberg, Germany
Support Level: unknown
Installed: Yes
Status: up-to-date
Installed Size: 461.0 KiB
Summary: Tools and libraries for USB devices
Description:
This package contains a utility for inspecting devices connected to USB
ports.
It requires kernel version 2.3.99-pre7 or newer, or the USB backport
which was introduced in 2.2.18 (supporting the /proc/bus/usb
interface).

锁住包

# 锁住包文件 usbutils
[root@linuxprobe ~] # zypper al usbutils
Specified lock has been successfully added.

# 查看所有已被锁住的软件包, ll 是 List Locks的缩写
[root@linuxprobe ~] # zypper ll
# | Name            | Type    | Repository
--+-----------------+---------+-----------
1 | usbutils        | package | (any)

解锁包

# 加rl选项解锁 usbutils, rl 是 remove lock的缩写
[root@linuxprobe ~] #  zypper rl usbutils
1 lock has been successfully removed.
[root@linuxprobe ~] # zypper ll
There are no package locks defined.

管理软件包仓库

用 zypper 添加库

# 语法:
zypper addrepo
#
[root@linuxprobe ~] # zypper addrepo --check --refresh --name "Mozilla-repo" http://download.opensuse.org/repositories/mozilla/SLE_11/ "Mozillarepo"
Adding repository 'Mozilla-repo' [done]
Repository 'Mozilla-repo' successfully added
Enabled: Yes
Autorefresh: Yes
URI: http://download.opensuse.org/repositories/mozilla/SLE_11/

创建本地库

# 我们可以使用zypper从本地目录中创建一个包含所有rpm文件的本地库
# 语法:
zypper addrepo
#
# 示例:创建一个名为Linuxprobe_Repo的本地目录,包含所有rpm文件
[root@linuxprobe ~] # zypper addrepo /var/stormgt/dsminst Linuxprobe_Repo
Adding repository 'Linuxprobe_Repo' [done]
Repository 'Linuxprobe_Repo' successfully added
Enabled: Yes
Autorefresh: No
URI: dir:///var/stormgt/dsminst
[root@linuxprobe ~] # zypper search --repo Linuxprobe_Repo
Loading repository data...
Reading installed packages...
S | Name        | Summary                                 | Type
--+-------------+-----------------------------------------+--------
i | TIVsm-API   | the API                                 | package
i | TIVsm-API64 | the API                                 | package
i | TIVsm-BA    | the Backup Archive Client               | package
i | gskcrypt32  | IBM GSKit Cryptography Runtime          | package
i | gskcrypt64  | IBM GSKit Cryptography Runtime          | package
i | gskssl32    | IBM GSKit SSL Runtime With Acme Toolkit | package
i | gskssl64    | IBM GSKit SSL Runtime With Acme Toolkit | package

注:你也可以通过此命令添加NFS或FTP路径

查看库

[root@linuxprobe ~] # zypper lr
# | Alias                                            | Name                                             | Enabled | Refresh
--+--------------------------------------------------+--------------------------------------------------+---------+--------
1 | Mozillarepo                                      | Mozilla-repo                                     | Yes     | Yes
2 | SUSE-Linux-Enterprise-Server-11-SP1 11.1.1-1.152 | SUSE-Linux-Enterprise-Server-11-SP1 11.1.1-1.152 | Yes     | Yes
#
# 查看repo完整的URI:
[root@linuxprobe ~] # zypper lr --uri
# | Alias                                            | Name                                             | Enabled | Refresh | URI
--+--------------------------------------------------+--------------------------------------------------+---------+---------+----------------------------------------------------------
1 | Mozillarepo                                      | Mozilla-repo                                     | Yes     | Yes     | http://download.opensuse.org/repositories/mozilla/SLE_11/
2 | SUSE-Linux-Enterprise-Server-11-SP1 11.1.1-1.152 | SUSE-Linux-Enterprise-Server-11-SP1 11.1.1-1.152 | Yes     | Yes     | http://19.106.65.64/FUSELinux/600RC0

在库中搜索包

# 列出指定库Mozillarepo的所有软件包
[root@linuxprobe ~] # zypper search --repo Mozillarepo
Loading repository data...
Reading installed packages...
S | Name                               | Summary                                  | Type
--+------------------------------------+------------------------------------------+-----------
i | MozillaFirefox                     | Mozilla Firefox Web Browser              | package
i | MozillaFirefox-branding-SLED       | SLED branding of MozillaFirefox          | package
      | MozillaFirefox-branding-openSUSE   | openSUSE branding of MozillaFirefox      | package
      | MozillaFirefox-branding-openSUSE   | openSUSE branding of MozillaFirefox      | srcpackage

库重命名

# 重命名库可以用 renamerepo 选项
# 示例:将库"Linuxprobe_Repo"的名字改成"MyLinuxRepo"
[root@linuxprobe ~] # zypper renamerepo Linuxprobe_Repo MyLinuxRepo
Repository 'Linuxprobe_Repo' renamed to 'MyLinuxRepo'.

删除库

# 用removerepo选项来移除库
[root@linuxprobe ~] # zypper removerepo MyLinuxRepo
Removing repository 'MyLinuxRepo' [done]
Repository 'MyLinuxRepo has been removed.

备份库

# 用export选项可以备份一系列库文件
[root@linuxprobe ~] # zypper lr --export /var/tmp/backup.repo
Repositories have been successfully exported to /var/tmp/backup.repo.

从备份文件中添加库

[root@linuxprobe ~] # zypper addrepo /var/tmp/backup.rep

禁用/使用库

# 1
# 示例: 用 modifyrepo 选项的 -d 参数来禁用Mozilla库
[root@linuxprobe ~] # zypper modifyrepo -d Mozillarepo
Repository 'Mozillarepo' has been successfully disabled.
# 2
# 示例: 用 modifyrepo选项 -e 参数来允许使用Mozilla库
[root@linuxprobe ~] # zypper modifyrepo -e Mozillarepo
Repository 'Mozillarepo' has been successfully enabled.

刷新库

# 1
# 示例: 刷新Mozilla库
[root@linuxprobe ~] # zypper refresh Mozillarepo
Repository 'Mozilla-repo' is up to date.
Specified repositories have been refreshed.
# 2
# 示例: 自动刷新指定库
[root@linuxprobe ~] # zypper modifyrepo --refresh Linuxprobe_Repo
Autorefresh has been enabled for repository 'Linuxprobe_Repo'.

pacman(Arch Linux、Manjaro)

使用 pacman 包管理器的 Linux 系统有:Arch Linux 及其衍生版本(Manjaro Linux、EndeavourOS、ArcoLinux、Artix Linux)

pacman 命令含义 说明
pacman -S <包名> 安装软件包
pacman -Syu <包名> 更新软件包
pacman -Syy 强行更新应用的软件库(源)
pacman -R <包名> 移除软件包
pacman -S archlinuxcn-keyring 安装 archlinuxcn-keyring 包导入 GPG key
pacman -Sy paru 更新源
pacman -Ss <关键字> 搜索含关键字的包
pacman -Qi <包名> 查看有关包的信息
pacman -Ql <包名> 列出该包的文件

pacman 配置文件路径:/etc/pacman.conf


pkgtools(Slackware)

以下是一些常用的 pkgtools 命令和功能:

pkgtools 命令 命令含义 说明
installpkg <包名>.txz 安装本地 .txz 软件包(不处理依赖)
removepkg <包名> 卸载已安装的软件包
upgradepkg <旧包> <新包>.txz 升级软件包(替换旧版本)
pkgtool 交互式菜单工具(可安装/查看/移除包)
ls /var/log/packages/ 查看已安装的包列表(非命令,但常用)
grep -r “关键字” /var/log/packages/ 搜索已安装包中含关键字的包

配置文件路径:

# 软件源(mirror)配置(需启用 `slackpkg` 工具)
/etc/slackpkg/mirrors
# 主要包数据库(每个包一个记录文件)
/var/log/packages/

注意:pkgtools 本身 不自动解析依赖,依赖需手动处理。slackpkg 是其扩展工具,支持在线更新。


winget(Windows)

微软官方包管理器。适用版本为 Windows 10 (1709+)、Windows 11 (需安装 App Installer)。

winget 命令 命令含义 说明
winget install <包标识> 安装软件
winget upgrade <包标识> 升级指定软件
winget upgrade –all 升级所有可更新的软件
winget uninstall <包标识> 卸载软件
winget search <关键字> 搜索可用软件包
winget show <包标识> 显示软件包详细信息
winget list 列出已安装的可管理软件
winget source update 更新软件源

配置文件路径:

# 用户配置
%LOCALAPPDATA%\Packages\Microsoft.DesktopAppInstaller_8wekyb3d8bbwe\LocalState\settings.json

源清单仓库:https://github.com/microsoft/winget-pkgs


Chocolatey(Windows)

社区主导的 Windows 包管理器 (商业版由 Chocolatey Inc. 提供)。首次使用需以管理员身份运行 PowerShell 并执行安装脚本。使用 nupkg(基于 NuGet),封装安装脚本,而调用非官方安装程序。

choco 命令 命令含义 说明
choco install <包名> 安装软件(如 choco install git
choco upgrade <包名> 升级指定软件
choco upgrade all 升级所有已安装软件
choco uninstall <包名> 卸载软件
choco search <关键字> 搜索软件包
choco list –local-only 列出本地已安装的包
choco info <包名> 查看包的详细信息
choco outdated 检查哪些包有可用更新

配置文件路径:

# 配置文件
$env:ChocolateyInstall\config\chocolatey.config
$env:ChocolateyInstall = C:\ProgramData\chocolatey  #默认
# 包安装目录
C:\ProgramData\chocolatey\lib\

包仓库:https://community.chocolatey.org/


Scoop(Windows)

开源社区 (GitHub) 维护的 Windows 包管理器,使用普通用户权限调用官方安装程序,无需管理员权限。应用安装在 ~/scoop/apps/,环境变量自动配置。

scoop 命令 命令含义 说明
scoop install <包名> 安装软件
scoop update <包名> 更新指定软件
scoop update * 更新所有已安装软件
scoop uninstall <包名> 卸载软件
scoop search <关键字> 搜索主 bucket 中的软件
scoop list 列出已安装的软件
scoop info <包名> 查看包信息
scoop bucket add <名称> 添加第三方 bucket

配置文件路径:

# 用户安装根目录
~\scoop
%USERPROFILE%\scoop
# 配置文件
~\scoop\config.json
# Buckets(仓库)位置
~\scoop\buckets\

首次使用需以 管理员身份运行 PowerShell 并执行安装脚本。默认仅安装到用户目录,无需管理员权限,非常适合开发者工具链管理。