首先,我們需要了解一些預備知識,在舊版本的CentOS中,rpmbuild工具默認的工作路徑是/usr/src/redhat,因為權限原因,一般用戶身份不能制作rpm軟件包,只能切換到root身份才能夠制作。在新版本的CentOS中,可以在一般用戶主目錄下新建rpmbuild目錄作為rpmbuild工具的工作目錄。並且,在新版本中,發行商建議為了防止系統函數庫或其他文件損壞,不要使用root身份去制作rpm軟件包。
一、uname -r 查看linux內核版本和參數;kernel-devel版本一定要和使用的內核一致
uname -r 2.6.32-504.16.2.el6.x86_64
二、下載Intel x722網卡Linux驅動 https://downloadcenter.intel.com/download/22283/Intel-Ethernet-Adapter-Complete-Driver-Pack?product=139350
wget https://downloadmirror.intel.com/24693/eng/iavf-3.7.61.20.tar.gz
三、必要工具的安裝
其中包括make工具,若你的待安裝包使用C語言寫的,還需要安裝gcc編譯程序。最重要的是要安裝rpmbuild工具。如果沒有yum也可以從http://rpm.pbone.net/ 下載RPM包
命令如下:
yum install make yum install gcc yum install rpmbuild
yum install kernel-devel-2.6.32-504.16.2.el6.x86_64
四、創建制作rpm的工作目錄
為了創建制作rpm的工作目錄,你需要在一般用戶身份的主目錄下新建如下結構的目錄:
rpmbuild目錄,還有該目錄下六個目錄,包括:BUILD、BUILDROOT、RPMS、SOURCES、SPECS、SRPMS,命令如下:
mkdir -p ~/rpmbuild/{BUILD,BUILDROOT,RPMS,SOURCES,SPECS,SRPMS}
各個目錄的一般用途如下簡介:
BUILD 編譯rpm包的臨時目錄
BUILDROOT 編譯后生成的軟件臨時安裝目錄
RPMS 最終生成的可安裝rpm包的所在目錄
SOURCES 所有源代碼和補丁文件的存放目錄
SPECS 存放SPEC文件的目錄(重要)
SRPMS 軟件最終的rpm源碼格式存放路徑
五、制作源代碼文件tarball生成
將自己的源代碼打包,其中可以包括可執行文件、腳本文件、用戶使用手冊、配置文件還有一些其他文件。然后將打包好的壓縮包放在SOURCES目錄下。
tar -zcv -f iavf-3.7.61.20.tar.gz iavf-3.7.61.20 #假設主目錄下存在待打包的包括源代碼的目錄=>iavf-3.7.61.20 cp iavf-3.7.61.20.tar.gz ~/rpmbuild/SOURCES #將打包好的源代碼拷貝到SOURCES目錄下
六、新建*.spec的設置文件
這個spec文件的設置是整個打包過程中最重要的一環,必須仔細設置。在SPECS目錄下新建該目錄,並且進入該文件進行設置,其中文件中各個宏名(例如%install)的具體含義請參考文獻【4】
cd ~/rpmbuild/SPECS
vim iavf.spec
Name: iavf
Version: 3.7.61.20
Release: 1%{?dist}
Summary: Calculate sin and cos value
License: GPL
URL: http://linux.vbird.org
Source0: %{name}-%{version}.tar.gz
%description
This package will let you input your name and calculate sin and cos value
%prep
%setup -q
%build #執行編譯命令,編譯后會在BUILD目錄下存在暫時文件
make
%install
rm -rf %{buildroot}
mkdir -p %{buildroot}/usr/local/bin #將編譯完成源代碼試安裝在~/rpmbuild/BUILDROOT目錄下,其中的宏%{buildroot}=~/rpmbuild
make install RPM_INSTALL_ROOT=%{buildroot}
%files #最終在安裝生成的rpm軟件包時的安裝目錄
/usr/local/bin/iavf
%changelog
* Wed Jul 4 2018 VBird Tsai <vbird@mail.vbird.idv.tw> 0.1
- Build the program
spec文件主要有以下關鍵字,其含義如下:
Name: 軟件包的名稱,在后面的變量中即可使用%{name}的方式引用 Summary: 軟件包的內容 Version: 軟件的實際版本號,例如:1.12.1等,后面可使用%{version}引用 Release: 發布序列號,例如:1%{?dist},標明第幾次打包,后面可使用%{release}引用 Group: 軟件分組,建議使用:Applications/System License: 軟件授權方式GPLv2 Source: 源碼包,可以帶多個用Source1、Source2等源,后面也可以用%{source1}、%{source2}引用 BuildRoot: 這個是安裝或編譯時使用的臨時目錄,即模擬安裝完以后生成的文件目錄:%_topdir/BUILDROOT 后面可使用$RPM_BUILD_ROOT 方式引用。 URL: 軟件的URI Vendor: 打包組織或者人員 Patch: 補丁源碼,可使用Patch1、Patch2等標識多個補丁,使用%patch0或%{patch0}引用 Prefix: %{_prefix} 這個主要是為了解決今后安裝rpm包時,並不一定把軟件安裝到rpm中打包的目錄的情況。這樣,必須在這里定義該標識,並在編寫%install腳本的時候引用,才能實現rpm安裝時重新指定位置的功能 Prefix: %{_sysconfdir} 這個原因和上面的一樣,但由於%{_prefix}指/usr,而對於其他的文件,例如/etc下的配置文件,則需要用%{_sysconfdir}標識 Requires: 該rpm包所依賴的軟件包名稱,可以用>=或<=表示大於或小於某一特定版本,例如: libxxx-devel >= 1.1.1 openssl-devel 。 注意:“>=”號兩邊需用空格隔開,而不同軟件名稱也用空格分開 %description: 軟件的詳細說明 %define: 預定義的變量,例如定義日志路徑: _logpath /var/log/weblog %prep: 預備參數,通常為 %setup -q %build: 編譯參數 ./configure --user=nginx --group=nginx --prefix=/usr/local/nginx/…… %install: 安裝步驟,此時需要指定安裝路徑,創建編譯時自動生成目錄,復制配置文件至所對應的目錄中(這一步比較重要!) %pre: 安裝前需要做的任務,如:創建用戶 %post: 安裝后需要做的任務 如:自動啟動的任務 %preun: 卸載前需要做的任務 如:停止任務 %postun: 卸載后需要做的任務 如:刪除用戶,刪除/備份業務數據 %clean: 清除上次編譯生成的臨時文件,就是上文提到的虛擬目錄 %files: 設置文件屬性,包含編譯文件需要生成的目錄、文件以及分配所對應的權限 %changelog: 修改歷史
七、編譯成為RPM和SRPM
輸入如下命令,在最后出現exit 0表示生成成功。
rpmbuild -ba iavf.spec
八、安裝和測試
輸入rom命令進行安裝和測試。
rpm -ivh ~/rpmbuild/RPMS/x86_64/iavf-3.7.61.20-1.x86_64.rpm #安裝iavf rpm -ql iavf #查找iavf的安裝路徑 rpm -qi iavf #查詢iavf相關信息
九、注意事項
在/usr/local/bin目錄中不能有同名目錄或者文件存在
十、參考文獻
【1】https://www.cnblogs.com/masterpanda/p/5700453.html
【2】https://access.redhat.com/sites/default/files/attachments/rpm_building_howto.pdf
【3】https://wiki.centos.org/HowTos/SetupRpmBuildEnvironment
【4】https://docs.fedoraproject.org/quick-docs/en-US/creating-rpm-packages.html#con_rpm_spec_file_overview
十一、參考網卡驅動安裝手冊,如果編譯驅動環境ok可以直接使用 rpmbuild -tb iavf-<x.x.x>.tar.gz 完成RPM包制作。
Building and Installation ========================= To build a binary RPM package of this driver -------------------------------------------- Note: RPM functionality has only been tested in Red Hat distributions. 1. Run the following command, where <x.x.x> is the version number for the driver tar file. # rpmbuild -tb iavf-<x.x.x>.tar.gz NOTE: For the build to work properly, the currently running kernel MUST match the version and configuration of the installed kernel sources. If you have just recompiled the kernel, reboot the system before building. 2. After building the RPM, the last few lines of the tool output contain the location of the RPM file that was built. Install the RPM with one of the following commands, where <RPM> is the location of the RPM file: # rpm -Uvh <RPM> or # dnf/yum localinstall <RPM> NOTES: - To compile the driver on some kernel/arch combinations, you may need to install a package with the development version of libelf (e.g. libelf-dev, libelf-devel, elfutilsl-libelf-devel). - When compiling an out-of-tree driver, details will vary by distribution. However, you will usually need a kernel-devel RPM or some RPM that provides the kernel headers at a minimum. The RPM kernel-devel will usually fill in the link at /lib/modules/'uname -r'/build.