Skip to content

软件包管理

本章将介绍 Linux 软件包管理,包括 Debian/Ubuntu 的 apt/dpkg 和 RHEL/CentOS 的 yum/dnf/rpm,以及源码编译安装等方法。

软件包管理概述

什么是软件包?

软件包是软件的打包形式,包含:

  • 可执行程序
  • 配置文件
  • 依赖关系信息
  • 安装/卸载脚本

包管理器对比

发行版包格式包管理器配置文件
Debian/Ubuntu.debapt, dpkg/etc/apt/
RHEL/CentOS.rpmyum, dnf, rpm/etc/yum.repos.d/
Arch Linux.pkg.tar.zstpacman/etc/pacman.conf
openSUSE.rpmzypper/etc/zypp/

apt - Debian/Ubuntu 包管理

更新软件源

bash
# apt (Advanced Package Tool) - Debian 系包管理器

# 更新软件源索引
sudo apt update

# 升级所有已安装的软件包
sudo apt upgrade

# 完整升级(可处理依赖关系变化)
sudo apt full-upgrade

# 升级单个软件包
sudo apt install --only-upgrade package_name

# 检查可升级的软件包
apt list --upgradable

# 清理不需要的依赖包
sudo apt autoremove

# 清理下载的软件包缓存
sudo apt clean
sudo apt autoclean

软件包查询

bash
# 搜索软件包
apt search nginx

# 搜索已安装的软件包
apt search --installed nginx

# 显示软件包信息
apt show nginx

# 显示软件包依赖
apt depends nginx

# 显示反向依赖(哪些包依赖此包)
apt rdepends nginx

# 列出所有已安装的软件包
apt list --installed

# 列出所有软件包
apt list

# 按名称搜索软件包
apt list nginx

# 使用正则表达式搜索
apt list "nginx*"

# 查看软件包安装的文件
dpkg -L nginx

软件包安装

bash
# 安装软件包
sudo apt install nginx

# 安装多个软件包
sudo apt install nginx mysql-server php

# 安装指定版本
sudo apt install nginx=1.18.0-0ubuntu1

# 安装时不安装推荐包
sudo apt install --no-install-recommends package_name

# 安装时仅下载不安装
sudo apt install --download-only nginx

# 重新安装软件包
sudo apt reinstall nginx

# 修复依赖关系
sudo apt install -f
sudo apt --fix-broken install

软件包删除

bash
# 删除软件包(保留配置文件)
sudo apt remove nginx

# 删除软件包及其配置文件
sudo apt purge nginx

# 删除软件包及其依赖
sudo apt autoremove nginx

# 删除多个软件包
sudo apt remove nginx apache2

# 清理残留配置
dpkg -l | grep '^rc' | awk '{print $2}' | xargs sudo apt purge -y

软件源配置

bash
# 软件源配置文件
/etc/apt/sources.list
/etc/apt/sources.list.d/

# 查看 sources.list 格式
cat /etc/apt/sources.list

# 格式说明:
# deb http://archive.ubuntu.com/ubuntu/ jammy main restricted universe multiverse
# deb-src http://archive.ubuntu.com/ubuntu/ jammy main restricted universe multiverse

# 组件说明:
# main - 官方支持的自由软件
# restricted - 官方支持的非自由软件(驱动等)
# universe - 社区维护的自由软件
# multiverse - 非自由软件

# 添加 PPA(Personal Package Archive)
sudo add-apt-repository ppa:nginx/stable
sudo apt update

# 删除 PPA
sudo add-apt-repository --remove ppa:nginx/stable

# 更换国内镜像源(Ubuntu)
sudo sed -i 's@//.*archive.ubuntu.com@//mirrors.tuna.tsinghua.edu.cn@g' /etc/apt/sources.list
sudo apt update

dpkg - 底层包管理

bash
# dpkg - Debian 包管理器底层工具

# 安装 deb 包
sudo dpkg -i package.deb

# 卸载软件包
sudo dpkg -r package_name

# 卸载软件包及配置
sudo dpkg -P package_name

# 查看软件包信息
dpkg -I package.deb

# 查看软件包内容
dpkg -c package.deb

# 查看已安装软件包列表
dpkg -l

# 查看软件包安装的文件
dpkg -L package_name

# 查询文件属于哪个包
dpkg -S /usr/bin/nginx

# 解压 deb 包(不安装)
dpkg -x package.deb /path/to/extract/

# 配置已解压的软件包
sudo dpkg --configure package_name

# 查看安装状态
dpkg -s package_name

# 修复依赖问题
sudo apt install -f

yum/dnf - RHEL/CentOS 包管理

dnf 基本操作

bash
# dnf (Dandified YUM) - Fedora/RHEL 8+/CentOS 8+ 包管理器
# yum 是 dnf 的兼容层

# 更新软件源缓存
sudo dnf makecache

