1.4.1 包管理体系概览:RPM/DEB与包元数据
包管理体系概览:RPM/DEB与包元数据#
RPM 与 DEB 是 Linux 两大主流包管理体系,分别服务于 RHEL/CentOS/Rocky/Alma 等发行版与 Debian/Ubuntu 系列。理解包管理体系与包元数据结构,是后续仓库配置、依赖排查与安全更新的基础。
原理草图:包与元数据流转
RPM 体系要点
- 代表发行版:RHEL/CentOS/Rocky/Alma、SUSE
- 包格式:.rpm
- 工具链:rpm(底层),yum/dnf(高层)
- 元数据入口:包头(依赖、脚本、文件清单、签名)
DEB 体系要点
- 代表发行版:Debian、Ubuntu
- 包格式:.deb
- 工具链:dpkg(底层),apt/apt-get(高层)
- 元数据入口:control(依赖、脚本、文件清单)
包元数据查看与命令示例#
示例 1:查看已安装包的元数据(RPM)
# 查看包信息(Name/Version/Release/Arch/InstallTime)
rpm -qi bash
# 查看包包含的文件
rpm -ql bash
# 查看包安装/卸载脚本
rpm -q --scripts bash
# 解释:
# -qi: query info
# -ql: query list files
# --scripts: 显示 %pre/%post/%preun/%postun
示例 2:查看包文件的元数据(RPM,未安装)
# 对本地包文件查询元数据
rpm -qpi /tmp/nginx-1.24.0-1.el8.x86_64.rpm
rpm -qpl /tmp/nginx-1.24.0-1.el8.x86_64.rpm
示例 3:查看已安装包的元数据(DEB)
# 查看包控制信息
dpkg -s bash
# 查看包文件列表
dpkg -L bash
# 解释:
# -s: status/metadata
# -L: list files
示例 4:查看包文件的元数据(DEB,未安装)
# 查看 control 信息
dpkg-deb -I /tmp/nginx_1.24.0-1_amd64.deb
# 查看包内容文件清单
dpkg-deb -c /tmp/nginx_1.24.0-1_amd64.deb
安装示例(含说明与预期效果)#
RPM 安装(低层)
# 安装本地 RPM 包
sudo rpm -ivh /tmp/nginx-1.24.0-1.el8.x86_64.rpm
# 预期效果:输出 Installing... 并写入数据库
# -i: install
# -v: verbose
# -h: progress bar
DEB 安装(低层)
# 安装本地 DEB 包
sudo dpkg -i /tmp/nginx_1.24.0-1_amd64.deb
# 预期效果:配置脚本执行完成,提示 Setting up ...
实际生产更推荐使用高层工具(yum/dnf/apt)以自动处理依赖。
常见问题与排错#
问题 1:依赖缺失(RPM)
# 现象:error: Failed dependencies
# 解决:用 yum/dnf 自动补齐依赖
sudo dnf install /tmp/nginx-1.24.0-1.el8.x86_64.rpm
问题 2:依赖缺失(DEB)
# 现象:dpkg: dependency problems
# 解决:使用 apt 修复依赖
sudo apt-get -f install
问题 3:包文件损坏/签名异常
# RPM 校验包完整性
rpm -K /tmp/nginx-1.24.0-1.el8.x86_64.rpm
# DEB 校验包结构
dpkg-deb -I /tmp/nginx_1.24.0-1_amd64.deb
关键字段速查(命令可验证)#
- Name/Version/Release(Revision)/Arch:
rpm -qi/dpkg -s - Requires/Depends:
rpm -qi/apt-cache depends <pkg> - Scripts:
rpm -q --scripts//var/lib/dpkg/info/<pkg>.postinst - Files:
rpm -ql/dpkg -L
小练习#
- 使用
rpm -q --scripts或/var/lib/dpkg/info/*.postinst找出某包的安装脚本,并解释脚本可能做了什么。 - 下载一个
.rpm与.deb包,分别用-qpi/-qpl与dpkg-deb -I/-c对比元数据字段差异。 - 人为制造一次依赖缺失(如安装本地包),用
dnf/apt-get -f install修复并记录输出。 - 写出你所在发行版中“同一功能”但包名不同的示例(如
httpdvsapache2)。