2.28. 源码包制作成rpm包

2.28.1. 使用spec文件构建RPM包

RPM的全称是Red Hat Package Manager(Red Hat包管理器)。几乎所有的Linux发行版本都使用这种形式的软件包管理软件,如安装、更新和卸载软件。

其实制作RPM软件包并不是一项复杂的工作,其中的关键在于编写SPEC软件包描述文件,要想制作一个RPM软件包,就必须编写一个软件包描述文件(SPEC)。 这个文件中包含了软件包的诸多信息,如软件包的名称、版本、类别、说明摘要、创建时要执行什么指令、安装时要执行什么操作,以及软件包所要包含的文件列表等。

考虑到国内80%以上的企业使用的是RPM体系的Linux发行版(RedHat和SUSE都是RPM体系),这里主要介绍spec文件的写法:

描述文件的说明具体如下:

一般的spec文件头包含以下几个域:

(1)文件头

· Summary:  用一句话尽可能多地概括该软件包的信息。软件包的内容概要,在yum/zipper install的时候会提示使用者软件包的用途。

· Name: 软件包的名称,最终RPM软件包将使用该名称与版本号、释出号及体系号来命名软件包,之后可以使用%{name}的方式引用。

· Version:软件版本号,仅当软件包相较以前有较大改变时才增加版本号。后面可以使用%{version}引用。

· Release:软件包释出号,一般在对该软件包加了一些小补丁的时候就应该把释出号加1,后面可以使用%{release}引用。

· Vendor:软件开发者的名字。

· Copyright: 软件包所采用的版权规则,具体包括GPL(自由软件)、BSD、MIT、Public Domain(公共域)、Distributable(贡献)、Commercial(商业)、Share(共享)等,一般的开发都写GPL。

· Group:软件包所属类别,具体类别包括文档、娱乐游戏、数据库、编辑器、工程等。

· Source:具体的源代码包围着,一个软件可以由多个源代码包共同组成,用Source1、Source2等来分别指定即可,之后用%{SOURCE1}、%{SOURCE2}来引用。一般情况下,我们都会使用tar.gz的压缩包。

· BuildRoot:这个是安装或编译时使用的“虚拟目录”,考虑到多用户的环境。一般定义如下:
%{_teppath}/%{name}-%{version}-%{release}-root
或者
%{_teppath}/%{name}-%{version}-%{release}-buildroot-%(%{__id_u} -n)

· %description: 软件包的详细说明,可写在多个行上。
  1. %prep段

%prep段是预处理段,通常用来执行一些解开源程序包的命令,为下一步编译做准备。%prep段和下面的%build、%install段一样,除了可以执行RPM所定义的宏命令(以%开头)以外,还可以执行SHELL命令,命令可有很多行,
如我们常写的tar解包命令。

(3)%build段

%build段是建立段,所要执行的命令为生成软件包的服务,如make命令。

(4)%install段

%install段是安装段,其中的命令是在安装软件包时将执行,如make install命令

(5)%clean段

清理临时文件

(6)附加动作脚本 附加动作包括以下几种:

%pre
# 安装后执行的脚本
%post
# 卸载前执行的脚本
%preun
# 卸载完成后执行的脚本
%postun
# 清理阶段,在制作完成后删除安装的内容

注意:%preun在升级的时候会执行, %postun在升级RPM包的时候则不会执行。

(7)%files段

%files段是文件段,用于定义软件包所包含的文件,分为三类:说明文档(doc)、配置文件(config)及执行程序,
该段还可以定义文件存储权限、拥有者及组别。

(8)%changelog段

本段是修改日志段。你可以将软件的每次修改记录到这里,保存到发布的软件包中,以便查询之用。
每一个修改日志都有这样一种格式:
    第一行是:* 星期 月 日 年 修改人 电子信箱。其中:星期、月份均用英文形式的前3个字母,用中文会报错。
    接下来的行写的是修改了什么地方,可写多行。一般以减号开始,便于后续的查阅。

参考:

https://blog.csdn.net/diaoqu4574/article/details/102222811

rpmbuild打包成rpm包(mariadb示例)

编译和二进制安装mysql的时间有点长,所以考虑了一下, 还是利用rpm build打包成rpm包更快的安装,还可以自己定义配置文件和脚本等, 打包一个属于自己的rpm包。

这里使用的源码包是:

mariadb-10.4.11.tar.gz

因为这个包自带boost库,就不需要自己另外下载了

1、开始安装:

安装rpmbuild工具包:

yum install rpmbuild rpmdevtools -y

2、初始化一个工作目录:

rpmdev-setuptree rpmbuild2

3、查看目录结构:

[root@master ~]# tree -L 3
└── rpmbuild
    ├── BUILD --源码包解压后的目录
    ├── RPMS --生成rpm包的目录
    ├── SOURCES --源码包放在这里
    ├── SPECS --最重要的目录,使用这个目录下的.spec文件生成rpm包
    └── SRPMS  --存放生成的源码包

