1. 程式人生 > 實用技巧 >RPM包製作

RPM包製作

RPM包能製作什麼

  • 一個應用程式
  • 庫檔案
  • 配置檔案
  • 文件包

製作步驟

創建制作目錄

  • BUILD

    原始碼解壓以後,放在這個目錄,不用使用者參與,只需提供這個目錄,真正的製作車間。

  • RPMS

    製作完成的RPM包放在這個目錄。有子目錄,跟硬體架構相關,特定平臺子目錄,i386,ARM等等。交叉編譯。

  • SOURCES

    所有的原材料。

  • SPECS

    spec檔案存放目錄,製作RPM包的綱領性檔案。軟體包名.spec。

  • SRPMS

    SRC格式的RPM包存放目錄。沒有平臺相關的概念。

注意:一般製作RPM包,建議不要用root使用者,所以,以上製作目錄結構,建議使用普通使用者建立,不要用系統預設的。

  • 巨集定義
    macrofiles:~/.rpmmacros,以最後這個為準
    rmpbuild –showrc|grep _topdir
    所以切換普通使用者
    1
    %_topdir           /home/xxx/rpmbuild

命令:

1
2
# mkdir -pv rpmbuild/{BUILD,RPMS,SOURCES,SPECS,SRPMS}
# rpmbuild --showrc|grep _topdir

把原始檔放進適當目錄

製作spec檔案(至關重要)

資訊說明段(introduction section)Name,Version,Release,Group必須,其他可選。

rpm -qpi 可以檢視一個rpm包的相關資訊
定義各種tag

  • Name:軟體包的名字
  • Relocations:是否可換安裝地址。not relocatable
  • Version:版本號,至關重要,只能用X.XX.XXX不能使用-
  • Release:發行版本號 1%{?dist}
  • License:宣告版權,例如:GPLv2
  • Group:屬於那個組,不要自己定義,在以下組裡找,只要存在的組就可以 less /usr/share/doc/rpm-4.4.2.3/GROUPS
  • URL
  • Packager:製作者<郵箱>
  • Vendor:提供商
  • Summary:概要
  • %description:描述
  • Source:原始檔,連結,Source0:解壓縮主原材料,Source1:指令碼等等
  • BuildRoot:編譯好的程式,臨時安裝根目錄,配合file section,收集哪些檔案,打包到RPM包,最後在clean section中刪除。可以規定任意目錄:/%{_tmppath}/%{name}-%{version}-%{release}-root
  • BuildRequires:定義依賴關係,編譯依賴和安裝依賴。

準備段prep section

解壓縮原始碼包到製作目錄,cd進去,設定工作環境、巨集,等等。
單獨的巨集來定義:

  • %prep
  • %setup -q 靜默模式

製作段build section

1
2
3
%build
./configure balabalabala.......................
%{__make} %{?_smp_mflags} 多CPU上,這個標識可以加快編譯速度

安裝段install section

1
2
3
4
5
%install
%{__rm} -rf %{buildroot}
%{__make} install DESTDIR="%{buildroot}"
%find_long %{name}
%{__install} -p -D 0755 %{SOURCE1} %{buildroot}/etc/init.d/nginx 安裝自定義的資原始檔 -p保留原材料時間戳

補充:Linux系統install命令:類似於cp
install /etc/fstab /tmp
install -d /tmp/test 建立目錄
install -D /etc/fstab /tmp/noexistsdir/fstab
可以直接指定安裝目標處不存在的目錄,但是要把安裝的原始檔名也指定

指令碼段script section

1
2
3
4
5
6
7
8
9
10
11
%pre安裝前 $1=0,1,2 解除安裝,安裝,升級
$1 == 1
加個使用者
%post安裝後
$1 == 1
chkconfig --add
%preun解除安裝前
$1 == 0
service xxx stop
chkconfig --del
%postun解除安裝後

清理段clean cection

1
2
%clean
%{__rm} -rf %{buildroot}

檔案段files section

除了debug資訊,都要做進RPM包

1
2
3
4
5
6
%files -f %{name}.lang
%defattr (-,root,root,0755) 定義檔案預設許可權
%doc API CHANGES COPYING CREDITS README axelrc.examlpe 文件
%config(noreplace) %{_sysconfdir}/axelrc 配置檔案,noreplace不替換原來的
/usr/local/bin/axel 包含的所有檔案,可以直接寫目錄
%attr (0755,root,root) /etc/rc.d/init.d/nginx 定義自定義資源的屬性,不指定則繼承%defattr

更改日誌段change log section

1
2
3
%changelog
* xxx 日期,製作人,版本號
- Initial Version release號

製作RPM包

rpmbuild命令
-bp 只執行到prep段
-bi 只執行到install段
-bc 只執行到build段
-bb 製作二進位制格式的RPM包
-bs 製作原始碼格式的RPM包
-ba 既製作二進位制格式又製作原始碼格式
-bl 檢查files欄位和buildroot檔案是否一一對應,不一致則報錯

展開rpm原始碼包

rpm2cpio xxxx-src.rpm | cpio -id

到哪去找原始碼包呢?
rpmfind.net
rpm.pbone.net

YUM後的rpm包保留在本地的方法

1
# sed -i 's#keepcache=0#keepcache=1#g' /etc/yum.conf

rpm包預設存放路徑

1
/var/cache/yum/base/packages

fpm製作rpm包

1
2
3
4
# yum install ruby
# gem source -a http://mirrors.aliyun.com/rubygems/
# gem source -r http://rubygems.org/
# gem install fpm

參考文件

原文地址:https://blog.stanley.wang/page/2/