软件包管理:Linux 的应用商店
引言
软件包管理是 Linux 系统中最日常的任务之一。不同的发行版使用不同的包管理器,但核心概念是相通的。在这篇文章中,我们将系统学习 Linux 的软件包管理系统。
包管理器概述
什么是软件包
软件包是预编译的应用程序及其元数据的打包格式:
flowchart TD
A[源代码] --> B[编译]
B --> C[打包]
C --> D[软件包]
D --> E[Debian 包<br/>.deb]
D --> F[Red Hat 包<br/>.rpm]
D --> G[Arch 包<br/>.pkg.tar.zst]
E --> H[APT]
F --> I[DNF/YUM]
G --> J[Pacman]
style H fill:#e3f2fd
style I fill:#fff3e0
style J fill:#f3e5f5
包管理器的功能
- 安装软件:从仓库或本地文件安装
- 卸载软件:删除软件及其配置
- 更新软件:升级到最新版本
- 依赖管理:自动处理依赖关系
- 仓库管理:添加、删除、更新软件源
Debian 系:APT
APT 基础
# 更新软件包列表
sudo apt update
# 升级所有已安装的软件包
sudo apt upgrade
# 完整系统升级(包括依赖关系变化)
sudo apt full-upgrade
# 安装软件
sudo apt install nginx
sudo apt install vim git curl
# 删除软件(保留配置)
sudo apt remove nginx
# 删除软件和配置
sudo apt purge nginx
# 删除不需要的依赖
sudo apt autoremove
# 清理下载的包文件
sudo apt clean
sudo apt autoclean
软件源配置
# 软件源文件
/etc/apt/sources.list
/etc/apt/sources.list.d/*.conf
# 查看当前源
cat /etc/apt/sources.list
# 添加 PPA(Personal Package Archive)
sudo add-apt-repository ppa:deadsnakes/ppa
sudo apt update
# 手动添加源
echo 'deb https://example.com/ubuntu jammy main' | sudo tee /etc/apt/sources.list.d/custom.list
# 添加 GPG 密钥
wget -qO - https://example.com/key.gpg | sudo apt-key add -
# 更新系统后清理旧包
sudo apt autoremove
sudo apt autoclean
.deb 文件
# 安装 .deb 文件
sudo dpkg -i package.deb
# 修复依赖问题
sudo apt install -f
# 查看已安装的包
dpkg -l | grep nginx
# 查看包信息
dpkg -I package.deb
# 查看包内容
dpkg -c package.deb
# 卸载 .deb 包
sudo dpkg -r package_name
sudo dpkg -P package_name # 包括配置文件
常用操作
# 搜索软件包
apt search nginx
apt show nginx # 查看包详情
# 查看已安装的包
apt list --installed
# 查看可升级的包
apt list --upgradable
# 查看包依赖关系
apt depends nginx
apt rdepends nginx # 反向依赖
# 下载但不安装
apt download nginx
apt source nginx # 下载源代码
# 固定软件版本
sudo apt mark hold nginx # 禁止升级
sudo apt mark unhold nginx # 允许升级
Red Hat 系:DNF
DNF 基础
# 安装软件
sudo dnf install nginx
# 更新软件
sudo dnf update nginx
sudo dnf upgrade # 升级所有软件
# 删除软件
sudo dnf remove nginx
sudo dnf erase nginx
# 查找软件
dnf search nginx
# 查看包信息
dnf info nginx
仓库配置
# 仓库配置目录
/etc/yum.repos.d/*.repo
# 查看已启用的仓库
dnf repolist
# 查看所有仓库
dnf repolist all
# 启用/禁用仓库
sudo dnf config-manager --set-enabled epel
sudo dnf config-manager --set-disabled epel
# 添加仓库
sudo dnf config-manager --add-repo https://download.example.com/repo.rpm
# EPEL(Extra Packages for Enterprise Linux)
sudo dnf install epel-release
.rpm 文件
# 安装 .rpm 文件
sudo rpm -ivh package.rpm
# 或
sudo dnf localinstall package.rpm
# 查询已安装的包
rpm -qa | grep nginx
rpm -qi nginx # 包信息
rpm -ql nginx # 包文件列表
rpm -qf /bin/nginx # 查看文件属于哪个包
# 卸载 .rpm 包
sudo rpm -e nginx
# 验证包
rpm -V nginx
Arch 系:Pacman
Pacman 基础
# 同步包数据库
sudo pacman -Sy
# 升级系统
sudo pacman -Syu
# 安装软件
sudo pacman -S nginx
# 删除软件
sudo pacman -R nginx # 保留依赖和配置
sudo pacman -Rs nginx # 删除依赖
sudo pacman -Rns nginx # 删除依赖和配置
# 搜索软件
pacman -Ss nginx
# 查看包信息
pacman -Si nginx
pacman -Qii nginx # 已安装包的详细信息
仓库和 AUR
# 官方仓库
core - 核心软件
extra - 额外软件
community - 社区软件
# 查看包在哪个仓库
pacman -Ss nginx
# AUR(Arch User Repository)
# 需要使用 yay 或 paru 等 AUR 助手
# 安装 yay
sudo pacman -S base-devel git
git clone https://aur.archlinux.org/yay.git
cd yay
makepkg -si
# 使用 yay
yay -S google-chrome # 从 AUR 安装
yay -Syu # 升级系统(包括 AUR)
yay -Ss package # 搜索包
.pkg.tar.zst 文件
# 安装本地包文件
sudo pacman -U package.pkg.tar.zst
# 查看包内容
pacman -Ql package
pacman -Qo /path/to/file # 文件属于哪个包
依赖管理
依赖类型
flowchart TD
A[软件包] --> B[依赖]
B --> C[硬依赖<br/>requires]
B --> D[软依赖<br/>suggests]
B --> E[构建依赖<br/>build-dep]
C --> F[必须安装]
D --> G[推荐安装]
E --> H[编译时需要]
style C fill:#ffcdd2
style D fill:#fff3e0
style E fill:#e3f2fd
查看依赖关系
# Debian/Ubuntu
apt depends nginx # 正向依赖
apt rdepends nginx # 反向依赖(被依赖)
# Red Hat/CentOS
dnf repoquery --requires nginx
dnf repoquery --whatrequires nginx
# Arch
pactree nginx # 依赖树
pactree -r nginx # 反向依赖树
解决依赖冲突
# 查看冲突的包
apt show package | grep Conflicts
# 强制安装(不推荐)
sudo apt install -f
# 使用特定版本
sudo apt install package=1.0.0
# 锁定版本
sudo apt-mark hold package
Snap 和 Flatpak
Snap(Canonical)
# 安装 snapd
sudo apt install snapd
# 查找 snap 应用
snap find chrome
# 安装 snap
sudo snap install chromium
sudo snap install chromium --classic # 经典模式
# 列出已安装的 snap
snap list
# 更新 snap
sudo snap refresh chromium
# 删除 snap
sudo snap remove chromium
# 查看 snap 信息
snap info chromium
Flatpak(通用)
# 安装 flatpak
sudo apt install flatpak
# 添加 Flathub 仓库
flatpak remote-add --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo
# 查找应用
flatpak search spotify
# 安装应用
flatpak install flathub com.spotify.Client
# 列出已安装的应用
flatpak list
# 更新应用
flatpak update com.spotify.Client
# 删除应用
flatpak uninstall com.spotify.Client
# 运行应用
flatpak run com.spotify.Client
AppImage
# 下载 AppImage 文件
wget https://example.com/app.AppImage
# 赋予执行权限
chmod +x app.AppImage
# 运行
./app.AppImage
# 集成到系统(可选)
./app.AppImage --appimage-extract
./squashfs-root/AppRun
# 或使用 AppImageLauncher
sudo apt install appimagelauncher
源码编译
基本流程
# 1. 安装编译工具
sudo apt install build-essential
# 2. 下载源代码
wget https://example.com/source.tar.gz
tar -xf source.tar.gz
cd source
# 3. 配置
./configure --prefix=/usr/local
# 4. 编译
make
# 5. 安装
sudo make install
# 6. 卸载
sudo make uninstall
checkinstall(创建包)
# 安装 checkinstall
sudo apt install checkinstall
# 使用 checkinstall 替代 make install
make
sudo checkinstall
# 这会创建一个 .deb 包,便于管理
实用技巧
查找命令对应的包
# Debian/Ubuntu
apt search command_name
apt-file search command_name # 需要更新数据库:sudo apt update
# Red Hat/CentOS
dnf provides command_name
yum whatprovides "*bin/command"
# Arch
pacman -Fy /usr/bin/command # 需要更新数据库:sudo pacman -Fy
pacman -F command
包管理器快捷方式
# APT
alias apt-upgrade='sudo apt update && sudo apt upgrade -y'
alias apt-install='sudo apt install -y'
alias apt-search='apt search'
# DNF
alias dnf-upgrade='sudo dnf upgrade -y'
alias dnf-install='sudo dnf install -y'
# Pacman
alias pac-upgrade='sudo pacman -Syu'
alias pac-install='sudo pacman -S'
alias pac-remove='sudo pacman -Rns'
清理系统
# Debian/Ubuntu
sudo apt autoremove # 删除不需要的依赖
sudo apt autoclean # 清理旧包文件
sudo apt clean # 清理所有包文件
# Red Hat/CentOS
sudo dnf autoremove
sudo dnf clean all
# Arch
sudo pacman -Sc # 清理未安装的包文件
sudo pacman -Scc # 清理所有缓存
总结
软件包管理是 Linux 系统管理的日常任务。通过这篇文章,我们学习了:
核心技能
- APT:Debian/Ubuntu 系统的包管理
- DNF:Red Hat/Fedora 系统的包管理
- Pacman:Arch Linux 的包管理
- 通用格式:Snap、Flatpak、AppImage
- 源码编译:终极灵活性
最佳实践
- 定期更新:保持系统和软件最新
- 使用官方源:安全可靠
- 理解依赖:避免冲突
- 清理无用包:节省空间
- 备份配置:升级前备份重要配置
“包管理器是 Linux 最大的优势之一,它让软件安装变得简单。” — Linus Torvalds
掌握包管理器,让你的 Linux 之旅更加顺畅!
← 返回系列概述: Linux 概述:从 Unix 到开源革命
参考资源: