RPM(RPM Package Manager)雖源自 Red Hat,但其開放的封裝格式已成為 Linux 軟體分發的事實標準。掌握 RPM 打包技能,不僅能將自編譯程式標準化部署,更能統一管理依賴關係、版本升級與檔案驗證。本文以 rp-pppoe-3.10 為例,完整演示從原始碼到生成 .rpm、.src.rpm 的標準化流程,並涵蓋常見錯誤排除與安裝驗證。
確保系統安裝 rpm-build、rpmdevtools 等工具,並建立標準目錄樹(rpmdev-setuptree 可自動建立):
~/rpmbuild/
├── BUILD/ # 編譯暫存目錄
├── RPMS/ # 輸出二進制 RPM(按架構分子目錄)
├── SOURCES/ # 原始碼 tarball 與 .spec 檔
├── SPECS/ # .spec 規範檔
├── SRPMS/ # 輸出原始碼 RPM
└── BUILDROOT/ # 虛擬安裝根目錄
# 下載原始碼
wget https://example.com/rp-pppoe-3.10.tar.gz
# 解壓並取出 spec 檔
tar zxvf rp-pppoe-3.10.tar.gz
cp rp-pppoe-3.10/rp-pppoe.spec ~/rpmbuild/SPECS/
cp rp-pppoe-3.10.tar.gz ~/rpmbuild/SOURCES/
cd ~/rpmbuild/SPECS/
# 僅產生二進制 RPM
rpmbuild -bb rp-pppoe.spec
# 同時產生二進制與原始碼 RPM
rpmbuild -ba rp-pppoe.spec
成功後,二進制 RPM 位於 ~/rpmbuild/RPMS/x86_64/,原始碼 RPM 位於 ~/rpmbuild/SRPMS/。
ls -lh ~/rpmbuild/RPMS/x86_64/
# rp-pppoe-3.10-1.x86_64.rpm
# rp-pppoe-debuginfo-3.10-1.x86_64.rpm
# rp-pppoe-gui-3.10-1.x86_64.rpm
rpm -qa rp-pppoe # 查詢已安裝版本
rpm -e rp-pppoe # 移除舊套件
cd ~/rpmbuild/RPMS/x86_64/
rpm -ivh rp-pppoe-3.10-1.x86_64.rpm
# 輸出:Preparing... ########################################### [100%]
# 1:rp-pppoe ########################################### [100%]
rpm -qa rp-pppoe # 確認版本
ls /etc/ppp/pppoe-server-options # 關鍵配置檔是否存在
原因:編譯安裝產生的檔案未在 %files 區段宣告,導致 RPM 檢查失敗。
解法(兩種擇一):
%files 區段補上遺漏檔案路徑(推薦,符合規範)。/usr/lib/rpm/macros,註釋掉%__check_files /usr/lib/rpm/check-files %{buildroot}rpmsign --addsign *.rpm 配合 GPG 金鑰,確保套件來源可信。Requires/BuildRequires 欄位配合 rpmbuild 自動解析共享庫依賴(find-requires)。Patch0: fix-xxx.patch + %patch0 -p1 統一管理修補檔。%{name}、%{version}、%{_bindir} 等宏提高可移植性。| 操作 | 命令 |
|---|---|
| 建立建構樹 | rpmdev-setuptree |
| 僅建構二進制 RPM | rpmbuild -bb SPECS/xxx.spec |
| 建構二進制+原始碼 RPM | rpmbuild -ba SPECS/xxx.spec |
| 安裝/升級 | rpm -ivh / -Uvh pkg.rpm |
| 查詢套件資訊 | rpm -qip / -qlp pkg.rpm |
| 驗證已安裝套件 | rpm -V pkgname |
| 解包 RPM 內容 | rpm2cpio pkg.rpm | cpio -idmv |
掌握 RPM 打包,意味著你擁有了將任意開源軟體、內部工具、腳本標準化為「可版本、可依賴、可驗證、可回滾」交付物的能力——這正是 Linux 運維自動化與基礎設施即代碼的基石之一。