Linux之rpm本地打包

Linux之rpm本地打包

rpm簡介

  • RPM是RPM Package Manager(RPM軟件包包管理器)的縮寫,這一文件格式起源於RedHat操作系統,後來逐漸成爲行業裏面的標準,目前廣泛應用於RHEL、Centos、Fedora等各種linux發行版中。
  • rpm在linux操作系統中的作用類似於Windows操作系統裏面的”添加/刪除程序”

rpm相關命令

安裝命令

linux安裝包的包文件分兩種:
二進制包(Binary)以及源代碼包(Source)兩種。二進制包可以直接安裝在計算機中,而源代碼包將會由RPM自動編譯。源代碼包(Source)經常以.src.rpm作爲文件後綴名。

rpm -ivh ***.rpm: 安裝軟件(並且顯示安裝進度 --install--verbose--hash)
rpm -Uvh ***.rpm: 升級軟件(--Update)
rpm -e: 卸載軟件
rpm -q [軟件名稱]: 查詢程序是否安裝
rpm -qa: 查詢已經安裝的所有軟件(Query All)
rpm -qi [軟件名稱]: 列出該軟件的詳細信息
rpm -qf [指定文件名]: 查找指定文件屬於哪個RPM軟件包(Query Files)
rpm -qc [軟件名稱]: 列出該軟件的所有文件
rpm -qpi [軟件名稱]: 列出RPM軟件包的描述信息(Query Packages install package(s))
rpm -qpl [軟件名稱]: 列出該軟件的所有文件(Query Packages list)
rpm -qRp [軟件名稱]: 列出該軟件的依賴(Query Rely Packages)
rpm -Va [軟件名稱]: 校驗所有的RPM軟件包,查找丟失的文件(View List) 

更多的選項使用, 請查閱man rpm

rpm命令的常用參數(Install/Upgrade/Erase options:)

-i, --install install package(s)
-v, --verbose provide more detailed output
-h, --hash print hash marks as package installs (good with -v)
-e, --erase erase (uninstall) package
-U, --upgrade=<packagefile>+ upgrade package(s)
--replacepkge 無論軟件包是否已被安裝,都強行安裝軟件包
--test 安裝測試,並不實際安裝
--nodeps 忽略軟件包的依賴關係強行安裝
--force 忽略軟件包以及文件的衝突

Query options (with -q or --query):
-a, --all query/verify all packages
-p, --package query/verify a package file
-l, --list list files in package
-d, --docfiles list all documentation files
-f, --file query/verify package(s) owning file

打包命令 rpmbuild

  • rpmbuild是rpm最新的打包工具,可以製作和發佈rpm格式的源碼包或者二進制包。主要依賴本地源碼文件和spec說明文件,來進行安裝構建。

安裝rpmbuild

centos上:yum install rpm-build -y
ubuntu上:sudo apt-get install rpmbuild -y

rpmbuild常用命令

rpmbuild [options] [spec文檔|tarbal包|源碼包]
1. -bb 只建立二進制包(常用)
2. -ba 建立源碼與二進制包(常用)
3. -bi 執行spec中%pre, %build與%install(準備, 編譯並安裝)
4. 一些不常用options:-bl, -bc, -bp, -tp, -tc, -ti, -ta, -tb, -ts

rpmbuild打包一般步驟

  • 根據rpmbuild標準,創建打包的目錄結構
  • 將源碼和輔助文件放到指定目錄
  • 編寫spec文件,放到指定目錄
  • 根據需要構建rpm,或者rpmsrpm等。

rpmbuild構建目錄結構

文件名 類型 說明
SPECS 目錄 包含rpm的xxx.spec文件(打包的描述文件)
SOURCES 目錄 包含源碼包(如.tar包)和所有patch補丁、service啓動文件等
BUILD 目錄 源碼包被解壓至此, 並在該目錄的子目錄完成編譯
BUILDROOT 目錄 存放編譯後的文件的臨時目錄(保存%install階段安裝的文件)
RPMS 目錄 經過編譯成功後, 打包文件放在這個目錄, 包含i386、i686、noarch等次級目錄
SRPMS 目錄 包含.src.rpm的SPRM包(通常用於審覈和升級軟件包)

rpmbuild內置變量

rpmbuild --showrc 可查看內置的變量

常用的幾個變量:

$RPM_BUILD_DIR /$HOME/rpmbuild/BUILD
$RPM_BUILD_ROOT /$HOME/rpmbuild/BUILDROOT
%{_sysconfigdir} /etc
%{_sbindir} /usr/sbin
%{_bindir} /usr/bin
%{_prefix} /usr
%{_localstatedir} /var
更多的可以查看 --showrc

rpmbuild spec規範說明

Summary: 軟件包的內容概要描述
Name: 軟件包的名稱(spec文件名與其一致)
Version: 軟件的實際版本號,具體和源碼包一致
Release: 軟件包的發佈實際版本號
Url: 軟件的主頁
License: 軟件授權方式(GPL等)
Group: 軟件分組,如(Application/System)
Source: 軟件的來源
Patch: 補丁patch file依賴的軟件,安裝的時候需要檢查的
BuildRoot: 安裝或者編譯時使用的"虛擬目錄",一般默認 
BuildRequires: 編譯過程中需要的軟件
Requires: 依賴的軟件, 安裝的時候需要檢查的
Packager: 軟件的打包者
Vendor: 軟件發行商或者打包組織信息,如(Apache Software Foundation)

