Linux 软件包管理完全指南(APT、DNF 与源码编译)

Linux 软件包管理完全指南(APT、DNF 与源码编译)

Someone Lv5

前言

软件包管理是 Linux 系统管理中最基础也最重要的技能之一。无论是安装服务、更新系统还是排查依赖问题,都离不开包管理工具。本文将从 Debian 系(APT)和 Red Hat 系(DNF)两大主流包管理体系入手,结合源码编译安装,全方位讲解 Linux 软件包管理。

一、包管理系统概述

Linux 发行版主要分为两大包管理生态:

特性Debian/Ubuntu(APT)RHEL/Fedora(DNF)
包格式.deb.rpm
底层工具dpkgrpm
高级工具apt / apt-get / aptitudednf / yum
软件源格式/etc/apt/sources.list/etc/yum.repos.d/*.repo
依赖解决自动(apt 内置)自动(DNF 内置)
默认发行版Ubuntu、Debian、Kali、Linux MintFedora、RHEL、CentOS、Rocky Linux

两者的核心逻辑一致:配置软件源 → 更新索引 → 搜索/安装/升级/卸载,只是命令和配置文件格式不同。

二、APT 包管理(Debian/Ubuntu)

2.1 软件源配置

APT 的软件源配置文件位于 /etc/apt/sources.list/etc/apt/sources.list.d/ 目录下,每行格式为:

1
deb [arch=amd64] http://mirrors.ubuntu.com/mirrors.txt jammy main restricted universe multiverse

各字段含义:

  • deb:二进制包源;deb-src 为源码包源
  • [arch=amd64]:可选架构限制
  • URI:软件源地址(建议使用国内镜像加速)
  • jammy:发行版代号(Ubuntu 22.04)
  • 组件列表:main(官方支持)、universe(社区维护)、restricted(专有驱动)、multiverse(非自由软件)

2.2 常用 APT 命令

操作命令说明
更新索引apt update从软件源拉取最新包列表
升级所有包apt upgrade安全升级(不删除或新安装包)
全面升级apt full-upgrade可能删除或安装新依赖
安装包apt install nginx自动解决依赖
卸载包apt remove nginx保留配置文件
彻底卸载apt purge nginx同时删除配置文件
搜索包apt search keyword从索引中搜索
查看包信息apt show nginx显示版本、依赖、描述等
清理缓存apt autoremove删除孤立的依赖包

2.3 实战:搭配国内镜像加速

以 Ubuntu 22.04 为例,替换为清华镜像源:

1
2
3
4
5
6
7
8
9
# 备份原配置
sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak

# 替换为清华源
sudo sed -i 's@http://archive.ubuntu.com/ubuntu@https://mirrors.tuna.tsinghua.edu.cn/ubuntu@g' /etc/apt/sources.list
sudo sed -i 's@http://security.ubuntu.com/ubuntu@https://mirrors.tuna.tsinghua.edu.cn/ubuntu@g' /etc/apt/sources.list

# 更新索引
sudo apt update

2.4 进阶操作

锁定某个软件包版本:

1
2
3
4
5
6
7
8
# 锁定 nginx 的当前版本,禁止自动升级
sudo apt-mark hold nginx

# 解除锁定
sudo apt-mark unhold nginx

# 查看所有锁定的包
apt-mark showhold

降级某个软件包:

1
2
3
4
5
# 先查看可用的历史版本
apt-cache policy nginx

# 指定版本安装(实现降级)
sudo apt install nginx=1.18.0-6ubuntu14.4

三、DNF 包管理(Fedora/RHEL)

3.1 软件源配置

DNF 的 .repo 文件存放在 /etc/yum.repos.d/ 目录下,格式示例:

1
2
3
4
5
6
[epel]
name=Extra Packages for Enterprise Linux $releasever - $basearch
baseurl=https://mirrors.tuna.tsinghua.edu.cn/epel/$releasever/Everything/$basearch
enabled=1
gpgcheck=1
gpgkey=https://mirrors.tuna.tsinghua.edu.cn/epel/RPM-GPG-KEY-EPEL-$releasever

各字段含义:

  • [epel]:源标识符,必须唯一
  • name:描述名称
  • baseurl:软件源地址
  • enabled=1:启用该源
  • gpgcheck=1:启用 GPG 签名验证
  • gpgkey:GPG 公钥地址

3.2 常用 DNF 命令

操作命令说明
更新索引dnf makecache生成包缓存
升级所有包dnf upgrade全面升级
安装包dnf install nginx自动解决依赖
卸载包dnf remove nginx删除包及其依赖
搜索包dnf search keyword搜索包名和描述
查看包信息dnf info nginx详细信息
查看历史dnf history查看事务记录
撤销操作dnf history undo ID回滚指定事务

3.3 EPEL 扩展源

EPEL(Extra Packages for Enterprise Linux)提供了 RHEL 官方源之外的大量高质量软件包,是 RHEL/CentOS/Rocky Linux 用户的必备源:

1
2
3
4
5
# 安装 EPEL 源
sudo dnf install epel-release

# 如需安装其他扩展源(如 Remi 用于 PHP)
sudo dnf install https://rpms.remirepo.net/enterprise/remi-release-9.rpm

3.4 组包安装

DNF 支持按功能组批量安装,特别适合初始化新系统:

1
2
3
4
5
6
7
8
# 列出所有可用组
dnf group list

# 安装开发工具组
sudo dnf groupinstall "Development Tools"

# 安装服务器基础
sudo dnf groupinstall "Web Server"

四、底层包工具

4.1 dpkg(Debian 系底层)

当 APT 无法满足需求时,直接使用 dpkg 处理 .deb 文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 安装本地 .deb 文件(需手动处理依赖)
sudo dpkg -i package.deb

# 卸载包
sudo dpkg -r package_name

# 查看已安装的包
dpkg -l | grep nginx

# 查看某个文件属于哪个包
dpkg -S /etc/nginx/nginx.conf

# 提取 .deb 包内容(不安装)
dpkg-deb -x package.deb ./extract_dir

修复依赖断裂:

1
2
# dpkg 安装后如果出现依赖问题,用 APT 修复
sudo apt --fix-broken install

4.2 rpm(Red Hat 系底层)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 安装本地 .rpm 文件
sudo rpm -ivh package.rpm # i=install, v=verbose, h=hash进度条

# 升级
sudo rpm -Uvh package.rpm # U=upgrade

# 卸载
sudo rpm -e package_name

# 查询已安装的包
rpm -qa | grep nginx

# 查看某个文件属于哪个包
rpm -qf /etc/nginx/nginx.conf

# 查看包信息
rpm -qi package_name

五、源码编译安装

当包管理器中找不到最新版本或需要自定义编译参数时,就需要源码编译。

5.1 编译流程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 以安装最新版 Nginx 为例:
# 1. 安装编译工具链
# Debian/Ubuntu
sudo apt install build-essential libpcre3-dev zlib1g-dev libssl-dev

# Fedora/RHEL
sudo dnf groupinstall "Development Tools"
sudo dnf install pcre-devel zlib-devel openssl-devel

# 2. 下载源码
wget https://nginx.org/download/nginx-1.26.0.tar.gz
tar -xzf nginx-1.26.0.tar.gz
cd nginx-1.26.0

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

# 4. 编译和安装
make -j$(nproc)
sudo make install

5.2 常用配置选项含义

选项说明
--prefix=PATH安装路径(默认 /usr/local)
--with-xxx_module启用某模块(默认不启用的模块需显式指定)
--without-xxx_module禁用某默认启用的模块
--enable-shared编译为共享库(部分项目支持)
CC=gcc-mp-12指定编译器(通过环境变量 CC)

5.3 编译后管理

源码编译安装的软件不会出现在包管理器列表中,需要手动管理:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# 查看编译时的配置(多数软件支持)
/usr/local/nginx/sbin/nginx -V

# 创建软链接到 PATH
sudo ln -s /usr/local/nginx/sbin/nginx /usr/local/bin/nginx

# 创建 systemd 单元文件实现开机自启
sudo tee /etc/systemd/system/nginx.service << 'EOF'
[Unit]
Description=Nginx (compiled from source)
After=network.target

[Service]
Type=forking
ExecStartPre=/usr/local/nginx/sbin/nginx -t
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/usr/local/nginx/sbin/nginx -s stop
PIDFile=/usr/local/nginx/logs/nginx.pid
Restart=always

[Install]
WantedBy=multi-user.target
EOF

sudo systemctl daemon-reload
sudo systemctl enable --now nginx

六、Snap 与 Flatpak

除了传统包管理和源码编译,现代 Linux 还引入了沙盒式包管理器:

Snap(Ubuntu 原生):

1
2
3
4
5
6
7
8
9
10
11
# 安装
sudo snap install lxd

# 查看安装的应用
snap list

# 升级
sudo snap refresh

# 管理版本通道
sudo snap switch --channel=latest/stable lxd

Flatpak(跨发行版):

1
2
3
4
5
6
7
8
9
10
11
# 安装 Flatpak(以 Debian/Ubuntu 为例)
sudo apt install flatpak

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

# 安装应用
flatpak install flathub org.gimp.GIMP

# 运行
flatpak run org.gimp.GIMP

七、包管理最佳实践

  1. 优先使用包管理器:尽量使用 APT/DNF 安装,避免”手动编译依赖地狱”
  2. 保持系统更新:定期执行 apt upgradednf upgrade 修复安全漏洞
  3. 生产环境锁定版本:使用 apt-mark hold/etc/yum.conf 中的 exclude 选项
  4. 善用国内镜像:配置清华、阿里云等国内镜像源可大幅提升下载速度
  5. 定期清理apt autoremove / dnf autoremove 清理无用依赖
  6. 回滚策略:DNF 的 history undo 比 APT 更强大,升级前可用 dnf history list 查看历史
  7. 源码编译隔离:源码编译的软件安装在 /opt//usr/local/,与包管理器软件隔离
  8. 快照保护:重要系统升级前用 timeshift 或 LVM 快照备份

八、常见问题排查

问题原因解决方案
E: Unable to locate package软件源索引未更新sudo apt update
E: Package has no installation candidate软件源中没有该包添加对应的 PPA 或第三方源
dpkg: dependency problems依赖未满足sudo apt --fix-broken install
Could not resolve host网络问题或 DNS检查网络连通性和 DNS 配置
Error: GPG check FAILEDGPG 密钥缺失或过期导入对应公钥:rpm --import KEY_URL
/var/cache/apt/archives/ 空间不足APT 缓存积累过多sudo apt clean 清除所有缓存
make: command not found未安装编译工具链sudo apt install build-essential

九、配置文件速查

1
2
3
4
5
6
7
8
9
10
11
12
# APT 相关配置文件
/etc/apt/sources.list # 软件源主配置
/etc/apt/sources.list.d/ # 第三方软件源目录
/etc/apt/apt.conf.d/ # APT 选项配置目录(代理、超时等)
/var/cache/apt/archives/ # 已下载的 .deb 包缓存
/var/lib/dpkg/ # dpkg 数据库目录

# DNF/YUM 相关配置
/etc/dnf/dnf.conf # DNF 全局配置
/etc/yum.repos.d/ # 软件源配置目录
/var/cache/dnf/ # DNF 缓存目录
/var/lib/rpm/ # RPM 数据库目录

总结

掌握 Linux 软件包管理是运维工作的基本功。从 APT 和 DNF 的高效使用,到 dpkg 和 rpm 的底层操作,再到源码编译和现代沙盒式包管理(Snap/Flatpak),每种方式都有其适用场景。日常运维优先使用包管理器,特殊需求选择源码编译,新式桌面应用考虑 Flatpak/Snap——针对不同场景选择最合适的方案,才能让 Linux 系统的软件管理既高效又安全。

本文由AI辅助生成,内容仅供参考

  • 标题: Linux 软件包管理完全指南(APT、DNF 与源码编译)
  • 作者: Someone
  • 创建于 : 2026-06-10 09:31:00
  • 更新于 : 2026-06-18 08:39:57
  • 链接: https://demo-blog.qusite.cn/2026-06-10-linux-package-management-guide/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。