Featured image of post 软件包管理:Linux 的应用商店

软件包管理:Linux 的应用商店

深入理解 Linux 软件包管理系统,掌握 APT、DNF、Pacman 等包管理器的使用技巧

软件包管理: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 系统管理的日常任务。通过这篇文章,我们学习了:

核心技能

  1. APT:Debian/Ubuntu 系统的包管理
  2. DNF:Red Hat/Fedora 系统的包管理
  3. Pacman:Arch Linux 的包管理
  4. 通用格式:Snap、Flatpak、AppImage
  5. 源码编译:终极灵活性

最佳实践

  1. 定期更新:保持系统和软件最新
  2. 使用官方源:安全可靠
  3. 理解依赖:避免冲突
  4. 清理无用包:节省空间
  5. 备份配置:升级前备份重要配置

“包管理器是 Linux 最大的优势之一,它让软件安装变得简单。” — Linus Torvalds

掌握包管理器,让你的 Linux 之旅更加顺畅!


← 返回系列概述: Linux 概述:从 Unix 到开源革命


参考资源

A winner is just a loser who tried one more time.
Robust AI
使用 Hugo 构建
主题 StackJimmy 设计