萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 作業系統 >  >> Linux 教學

RPM 包管理深度實戰:查詢、安裝、驗證、打包、數據庫維護與依賴地獄突圍

RPM 核心價值

RPM (RPM Package Manager) 是 Linux 軟體分發的基石。理解其數據庫機制 (/var/lib/rpm)、依賴關係模型、腳本觸發點、檔案屬性驗證,是系統管理員從「會用命令」進階到「掌控系統狀態」的關鍵。

一、數據庫初始化與修復 (地基)

rpm --initdb      # 初始化空數據庫 (首次/損壞後)
rpm --rebuilddb   # 重建索引 (從 Header 重建, 耗時較長, 解決 "rpmdb: BDB" 錯誤)
# 現代 DNF 會自動管理, 手動操作極少見

二、查詢系統 (資訊蒐集) — 最常用、最安全

1. 已安裝包查詢

rpm -qa                    # 列出所有 (配合 grep 篩選)
rpm -qa --last             # 按安裝時間倒序
rpm -q            # 確認是否安裝 + 版本
rpm -qi           # 詳細元數據 (描述、廠商、安裝時間、大小、簽名)
rpm -ql           # 檔案列表 (關鍵: 知曉二進制/配置/文檔位置)
rpm -qc           # 僅列出配置檔
rpm -qd           # 僅列出文檔檔案
rpm -qf /path/to/file      # 反向查詢: 檔案屬於哪個包 (神器)
rpm -qR           # 依賴關係 (Requires: 庫/命令/包)
rpm -q --provides  # 提供能力 (Provides: 虛擬包名/庫 soname)
rpm -q --scripts  # 查看安裝/卸載腳本內容 (%pre/%post/%preun/%postun)
rpm -q --changelog  # 變更日誌

2. 未安裝包文件查詢 (.rpm 文件)

rpm -qp          # 基本信息
rpm -qpl         # 檔案列表
rpm -qpi         # 詳細信息
rpm -qpR         # 依賴關係
rpm -qp --scripts  # 腳本內容

3. 驗證已安裝包完整性 (安全審計核心)

rpm -V            # 驗證單個包
rpm -Va                    # 驗證所有包 (輸出解讀見下)
# 輸出碼位含義 (8 位字符):
# S 文件大小異常  M 模式/權限異常  5 MD5 摘要異常
# D 設備主/次號異常 L 符號鏈接路徑異常 U 屬主異常 G 群組異常 T 修改時間異常
# c 配置文件  d 文檔文件  g 鬼文件 (不屬於任何包)  l 授權文件  r 讀我文件
# 範例: .M....  c /etc/httpd/conf/httpd.conf  -> 權限被修改過的配置文件
# 關鍵: 關注非 c/d/g/l/r 類型的 S/M/5/D/U/G 異常

三、安裝、升級、降級、移除 (狀態變更)

操作命令關鍵參數適用場景
安裝rpm -ivh pkg.rpm--test (演練), --prefix (重定向安裝路徑, 需包支援), --excludedocs全新安裝
升級rpm -Uvh pkg.rpm--oldpackage (允許降級)版本升級, 不存在則安裝
降級rpm -Uvh --oldpackage pkg.rpm回滾版本
重裝rpm -ivh --replacepkgs pkg.rpm修復損壞檔案
移除rpm -e pkg--nodeps (忽略依賴, 危險), --test, --noscripts (不跑腳本)協載

依賴地獄突圍策略 (按推薦順序)

  1. 改用 DNF/YUM:dnf install ./pkg.rpm 自動從倉庫拉取依賴。
  2. 手動補齊依賴:rpm -qpR pkg.rpm 列出缺失 → dnf provides "libxxx.so.*" 找包 → 安裝依賴 → 再裝主包。
  3. 提取檔案不安裝:rpm2cpio pkg.rpm | cpio -idmv 解壓到當前目錄,手動部署二進制/配置。
  4. 容器隔離:打包成 Docker Image 運行,宿主機不污染。
  5. 最後手段 --nodeps --force:僅限測試環境/臨時驗證/確知依賴已滿足。生產環境嚴禁!

四、RPM 打包入門 (開發者/運維自構建)

目錄結構 (~/.rpmmacros 定義 %_topdir)

rpmdev-setuptree
# ~/rpmbuild/
# ├── BUILD/      # 編譯臨時目錄
# ├── RPMS/       # 產出的二進制 RPM (按架構分子目錄)
# ├── SOURCES/    # 源碼壓縮包、補丁文件
# ├── SPECS/      # .spec 文件 (核心配方)
# └── SRPMS/      # 產出的源碼 RPM

核心 .spec 文件結構

Name:           myapp
Version:        1.2.3
Release:        1%{?dist}
Summary:        My Awesome Application
License:        MIT
URL:            https://github.com/me/myapp
Source0:        %{name}-%{version}.tar.gz
# Patch0:       fix-segfault.patch
BuildRequires:  gcc, make, openssl-devel, pkgconfig
Requires:       openssl-libs, libcrypto.so.10()(64bit)
%description
Long description...

%prep
%autosetup -p1  # 解壓 + 應用所有 Patch

%build
%configure      # ./configure --prefix=%{_prefix} ...
make %{?_smp_mflags}  # 多核編譯

%install
rm -rf $RPM_BUILD_ROOT
make install DESTDIR=$RPM_BUILD_ROOT

%files
%license LICENSE
%doc README.md
%{_bindir}/myapp
%{_sysconfdir}/myapp/
%config(noreplace) %{_sysconfdir}/myapp/config.conf  # 配置文件標記, 升級不覆蓋用戶修改

%changelog
* Mon Jan 01 2024 Name  - 1.2.3-1
- Initial package

構建命令

rpmbuild -ba ~/rpmbuild/SPECS/myapp.spec  # 構建二進制 + 源碼 RPM
rpmbuild -bb ~/rpmbuild/SPECS/myapp.spec  # 僅構建二進制 RPM
rpmbuild -bs ~/rpmbuild/SPECS/myapp.spec  # 僅構建源碼 RPM (SRPM)

# 模擬構建 (檢查 spec 語法/依賴, 不產出文件)
rpmbuild --nobuild -ba ~/rpmbuild/SPECS/myapp.spec

五、GPG 簽名與驗證 (供應鏈安全)

# 產生密鑰對 (一次)
gpg --gen-key
# 導出公鑰分發
gpg --export -a 'Your Name' > RPM-GPG-KEY-MYREPO
# 導入公鑰到 RPM 數據庫
rpm --import RPM-GPG-KEY-MYREPO
# 簽名 RPM
rpm --addsign /path/to/*.rpm
# 驗證簽名
rpm -K /path/to/pkg.rpm
# 輸出: Header V3 RSA/SHA256 Signature, key ID xxx: OK
#       Header SHA256 digest: OK
#       V3 RSA/SHA256 Signature, key ID xxx: OK
#       MD5 digest: OK

總結

RPM 不僅是安裝工具,更是軟體資產管理數據庫。精通 -q 查詢維度、-V 完整性審計、--scripts 行為審查、rpmbuild 自構建、--addsign 供應鏈信任鏈,才能真正駕馭 RPM 生態系統。

copyright © 萬盛學電腦網 all rights reserved