如何打一個RPM包


如何打一個RPM包

參考鏈接:RPM打包原理、示例、詳解及備查

前言

本文只是一個RPM安裝的例子,並沒有對RPM做比較詳盡的敘述,更為詳盡的講解,可以在上面的鏈接中找到。

RPM是啥?

RPM(Redhat Package Manager)是用於Redhat、CentOS、Fedora等Linux 分發版(distribution)的常見的軟件包管理器。因為它允許分發已編譯的軟件,所以用戶只用一個命令就可以安裝軟件。

話不多說,讓我們開始打RPM包!我們將以打Supervisor包為例。

安裝rpmbuild

在開始之前,我們先做好准備工作:

RPM打包使用的是rpmbuild命令,這個命令來自rpm-build包。

$ yum install rpm-build
$ yum install rpmdevtools

打成的包要做什么?

接着,我們來看看如果手動安裝Supervisor,我們可能要的步驟:

  • 將壓縮包上傳至: /tmp/
  • cd /tmp/
  • tar -C /opt/ -xzf supervisor-4.0.2.tar.gz
  • cd /opt/
  • mv supervisor-4.0.2 supervisor
  • cd supervisor
  • python setup.py install
  • echo_supervisord_conf > /etc/supervisord.conf
  • supervisord -c /etc/supervisord.conf

即解壓 / 重命名文件夾 / 運行安裝腳本 / 增加配置文件 / 啟動進程

創建RPM文件

接下來,我們將上面的操作轉為RPM操作,首先我們需要編寫一個spec文件。我們可以通過spec文件來配置要生成的rpm包(有點類似Docker的Dockerfile)。

新建spec文檔

我們不妨先找到rpmbuild所在目錄,通過yum install安裝,一般位置為

/用戶名/rpmbuild

查看下面的目錄

$ ll 
total 0
drwxr-xr-x 6 root root  88 May 13 14:30 BUILD
drwxr-xr-x 5 root root 129 May 13 14:30 BUILDROOT
drwxr-xr-x 3 root root  20 May 10 17:04 RPMS
drwxr-xr-x 3 root root 150 May 13 10:29 SOURCES
drwxr-xr-x 2 root root  88 May 13 14:30 SPECS
drwxr-xr-x 2 root root 163 May 13 14:30 SRPMS

這些目錄都是干嘛的呢?請看:

默認位置 宏代碼 名稱 用途
~/rpmbuild/SPECS %_specdir Spec 文件目錄 保存 RPM 包配置(.spec)文件
~/rpmbuild/SOURCES %_sourcedir 源代碼目錄 保存源碼包(如 .tar 包)和所有 patch 補丁
~/rpmbuild/BUILD %_builddir 構建目錄 源碼包被解壓至此,並在該目錄的子目錄完成編譯
~/rpmbuild/BUILDROOT %_buildrootdir 最終安裝目 保存 %install 階段安裝的文件
~/rpmbuild/RPMS %_rpmdir 標准 RPM 包目錄 生成/保存二進制 RPM 包
~/rpmbuild/SRPMS %_srcrpmdir 源代碼 RPM 包目錄 生成/保存源碼 RPM 包(SRPM)

正如上文所說,我們不妨把編寫的spec文件放在SPECS目錄里面。

$ cd /root/rpmbuild/SPEC/
$ vim supervisor.spec

向spec文檔添加內容

基於哪個代碼包?

首先我們要知道rpm包生成基於哪個文件生成,一般都是壓縮包格式的源代碼軟件包,比如
supervisor-4.0.2.tar.gz

添加下面的內容

# 軟件包的名稱 
Name: supervisor
# 軟件包的版本 
Version: 4.0.2
# 源代碼軟件包的名字 
Source0: %{name}-%{version}.tar.gz

上面的Source即指定了源代碼軟件包。我們同時需要將supervisor-4.0.2.tar.gz文件,放入
上面所說的SOURCES目錄。

解壓縮代碼包

setup -q 命令會自動將上一步指定的壓縮包解壓,並將文件包內容放置到BUILD目錄里;然后cd到解壓后的目錄中。

# 安裝前的准備工作,一般用於解壓源碼包 
%prep
# 解壓並cd到相關目錄
%setup -q

進行安裝

