RPM (RPM Package Manager) 是 Linux 軟體分發的基石。理解其數據庫機制 (/var/lib/rpm)、依賴關係模型、腳本觸發點、檔案屬性驗證,是系統管理員從「會用命令」進階到「掌控系統狀態」的關鍵。
rpm --initdb # 初始化空數據庫 (首次/損壞後)
rpm --rebuilddb # 重建索引 (從 Header 重建, 耗時較長, 解決 "rpmdb: BDB" 錯誤)
# 現代 DNF 會自動管理, 手動操作極少見
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 # 變更日誌
rpm -qp # 基本信息
rpm -qpl # 檔案列表
rpm -qpi # 詳細信息
rpm -qpR # 依賴關係
rpm -qp --scripts # 腳本內容
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 (不跑腳本) | 協載 |
dnf install ./pkg.rpm 自動從倉庫拉取依賴。rpm -qpR pkg.rpm 列出缺失 → dnf provides "libxxx.so.*" 找包 → 安裝依賴 → 再裝主包。rpm2cpio pkg.rpm | cpio -idmv 解壓到當前目錄,手動部署二進制/配置。%_topdir)rpmdev-setuptree
# ~/rpmbuild/
# ├── BUILD/ # 編譯臨時目錄
# ├── RPMS/ # 產出的二進制 RPM (按架構分子目錄)
# ├── SOURCES/ # 源碼壓縮包、補丁文件
# ├── SPECS/ # .spec 文件 (核心配方)
# └── SRPMS/ # 產出的源碼 RPM
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 --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 生態系統。