首先,我们需要了解一些预备知识,在旧版本的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.