# 更新所有软件包
sudo dnf update
sudo dnf upgrade

# 更新指定软件包
sudo dnf update nginx

# 检查可用更新
sudo dnf check-update

# 清理缓存
sudo dnf clean all

软件包查询

bash
# 搜索软件包
sudo dnf search nginx

# 显示软件包信息
sudo dnf info nginx

# 列出已安装的软件包
sudo dnf list installed

# 列出可安装的软件包
sudo dnf list available

# 列出所有软件包
sudo dnf list all

# 查看软件包依赖
sudo dnf deplist nginx

# 查看文件属于哪个包
sudo dnf provides /usr/bin/nginx
sudo dnf provides */nginx

# 查看软件包安装的文件
rpm -ql nginx

# 查看软件包变更日志
rpm -q --changelog nginx

软件包安装

bash
# 安装软件包
sudo dnf install nginx

# 安装多个软件包
sudo dnf install nginx php mysql-server

# 安装指定版本
sudo dnf install nginx-1.20.1

# 重新安装软件包
sudo dnf reinstall nginx

# 只下载不安装
sudo dnf install --downloadonly --downloaddir=/tmp nginx

# 从本地 rpm 文件安装
sudo dnf localinstall package.rpm

# 安装软件包组
sudo dnf groupinstall "Development Tools"

软件包删除

bash
# 删除软件包
sudo dnf remove nginx

# 删除软件包及其依赖
sudo dnf autoremove

# 删除多个软件包
sudo dnf remove nginx apache2

# 删除软件包组
sudo dnf groupremove "Development Tools"

软件源配置

bash
# 软件源配置目录
/etc/yum.repos.d/

# 查看启用的软件源
sudo dnf repolist

# 查看所有软件源
sudo dnf repolist all

# 启用软件源
sudo dnf config-manager --set-enabled repository

# 禁用软件源
sudo dnf config-manager --set-disabled repository

# 添加软件源
sudo dnf config-manager --add-repo=https://example.com/repo.repo

# 添加 EPEL 源(CentOS/RHEL)
sudo dnf install epel-release

# 配置国内镜像源(CentOS)
sudo sed -e 's|^mirrorlist=|#mirrorlist=|g' \
         -e 's|^#baseurl=http://mirror.centos.org|baseurl=https://mirrors.tuna.tsinghua.edu.cn|g' \
         -i.bak /etc/yum.repos.d/CentOS-*.repo
sudo dnf makecache

软件包组管理

bash
# 列出软件包组
sudo dnf grouplist

# 查看组信息
sudo dnf groupinfo "Development Tools"

# 安装软件包组
sudo dnf groupinstall "Development Tools"

# 更新软件包组
sudo dnf groupupdate "Development Tools"

# 删除软件包组
sudo dnf groupremove "Development Tools"

rpm - 底层包管理

bash
# rpm (Red Hat Package Manager) - RPM 包管理器底层工具

# 安装 rpm 包
sudo rpm -ivh package.rpm
# -i: 安装
# -v: 显示详细信息
# -h: 显示进度条

# 升级 rpm 包
sudo rpm -Uvh package.rpm

# 刷新 rpm 包(已安装则升级,否则不安装)
sudo rpm -Fvh package.rpm

# 卸载软件包
sudo rpm -e package_name

# 查看已安装软件包
rpm -qa

# 查看软件包信息
rpm -qi package_name

# 查看软件包安装的文件
rpm -ql package_name

# 查看文件属于哪个包
rpm -qf /usr/bin/nginx

# 查看软件包依赖
rpm -qR package_name

# 验证软件包
rpm -V package_name

# 导入 GPG 密钥
sudo rpm --import /path/to/key

# 检查软件包签名
rpm -K package.rpm

# 从 rpm 包中提取文件
rpm2cpio package.rpm | cpio -idv

源码编译安装

编译安装流程

bash
# 源码编译安装基本流程:
# 1. 下载源码
# 2. 解压源码
# 3. 配置(configure)
# 4. 编译(make)
# 5. 安装(make install)

# 安装编译工具
# Debian/Ubuntu
sudo apt install build-essential

# RHEL/CentOS
sudo dnf groupinstall "Development Tools"

编译安装示例

bash
# 示例:编译安装 nginx

# 1. 下载源码
wget https://nginx.org/download/nginx-1.24.0.tar.gz

# 2. 解压源码
tar -xzvf nginx-1.24.0.tar.gz
cd nginx-1.24.0

# 3. 安装依赖
sudo apt install libpcre3-dev zlib1g-dev libssl-dev

# 4. 配置编译选项
./configure --prefix=/usr/local/nginx \
            --with-http_ssl_module \
            --with-http_v2_module

# 5. 编译
make -j$(nproc)

# 6. 安装
sudo make install

# 7. 验证安装
/usr/local/nginx/sbin/nginx -v

