如何打一個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