%description: 軟件包描述
%prep: 編譯前預處理。如: 1.打補丁; 2. 解壓源碼等
%setup: 解壓源碼(一般是位於%prep下的macro, 自動解壓源碼)
%build: 編譯
%install: 安裝, 即把一些可執行文件和配置複製到目標目錄中。
%clean: 清理一些暫存文件
%files: 定義哪些文件或者目錄會放入rpm中
%pre: rpm安裝前執行的動作
%post: rpm安裝後執行的動作
%preun: 卸載前執行腳本程序(preun)開始執行
%postun: 卸載後執行腳本程序(postun)開始執行

rpmbuild spec 示例

%global pypi_name aodh
%{!?upstream_version: %global upstream_version %{version}%{?milestone}}
Name:       openstack-aodh
Version:    2.0.0
Release:    %{es_versions}%{?dist}
Summary:    OpenStack Telemetry Alarming
License:    ASL 2.0
URL:        https://github.com/openstack/aodh.git
BuildArch:  noarch
Source0:    http://tarballs.openstack.org/%{pypi_name}/%{pypi_name}-%{version}.tar.gz

...
%description
Aodh is the alarm engine of the Ceilometer project.

%prep
%setup -q -n %{pypi_name}-%{upstream_version}

%build
%{__python2} setup.py build

%install
%{__python2} setup.py install --skip-buid --root %{buildroot}

%files -n python-aodh
%{python2_sitelib}/aodh
... 
%files common
%doc README.rst
%dir %{_sysconfdir}/aodh
%attr(-, root, aodh) %{_datadir}/aodh/aodh-dist.conf
%config(noreplace) %attr(-, root, aodh) %{_sysconfdir}/aodh/aodh.conf
...
%changelog

如何從python源碼包構建rpm

  • 在python源碼目錄執行
python setup.py bdist_rpm # 即可在當前dist目錄下生成rpm包
  • 定製spec:
python setup.py bdist_rpm --spec-only # 只生成dist/<module>.spec
# 重新編輯 dist/<module>.spec
python setup.py bdist_rpm --spec-file=dist/<module>.spec
  • 在瞭解了rpm和打包基本知識後,就可以結合estack-packages中打包方法,編寫打包spec,然後提交jenkins打包。
  • estack-packages操作方法詳見:build_rpm

rpm安裝卸載注意

rpm -ivh

  • -i: 被用來安裝一個新的軟件包。總是用於內核安裝和升級使用。
  • 如果環境已經安裝了該軟件包,會提示包已經存在的警告。

rpm -Uvh

  • -U: 使用這個選項時,如果環境不存在該包,則安裝上;如果當前已經安裝了一個包,那麼升級當前已安裝的包到一個新的版本。此外,在新安裝的包安裝後,所有其他版本的軟件包將被移除
  • 相比於-i,對於非內核的軟件包使用、或者非固定版本的軟件包,使用-U是個更好的選擇。如果是內核軟件包安裝,最好使用-i,避免使用-U導致的內核更新,引起下次啓動時,內核無法引導的問題。

rpm -e

  • -e: 只是像-i一樣簡單的移除該軟件包,如果有其他安裝包依賴此包,則報錯。強制移除,需要添加-nodeps選項。

rpm spec配置對rpm不同命令的影響

  • rpm spec中, 針對%files指令部分的文件列表,對於某些特定的配置文件,需要使用%config指令來做特殊處理。因爲當軟件包被移除,安裝和升級期間,RPM會執行額外的處理(保存歷史文件或者新文件等)。
  • 如上文spec示例中的:
%config(noreplace) %attr(-, root, aodh) %{_sysconfdir}/aodh/aodh.conf
  • %config對rpm包影響如下圖所示:
    rpm_config
  • 上圖主要包括以下三種情況,以rpm報中的a.txt爲例。
  • %config情況下使用rpm-Uvh
  • 如果磁盤上原始文件a.txt無改動,則會被新版本文件a.txt取代;
  • 如果磁盤上原始文件a.txt有改動,但是新版本文件並沒有改動,則磁盤上原始文件保持不變;
  • 如果新版本文件有改動,則新版本文件a.txt取代原始文件a.txt,而原始文件a.txt改名變成a.txt.rpmsave
  • %config(noreplace)情況下使用rpm-Uvh
  • 如果磁盤上原始文件a.txt有改動,但是新版本文件並沒有改動,則磁盤上原始文件保持不變;
  • 如果新版本文件有改動,則保留原始文件a.txt,來自於新版本的a.txt改名變成a.txt.rpmsave
  • %config(noreplace)情況下使用rpm -e
  • 如果文件a.txt無改動,則會被刪除; 如果文件a.txt有改動,則生成a.txt.rpmsave
  • 更多詳情參考: rpm_config

JackDan Thinking

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章