# 8. 创建 systemd 服务
sudo cat > /etc/systemd/system/nginx.service << 'EOF'
[Unit]
Description=The nginx HTTP and reverse proxy server
After=network.target

[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStartPre=/usr/local/nginx/sbin/nginx -t
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true

[Install]
WantedBy=multi-user.target
EOF

sudo systemctl daemon-reload
sudo systemctl enable nginx
sudo systemctl start nginx

configure 常用选项

bash
# configure 脚本常用选项

--prefix=PREFIX           # 安装目录前缀(默认 /usr/local)
--exec-prefix=EPREFIX     # 可执行文件安装目录
--bindir=DIR              # 用户可执行文件目录
--libdir=DIR              # 库文件目录
--includedir=DIR          # 头文件目录
--datadir=DIR             # 数据文件目录
--sysconfdir=DIR          # 配置文件目录
--localstatedir=DIR       # 状态文件目录

--enable-FEATURE          # 启用特性
--disable-FEATURE         # 禁用特性
--with-PACKAGE            # 使用指定包
--without-PACKAGE         # 不使用指定包

# 查看所有选项
./configure --help

卸载编译安装的软件

bash
# 方法一:使用 make uninstall(如果支持)
cd nginx-1.24.0
sudo make uninstall

# 方法二:手动删除
sudo rm -rf /usr/local/nginx

# 方法三:使用 checkinstall 创建包后安装
sudo apt install checkinstall
cd nginx-1.24.0
./configure --prefix=/usr/local/nginx
make
sudo checkinstall
# 这会创建一个 deb/rpm 包,方便管理

其他包管理工具

snap - 通用包管理

bash
# snap - Ubuntu 开发的通用包格式

# 安装 snap(如果未安装)
sudo apt install snapd

# 搜索软件包
snap find nginx

# 安装软件包
sudo snap install nginx

# 安装指定通道
sudo snap install nginx --channel=edge

# 列出已安装的软件包
snap list

# 更新软件包
sudo snap refresh nginx

# 更新所有软件包
sudo snap refresh

# 回滚软件包
sudo snap revert nginx

# 删除软件包
sudo snap remove nginx

# 查看软件包信息
snap info nginx

# 查看软件包日志
snap logs nginx

# 管理服务
snap start nginx
snap stop nginx
snap restart nginx

flatpak - 沙盒应用

bash
# flatpak - 沙盒化应用分发

# 安装 flatpak
sudo apt install flatpak

# 添加 Flathub 仓库
flatpak remote-add --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo

# 搜索应用
flatpak search nginx

# 安装应用
flatpak install flathub org.nginx.nginx

# 列出已安装应用
flatpak list

# 运行应用
flatpak run org.nginx.nginx

# 更新应用
flatpak update

# 删除应用
flatpak uninstall org.nginx.nginx

pip - Python 包管理

bash
# pip - Python 包管理器

# 安装 pip
sudo apt install python3-pip

# 安装包
pip3 install package_name

# 安装指定版本
pip3 install package_name==1.0.0

# 安装到用户目录
pip3 install --user package_name

# 从 requirements.txt 安装
pip3 install -r requirements.txt

# 卸载包
pip3 uninstall package_name

# 列出已安装的包
pip3 list

# 查看包信息
pip3 show package_name

# 搜索包
pip3 search package_name

# 导出依赖
pip3 freeze > requirements.txt

# 升级 pip
pip3 install --upgrade pip

npm - Node.js 包管理

bash
# npm - Node.js 包管理器

# 安装 npm
sudo apt install npm

# 初始化项目
npm init

# 安装包
npm install package_name

# 全局安装
npm install -g package_name

# 安装开发依赖
npm install --save-dev package_name

# 卸载包
npm uninstall package_name

# 列出已安装的包
npm list
npm list -g --depth=0

# 更新包
npm update package_name

# 运行脚本
npm run script_name

# 查看包信息
npm info package_name

小结

本章介绍了 Linux 软件包管理:

系统包管理器功能
Debian/Ubuntuapt, dpkg高层和底层包管理
RHEL/CentOSdnf, yum, rpm高层和底层包管理
通用snap, flatpak跨发行版包管理
语言特定pip, npm语言包管理

常用命令速查

bash
# Debian/Ubuntu (apt)
sudo apt update                    # 更新软件源
sudo apt upgrade                   # 升级软件包
sudo apt install nginx             # 安装软件包
sudo apt remove nginx              # 删除软件包
apt search nginx                   # 搜索软件包

# RHEL/CentOS (dnf)
sudo dnf update                    # 更新软件包
sudo dnf install nginx             # 安装软件包
sudo dnf remove nginx              # 删除软件包
dnf search nginx                   # 搜索软件包

# 源码编译
./configure && make && sudo make install

下一步

下一章我们将学习 进程管理,了解如何查看、控制和管理 Linux 系统中的进程。