Linux下RPM命令打包、安装、卸载

Linux下RPM命令打包、安装、卸载

基础工具安装

Debian系

sudo apt install rpm devscripts dh-make yelp-tools

Redhat系

sudo yum install rpmbuild rpmdevtools

RPM工作目录结构

创建RPMBuild工作目录并进入工作目录

mkdir ~/rpmbuild

cd ~/rpmbuild

创建RPMBuild工作子目录

mkdir -p {SOURCES,SPECS,RPMS,BUILD,BUILDROOT,SOURCES,SPECS,RPMS,BUILD,BUILDROOT,SRPMS}

目录说明

BUILD 编译之前,如解压包后存放的路径

BUILDROOT 编译后存放的路径

RPMS 打包完成后rpm包存放的路径

SOURCES 源包所放置的路径

SPECS spec文档放置的路径

SPRMS 源码rpm包放置的路径

使用RPM打包

编写SPEC文件

进入SPECS文件夹编写spec格式的文件

以下为spec文件模板,仅供参考

# 这个区域定义的Name、Version这些字段对应的值可以在后面

# 通过%{name},%{version}这样的方式来引用,类似于C语言中的宏

# Name制定了软件的名称

Name: nginx

# 软件版本

Version: 1.5.2

# 释出号,也就是第几次制作rpm

Release: 1%{?dist}

# 软件的介绍,必须设置,最好不要超过50个字符

Summary: Nginx from WangYing

# 软件的分组,可以通过/usr/share/doc/rpm-4.8.0/GROUPS文件中选择,也可以

# 在相应的分类下,自己创建一个新的类型,例如这里的Server

Group: Application/Server

# 许可证类型

License: GPL

# 软件的源站

URL: http://nginx.org

# 制作rpm包的人员信息

Packager: WangYing

# 源码包的名称,在%_topdir/SOURCE下,如果有多个源码包的话,可以通过

# Source1、Source2这样的字段来指定其他的源码包

Source0: %{name}-%{version}.tar.gz

# BuildRoot指定了make install的测试安装目录,通过这个目录我们可以观察

# 生成了哪些文件,方便些files区域。如果在files区域中写的一些文件报

# 不存在的错误,可以查看%_topdir/BUILDROOT目录来检查有哪些文件。

BuildRoot: %_topdir/BUILDROOT

# 指定安装的路径

Prefix: /usr/local/nginx-1.5.2

# 制作过程需要的工具或软件包

BuildRequires: gcc,make

# 安装时依赖的软件包

Requires: pcre,pcre-devel,openssl

# 软件的描述,这个可以尽情地写

%description

Nginx is a http server

# %prep指定了在编译软件包之前的准备工作,这里的

# setup宏的作用是静默模式解压并切换到源码目录中,

# 当然你也可以使用tar命令来解压

%prep

%setup -q

# 编译阶段,和直接编译源代码类似,具体的操作或指定的一些参数由configure文件决定。

%build

CFLAGS="-pipe -O2 -g -W -Wall -Wpointer-arith -Wno-unused-parameter -Werror" ./configure --prefix=%{prefix}

# make后面的意思是:如果是多处理器,则并行编译

make %{?_smp_mflags}

# 安装阶段

%install

# 先删除原来的测试安装的,只有在制作失败了%{buildroot}目录才会有内容,

# 如果成功的话,目录下会被清除。

# %{buildroot}指向的目录不是BuildRoot(%_topdir/BUILDROOT)指定的目录,

# 而是该目录下名称与生成的rpm包名称相同的子目录。例如我的是

# /usr/src/redhat/BUILDROOT/nginx-1.5.2-1.el6.x86_64

rm -rf %{buildroot}

# 指定安装目录,注意不是真实的安装目录,是在制作rpm包的时候指定的

# 安装目录,如果不指定的话,默认就会安装到configure命令中指定的prefix路径,

# 所以这里一定要指定DESTDIR

make install DESTDIR=%{buildroot}

# 安装前执行的脚本,语法和shell脚本的语法相同

%pre

# 安装后执行的脚本

%post

# 卸载前执行的脚本,我这里的做的事情是在卸载前将nginx服务器停掉

%preun

MSG=`ps aux | grep nginx | grep -v "grep"`

if [ -z "$MSG" ];then

killall nginx 1>/dev/null 2>/dev/null

fi

# 卸载完成后执行的脚本

%postun

rm -rf %{prefix}

# 清理阶段,在制作完成后删除安装的内容

%clean

rm -rf %{buildroot}

#指定要包含的文件

%files

#设置默认权限,如果没有指定,则继承默认的权限

%defattr (-,root,root,0755)

%{prefix}

将源码通常放到SOURCES文件夹,然后回到刚刚的SPECS文件夹,通过下面的命令打包

rpmbuild -ba 你的文件名.spec

RPM包安装

打包好的RPM包安装

sudo rpm -ivh ~/rpmbuild/RPMS/x86_64/你的包名.rpm --nodeps --force

位置肯定是在RPMS文件夹,可能具体的子文件夹略有不同

--nodeps如果包有别的依赖,依赖没有安装就会导致这个包安装失败。这个参数可避免此类情况

--force强制安装,可用于老版本覆盖安装新版本

这两个参数可选可不选,根据实际情况决定

RPM包升级

rpm -Uvh 包全名

RPM包卸载

查询RPM包是否安装

rpm -q 包名

命令查询系统文件属于哪个RPM包

rpm -qf 系统文件名

RPM包卸载

rpm -e 包名