4、将mariadb-10.4.11.tar.gz上传至SOURCES目录下, 在该目录下创建my.cnf文件和mysqld.service文件。在SPECS目录下创建mariadb.spec文件。

[root@172-16-72-20 rpmbuild]# tree -L 3
.
├── BUILD
├── BUILDROOT
├── RPMS
│   └── x86_64
├── SOURCES
│   ├── mariadb-10.4.11.tar.gz
│   ├── mariadb.cnf
│   ├── my.cnf
│   ├── mysqld
│   └── mysqld.server
├── SPECS
│   └── mariadb.spec
└── SRPMS

5、配置mariadb.spec文件,内容如下:

如果系统有 rpmdevtools 工具,可以用 rpmdev-newspec -o name.spec 命令来生成 SPEC 文件的模板,然后进行修改:

生成文件模板

rpmdev-newspec -o mariadb.spec
[root@172-16-72-20 SPECS]# cat mariadb.spec
Name:       mariadb
Version:    10.3.10
Release:    1%{?dist}
Summary:    maraidb

License:    GPL
Source0:    %{name}-%{version}.tar.gz
Source1:    mariadb.cnf
Source2:    mysqld.server
BuildRequires:  cmake /sbin/useradd /sbin/groupadd /bin/bash /bin/sh /bin/chown
Requires:   Judy-devel bison bison-devel boost-devel cmake gcc-c++ krb5-devel libaio-devel libarchive-devel libedit-devel lz4-devel multilib-rpm-config ncurses-devel openssl openssl-devel pam-devel perl(Data::Dumper) perl(Env) perl(Exporter) perl(Fcntl) perl(File::Temp) perl(Getopt::Long) perl(IPC::Open3) perl(Memoize) perl(Socket) perl(Symbol) perl(Sys::Hostname) perl(Test::More) perl(Time::HiRes) procps python rpmlib(CompressedFileNames) <= 3.0.4-1 rpmlib(FileDigests) <= 4.6.0-1 selinux-policy-devel systemd systemd-devel systemtap-sdt-devel time zlib-devel
BuildRoot:  %{_topdir}/BUILDROOT
%define     _prefix     /etc/mysql
%define     _datadir    /data/mysql/data
%define     MYSQL_USER  mysql
%define     MYSQL_GROUP     mysql
%define     mysql_conf  /etc/mysql/my.cnf
%define     mysql_server    /usr/lib/systemd/system/mysqld.service
%define     mysqld      /etc/init.d/mysqld
%description
The MySQL(TM) software delivers a very fast, multi-threaded, multi-user,
and robust SQL (Structured Query Language) database server. MySQL Server
is intended for mission-critical, heavy-load production systems as well
as for embedding into mass-deployed software.

%prep
rm -rf $RPM_BUILD_ROOT/%{name}-%{version}
# %setup -n %{name}-%{version} #把源码包解压并放好
%setup -q -n %{name}-%{version}
id $user >& /dev/null
if [ $? -ne 0 ];then
  groupadd %{MYSQL_GROUP}
  useradd -g %{MYSQL_GROUP} %{MYSQL_USER} -s /bin/nologin >/dev/null 2>&1
fi
%build
cmake . -DCMAKE_INSTALL_PREFIX=%{_prefix} \
-DMYSQL_DATADIR=%{_datadir} -DSYSCONFDIR=/etc/mysql \
-DMYSQL_UNIX_ADDR=/var/run/mysqld/mysql.sock \
-DMYSQL_TCP_PORT=3306 \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_PARTITION_STORAGE_ENGINE=1 \
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
-DWITH_MYISAM_STORAGE_ENGINE=1 \
-DWITH_READLINE=1 \
-DENABLED_LOCAL_INFILE=1 \
-DDEFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci \
-DWITH_EXTRA_CHARSETS=all


make -j `cat /proc/cpuinfo | grep processor| wc -l`
%install
rm -rf %{buildroot}
make DESTDIR=%{buildroot} install
%{__install} -p -D -m 0644 %{SOURCE1} %{buildroot}/etc/mysql/my.cnf
%{__install} -p -D -m 0755 %{SOURCE2} %{buildroot}/usr/lib/systemd/system/mysqld.service
%{__install} -p -D -m 0755 %{buildroot}%{_prefix}/support-files/mysql.server %{buildroot}/etc/init.d/mysqld

%pre
useradd -s /bin/nologin -M mysql >/dev/null 2>&1

%post
chkconfig mysqld on
%{_prefix}/bin/mysqld --initialize-insecure --basedir=%{_prefix} --datadir=%{_datadir} --user=mysql
%{_prefix}/bin/mysql_ssl_rsa_setup --uid=%{MYSQL_USER}
chown -R mysql:mysql %{_prefix}
systemctl start mysqld

%preun
systemctl stop mysqld
chkconfig --del mysqld