這一步,按照我的感覺,是要把python setup.py install內容加進來的,但是實驗后發現,這句命令在%install區內無法執行,需要放置到下一步的區域中。

# 源碼安裝,如:make install 命令 
%install
mkdir -p %{buildroot}/opt/supervisor/
cp -rp %{_builddir}/%{name}-%{version}/*  %{buildroot}/opt/supervisor/

安裝后置操作

所有文件安裝成功后,就可以執行剩下的操作了。%post區域里就是存放這些操作的。

## 安裝后執行的腳本
%post
cd /opt/supervisor/
python setup.py install
echo_supervisord_conf > /etc/supervisord.conf
supervisord -c /etc/supervisord.conf

這樣一來,spec的主要內容部分就都寫好了,剩下的就補充一些細枝末節了。

完善spec內容

將剩余的字段完善后,得到的最終文件如下所示:

# 軟件包的名稱 
Name: supervisor
# 軟件包的版本 
Version: 4.0.2
# 軟件包發布序列號,1表示第幾次打包 
Release: 1%{?dist}
# 軟件包的概要信息,不要超過50個 
Summary: The supervisor is a client/server system.
# 軟件授權方式 
License: BSD-derived
# 軟件分類
Group:System Environment/Daemons
# 源代碼軟件包的官方地址或源碼包的下載地址 
URL: https://pypi.org/project/supervisor/
# 源代碼軟件包的名字 
Source0: %{name}-%{version}.tar.gz

# install使用的虛擬目錄,安裝后就在該目錄下打包 
BuildRoot: %_topdir/BUILDROOT
#軟件包詳細描述信息 
%description
The supervisor is a client/server system that allows its users to control a number of processes on UNIX-like operating systems.

# 安裝前的准備工作,一般用於解壓源碼包 
%prep
#解壓並cd到相關目錄
%setup -q

# 源碼編譯,如: ./configure && make命令 
%build

# 源碼安裝,如:make install 命令 
%install
mkdir -p %{buildroot}/opt/supervisor/
cp -rp %{_builddir}/%{name}-%{version}/*  %{buildroot}/opt/supervisor/

## 安裝后執行的腳本
%post
cd /opt/supervisor/
python setup.py install
echo_supervisord_conf > /etc/supervisord.conf
supervisord -c /etc/supervisord.conf

# 清理臨時文件 
%clean
# rm -rf %{buildroot}      

# 定義那些文件或目錄放入RPM當中 %file是在虛擬根目錄(BuildRoot)下進行,千萬不要寫絕對路徑,應該使用宏或者變量表示相對路徑 
%files
/

%doc
# RPM包軟件的每次修改記錄到這里 

%changelog
* Fri May 13 2019 MG
- Initial Supervisor 4.0.2 RPM release

生成RPM包並安裝

我們可以使用上面所編寫的spec文件來生成RPM包。

生成rpm

$ rpmbuild -ba supervisor.spec

運行完上述命令后,我們可以進入RPMS目錄。發現多了一個rpm文件。

$ ll RPMS/x86_64/supervisor-4.0.2-1.el7.centos.x86_64.rpm 
-rw-r--r-- 1 root root 643728 May 13 14:16 RPMS/x86_64/supervisor-4.0.2-1.el7.centos.x86_64.rpm

安裝RPM包

將生成的rpm文件復制到另外一台機器上,執行下面的命令,就可以發現rpm包可以正常安裝了。

rpm -ivh supervisor-4.0.2-1.el7.centos.x86_64.rpm

大功告成!

可能遇到的問題

問題1:rpm conflicts with file from package

安裝的時候增加–replacefiles參數,例如

rpm -ivh supervisor-4.0.2-1.el7.centos.x86_64.rpm --replacefiles

問題2:xxx is already installed

安裝的時候增加--replacepkgs參數,例如

rpm -ivh supervisor-4.0.2-1.el7.centos.x86_64.rpm --replacepkgs

問題3:如何查看當前系統發行版

$ cat /proc/version
Linux version 3.10.0-693.25.4.el7.x86_64 (mockbuild@x86-030.build.eng.bos.redhat.com) (gcc version 4.8.5 20150623 (Red Hat 4.8.5-16) (GCC) ) #1 SMP Sat Apr 28 14:04:53 EDT 2018


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM