Chapter 09

软件包管理

掌握各大 Linux 发行版的包管理系统,从安装到源码编译的完整工作流

包管理器概述

Linux 的包管理器负责软件的安装、更新、删除和依赖解析。不同发行版有各自的包管理系统,但概念相通:仓库(Repository)中存放打包好的软件,包管理器从仓库下载并安装,自动处理依赖关系。

发行版家族高级包管理器底层工具包格式
Debian / Ubuntuaptdpkg.deb
Red Hat / CentOS / Fedoradnf / yumrpm.rpm
Arch Linux / Manjaropacmanpacman.pkg.tar.zst
openSUSEzypperrpm.rpm
Alpine Linuxapkapk.apk

apt:Debian/Ubuntu 包管理

常用 apt 命令

# 更新软件包索引(获取最新的包列表)
sudo apt update

# 升级已安装的软件包
sudo apt upgrade                  # 升级所有可更新的包
sudo apt upgrade nginx            # 升级特定包
sudo apt full-upgrade             # 升级(允许删除阻碍升级的包)
sudo apt dist-upgrade             # 发行版升级(跨大版本)

# 安装软件包
sudo apt install nginx
sudo apt install nginx -y         # -y 自动确认,不提示
sudo apt install vim curl wget git  # 一次安装多个包
sudo apt install ./package.deb    # 安装本地 .deb 文件

# 删除软件包
sudo apt remove nginx             # 删除包(保留配置文件)
sudo apt purge nginx              # 删除包和配置文件
sudo apt autoremove               # 删除不再需要的依赖包
sudo apt clean                    # 清空本地缓存的 .deb 文件
sudo apt autoclean                # 清空过时的缓存包

# 搜索软件包
apt search nginx                  # 搜索包名和描述
apt-cache search nginx            # 同上(旧版方式)
apt list --installed              # 列出已安装的包
apt list --installed | grep nginx

# 查看包信息
apt show nginx                    # 详细信息:版本、依赖、大小等
apt-cache policy nginx            # 查看可用版本和仓库来源
apt depends nginx                 # 查看依赖关系
apt rdepends nginx                # 查看被哪些包依赖

管理软件源(Repository)

# 查看当前软件源
cat /etc/apt/sources.list
ls /etc/apt/sources.list.d/

# 添加第三方 PPA(Ubuntu)
sudo add-apt-repository ppa:ondrej/php
sudo apt update

# 添加第三方软件源(通用方式)
# 1. 导入 GPG 密钥
curl -fsSL https://packages.example.com/gpg.key | sudo gpg --dearmor -o /usr/share/keyrings/example.gpg

# 2. 添加软件源
echo "deb [signed-by=/usr/share/keyrings/example.gpg] https://packages.example.com/apt stable main" | \
    sudo tee /etc/apt/sources.list.d/example.list

# 3. 更新并安装
sudo apt update && sudo apt install example-package

# 切换 Ubuntu 镜像源(加速下载)
sudo sed -i 's|http://archive.ubuntu.com|https://mirrors.aliyun.com|g' /etc/apt/sources.list
sudo apt update

dpkg:底层包管理

# 安装 .deb 文件(apt 可以处理依赖,dpkg 不能)
sudo dpkg -i package.deb
sudo apt install -f              # 安装依赖修复 dpkg 安装失败

# 查看已安装的包
dpkg -l                          # 列出所有已安装包
dpkg -l | grep nginx             # 过滤
dpkg -s nginx                    # 查看包状态和信息
dpkg -L nginx                    # 列出包安装了哪些文件
dpkg -S /usr/bin/vim             # 查询文件属于哪个包

# 删除包
sudo dpkg -r nginx               # 删除(保留配置)
sudo dpkg -P nginx               # 彻底删除(含配置)

# 解压 .deb 文件查看内容
dpkg -x package.deb /tmp/extracted/  # 解压文件
dpkg -e package.deb /tmp/control/    # 解压控制文件

yum / dnf:Red Hat 系包管理

# DNF(Fedora/RHEL 8+/Rocky Linux 的现代包管理器)
# yum 与 dnf 命令基本相同,dnf 速度更快

# 更新
sudo dnf check-update             # 检查可更新的包
sudo dnf update                   # 更新所有包
sudo dnf update nginx             # 更新特定包

# 安装
sudo dnf install nginx
sudo dnf install nginx -y
sudo dnf install ./package.rpm    # 安装本地 rpm
sudo dnf groupinstall "Development Tools"  # 安装包组

# 删除
sudo dnf remove nginx
sudo dnf autoremove               # 删除孤立依赖
sudo dnf clean all                # 清理缓存

# 搜索和查询
dnf search nginx
dnf info nginx
dnf list installed
dnf list available | grep python
dnf provides /usr/bin/python3     # 查询文件属于哪个包(对应 dpkg -S)

# 管理仓库
dnf repolist                      # 列出启用的仓库
sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo dnf install epel-release     # 安装 EPEL 扩展仓库

rpm:底层 RPM 包管理

# 安装/升级/删除 rpm 包
sudo rpm -ivh package.rpm         # -i 安装 -v 详细 -h 进度条
sudo rpm -Uvh package.rpm         # -U 升级(或安装)
sudo rpm -evh nginx               # 删除

# 查询
rpm -qa                           # 列出所有已安装包
rpm -qa | grep nginx
rpm -qi nginx                     # 包信息
rpm -ql nginx                     # 包文件列表
rpm -qf /usr/bin/python3          # 查询文件属于哪个包
rpm -qR nginx                     # 查询依赖关系

# 验证包完整性
rpm -V nginx                      # 验证包文件是否被修改
rpm --checksig package.rpm        # 验证 GPG 签名

pacman:Arch Linux 包管理

# 同步(更新索引并升级)
sudo pacman -Syu                  # 更新数据库并升级所有包
sudo pacman -Sy                   # 只更新数据库

# 安装
sudo pacman -S nginx              # 安装
sudo pacman -S nginx vim curl     # 安装多个

# 删除
sudo pacman -R nginx              # 删除包
sudo pacman -Rns nginx            # 删除包+依赖+配置
sudo pacman -Sc                   # 清理旧缓存

# 搜索
pacman -Ss nginx                  # 搜索(在线仓库)
pacman -Qs nginx                  # 搜索(已安装)
pacman -Qi nginx                  # 包信息
pacman -Ql nginx                  # 包文件列表
pacman -Qo /usr/bin/vim           # 查询文件属于哪个包

# AUR(Arch User Repository)——用 yay 或 paru
yay -S google-chrome
paru -S spotify

snap 与 flatpak

Snap(Canonical 出品)
自包含软件包,包含所有依赖,在沙箱中运行。优点:跨发行版安装,自动更新。缺点:启动速度较慢,占用空间大,与系统集成度较低。
Flatpak(社区主导)
与 Snap 类似的沙箱容器格式,通过 Flathub 仓库分发。与 GNOME/KDE 等桌面环境集成更好,在非 Ubuntu 发行版上更受欢迎。
# snap
snap find vlc                     # 搜索
sudo snap install vlc             # 安装
sudo snap install code --classic  # --classic 解除沙箱限制
snap list                         # 已安装的 snap 包
sudo snap refresh                 # 更新所有 snap
sudo snap remove vlc              # 删除

# flatpak
flatpak remote-add --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo
flatpak search org.videolan.VLC   # 搜索
flatpak install flathub org.videolan.VLC  # 安装
flatpak list                      # 已安装
flatpak update                    # 更新
flatpak uninstall org.videolan.VLC  # 删除

pip 与 npm:语言级包管理

# pip:Python 包管理
pip install requests              # 安装
pip install requests==2.31.0      # 安装特定版本
pip install -r requirements.txt   # 从文件批量安装
pip install --upgrade requests    # 升级
pip uninstall requests            # 删除
pip list                          # 列出已安装包
pip freeze > requirements.txt     # 导出已安装包列表
pip show requests                 # 包信息

# 使用虚拟环境(隔离项目依赖)
python3 -m venv venv              # 创建虚拟环境
source venv/bin/activate          # 激活(Linux/macOS)
pip install -r requirements.txt   # 在虚拟环境中安装
deactivate                        # 退出虚拟环境

# npm:Node.js 包管理
npm install express               # 安装到 node_modules/
npm install -g typescript         # -g 全局安装
npm install                       # 按 package.json 安装依赖
npm update                        # 更新依赖
npm uninstall lodash              # 删除
npm list                          # 查看已安装包
npm list -g --depth=0             # 全局安装的包
npx create-react-app my-app       # npx:临时执行包命令

从源码编译安装

# 当包管理器没有需要的版本时,从源码编译

# 1. 安装编译工具
sudo apt install build-essential  # Debian/Ubuntu
sudo dnf groupinstall "Development Tools"  # Fedora/RHEL

# 2. 下载源码
wget https://www.openssl.org/source/openssl-3.0.0.tar.gz
tar -xzf openssl-3.0.0.tar.gz
cd openssl-3.0.0/

# 3. 配置(生成 Makefile)
./configure --prefix=/usr/local/openssl  # 指定安装路径
# 或使用 cmake
mkdir build && cd build
cmake .. -DCMAKE_INSTALL_PREFIX=/usr/local/app

# 4. 编译(-j 并行编译,$(nproc) 为 CPU 核心数)
make -j$(nproc)

# 5. 安装
sudo make install

# 6. 更新动态链接库缓存
sudo ldconfig

# 卸载(如果有 uninstall target)
sudo make uninstall
包管理最佳实践
本章小结

Linux 软件包管理的核心要点:① 高级包管理器(apt/dnf/pacman)处理依赖,底层工具(dpkg/rpm)直接操作包文件——两者互补;② apt update(更新索引)和 apt upgrade(升级软件)是两个独立步骤,不要混淆;③ dpkg -L 包名 查看包安装了哪些文件,dpkg -S /路径 反查文件属于哪个包;④ 添加第三方源前先导入 GPG 公钥,验证包的真实性;⑤ Python 项目务必使用虚拟环境(python3 -m venv)隔离依赖,避免污染系统 Python;⑥ 从源码编译时 make -j$(nproc) 利用所有 CPU 核心并行编译;⑦ Snap/Flatpak 适合安装官方仓库没有或版本较旧的应用。