%postun
rm -rf /etc/mysql >/dev/null 2>&1
rm -rf /etc/mysql/data >/dev/null 2>&1
rm -rf /etc/init.d/mysql >/dev/null 2>&1
rm -rf /etc/mysql/my.cnf >/dev/null 2>&1
rm -rf /etc/mysql/my.cnf.d >/dev/null 2>&1
rm -rf /etc/mysql/mysql >/dev/null 2>&1
rm -rf /var/run/mysqld.pid >/dev/null 2>&1
userdel -r mysql >/dev/null 2>&1

%files
%defattr(-,mysql,mysql)
%doc
%{_prefix}
%{mysql_conf}
%{mysqld}
%{mysql_server}

%changelog

6、开始打包,执行:

rpmbuild -bb mariadb.spec

7、等待打包完成,完成之后会在RPMS目录下生成两个rpm包:

[root@172-16-72-20 x86_64]# ll -lih
total 204M
80161320 -rw-r--r--. 1 root root  67M Jan  3 06:08 mariadb-10.3.10-1.el7.x86_64.rpm
80161321 -rw-r--r--. 1 root root 138M Jan  3 06:10 mariadb-debuginfo-10.3.10-1.el7.x86_64.rpm

8、安装打包好的rpm包:

示例:rpmbuild.spec

制作一个cluster-management的rpm包

cluster-management.spec

Name:      cluster-management-system
Version:    v0.1
Release:    1%{?dist}
Summary:    louie@futongcloud.com.cn
License:    GPL
Group:  Applications/System
#Requires:  /usr/bin/pip
Source0:   %{name}-%{version}.tar

%description
This is cluster management system v0.1.

%prep

%build

%install
mkdir -p $RPM_BUILD_ROOT/tmp/whl
mkdir -p $RPM_BUILD_ROOT/usr/bin/
mkdir -p $RPM_BUILD_ROOT/usr/lib/systemd/system/
cp  %{_builddir}/download/* $RPM_BUILD_ROOT/tmp/whl
cp  %{_builddir}/bin/* $RPM_BUILD_ROOT/usr/bin
cp  %{_builddir}/systemd/* $RPM_BUILD_ROOT/usr/lib/systemd/system

%post
if [ ! -f "/usr/bin/pip" ]; then
 curl 'https://bootstrap.pypa.io/get-pip.py' -o /tmp/get-pip.py && python /tmp/get-pip.py && rm -fr /tmp/get-pip.py
fi

if [ ! -f "/usr/bin/pip" ]; then
 yum install -y epel-release python-pip
fi

pip install /tmp/whl/*
pip install /tmp/whl/tornado-5.1.1.tar.gz

#rm -rf /tmp/whl

function open_ports(){
for i in $tcp_ports;
do
 echo "Set tcp port $i"
 firewall-cmd --zone=public --add-port=$i/tcp --permanent
done

for i in $udp_ports;
do
 echo "Set upd port $i"
 firewall-cmd --zone=public --add-port=$i/udp --permanent
done
firewall-cmd --reload
}

tcp_ports="3306 4396 5010 5016 5671 5672 6010 15671 15672 25672 6379 8300-8302 8400 8500 8080 8686 8070 17082 17086 16006 27016 27017 27018 27019 18080 11000 13001 18000 2377 7946"
udp_ports="8301 8302 53 11111 4789 7946"

open_ports

systemctl enable consul
systemctl enable ftnode
systemctl enable ft-mongo
systemctl enable ft-mysql
systemctl enable ft-rabbitmq
systemctl enable ft-redis
systemctl start consul
systemctl start ftnode
systemctl start ft-mongo
systemctl start ft-mysql
systemctl start ft-rabbitmq
systemctl start ft-redis

%preun
systemctl disable consul
systemctl disable ftnode
systemctl disable ft-mongo
systemctl disable ft-mysql
systemctl disable ft-rabbitmq
systemctl disable ft-redis
systemctl stop consul
systemctl stop ftnode
systemctl stop ft-mongo
systemctl stop ft-mysql
systemctl stop ft-rabbitmq
systemctl stop ft-redis


%files
%defattr (-,root,root)
/usr/bin/*
/usr/lib/systemd/system/*
/tmp/whl/*

%changelog

%clean
rm -rf %{buildroot}

rpmbuild打包成rpm包(mysql示例)

参考文献 https://www.58jb.com/html/149.html

https://blog.csdn.net/baijiu1/article/details/97017411

mariadb定制rpm包

http://www.suoniao.com/article/4320

烂泥:Linux源码包制作RPM包之Apache

https://www.cnblogs.com/ilanni/p/4312581.html

centos7使用rpmbuild制作rpm包

参考文献

https://blog.csdn.net/weixin_44208042/article/details/89216844

https://blog.csdn.net/u010384744/article/details/80929319

https://blog.csdn.net/u012373815/article/details/73257754

参考文献

https://blog.csdn.net/weixin_33827590/article/details/89859618

2.28.2. 命令行打包工具FPM

FPM打包工具

2.28.3. 参考一个很好的文章

CentOS下使用rpm-build制作nginx的RPM包