您的当前位置:首页正文

自制mysql的rpm包

2021-06-02 来源:好走旅游网
⾃制mysql的rpm包

MySQL安装⼀般使⽤RPM或者源码安装的⽅式。

RPM安装的优点是快速,⽅便.缺点是不能⾃定义安装⽬录.如果需要调整数据⽂件和⽇志⽂件的存放位置,还需要进⾏⼀些⼿动调整。源码安装的优点是可以⾃定义安装⽬录,缺点是编译时间长,过程复杂

其实还有⼀种⽅式,定制RPM包.

它相当于⽤源码安装的⽅式定制了⼀个RPM包.⼀次打包,可以多次使⽤

它可以定制路径,安装时⾃动创建帐号,⾃动配置服务,环境变量等,并且安装过程快速,简单。在⼤规模部署的场景下,优点⼗分突出.

缺点是制作RPM包,需要⾃⼰编写Red Hat定义的spec⽂件,⽽编写完成后,也需要进⾏编译

现在开始定制mysql的rpm包1、定制rpm包,⾸先需要安装⼀个包  yum -y install rpm-build

2、定制rpm包只需要⽤到普通⽤户便可以完成,所以这⾥推荐使⽤普通⽤户  useradd wadeson

3、创建⾃制rpm包需要⽤到的基本仓库⽬录

  在⽤户的家⽬录下⾯执⾏[wadeson@testdb ~]$ rpmbuild ~,即可,会⾃动⽣成需要⽤到的⼀些⽬录

  [wadeson@testdb rpmbuild]$ ll  total 24

  drwxr-xr-x. 2 wadeson wadeson 4096 Aug 27 22:25 BUILD 解压后的tar.gz

  drwxr-xr-x. 2 wadeson wadeson 4096 Aug 27 22:25 BUILDROOT 临时安装⽬录,会打包该⽬录下⽂件  drwxr-xr-x. 2 wadeson wadeson 4096 Aug 27 22:25 RPMS 编译后存放的rpm⽂件

  drwxr-xr-x. 2 wadeson wadeson 4096 Aug 27 22:25 SOURCES 源代码和⼀些⽂件的存放地

  drwxr-xr-x. 2 wadeson wadeson 4096 Aug 27 22:25 SPECS 编写spec⽂件vim 直接创建就有⼀部分样例  drwxr-xr-x. 2 wadeson wadeson 4096 Aug 27 22:25 SRPMS src格式的rpm包存放的位置

这个⼯具打包的过程⼤致如下,编写spec指定打包的过程

将源码压缩包放在SOURCES⽬录下,

将源码解压缩到BUILD⽬录,执⾏make命令(mysql使⽤cmake,make)将make install 的结果放在BUILDROOT⽬录下,

最后将BUILDROOT下编译好的⼆进制⽂件制作成RPM包。并且可以指定在RPM安装之前,安装之后,卸载等过程执⾏的命令

⽬录名 说明 macros中的宏名

BUILD 编译rpm包的临时⽬录%_builddir

BUILDROOT 编译后⽣成的软件临时安装⽬录%_buildrootdirRPMS 最终⽣成的可安装rpm包的所在⽬录%_rpmdir

SOURCES 所有源代码和补丁⽂件的存放⽬录%_sourcedirSPECS 存放SPEC⽂件的⽬录(重要)%_specdir

SRPMS 软件最终的rpm源码格式存放路径(暂时忽略掉,别挂在⼼上)%_srcrpmdir

相应的⽬录创建好了之后,开始进⾏真正的操作,⾸先下载mysql的源码包,这⾥以mysql-5.6.37为例将下载好的mysql-5.6.37存放在相应的⽬录:

[wadeson@testdb ~]$ cd rpmbuild/SOURCES/[wadeson@testdb SOURCES]$ lltotal 31448

-rw-rw-r--. 1 wadeson wadeson 32200158 Aug 23 22:19 mysql-5.6.37.tar.gz[wadeson@testdb rpmbuild]$ tree ..

|-- BUILD

|-- BUILDROOT|-- RPMS

|-- SOURCES

| `-- mysql-5.6.37.tar.gz|-- SPECS

`-- SRPMS

⼀些宏的参数:

[wadeson@testdb rpmbuild]$ rpmbuild --showrc|grep _topdir-14: _builddir %{_topdir}/BUILD

-14: _buildrootdir %{_topdir}/BUILDROOT-14: _rpmdir %{_topdir}/RPMS

-14: _sourcedir %{_topdir}/SOURCES-14: _specdir %{_topdir}/SPECS-14: _srcrpmdir %{_topdir}/SRPMS-14: _topdir %{getenv:HOME}/rpmbuild

[wadeson@testdb rpmbuild]$ echo \"%_topdir %(echo $HOME)/rpmbuild\" > ~/.rpmmacros[wadeson@testdb rpmbuild]$ rpmbuild --showrc|grep _topdir-14: _builddir %{_topdir}/BUILD

-14: _buildrootdir %{_topdir}/BUILDROOT-14: _rpmdir %{_topdir}/RPMS

-14: _sourcedir %{_topdir}/SOURCES-14: _specdir %{_topdir}/SPECS-14: _srcrpmdir %{_topdir}/SRPMS

-14: _topdir %(echo /home/wadeson)/rpmbuild然后相应的宏的值对应相应的⽬录

理解好了这些之后,于是进⼊到SPEC⽬录进⾏编写spec⽂件:

直接使⽤vim mysql.spec就可以,⾥⾯默认带有⼀些默认的配置,现在做如下修改,并配有相应的解释:

Name: mysql 后⾯可以变量引⽤:%{name}Version: 5.6.37 后⾯可以变量引⽤:%{version}

Release: 1%{?dist} {?dist}: ?表⽰后⾯的dist有值就启⽤,没有值就舍弃,dist根据系统版本来定义,像redhat5就是el5,redhat6就是el6

Summary: MySQL-5.6.37 RPM 概要(随便写就⾏,不过就字符限制⽆需太长)

Group: applications/database #需要在⼀个存在的组中,通过/usr/share/doc/rpm-version/GROUPS查看完整的组列表License: GPL

URL: http://www.mysql.com

Source0: mysql-5.6.37.tar.gz 因为这⾥只⽤到了mysql源码,如果需要my.cnf配置⽂件,那么可以Source1:my.cnf依次类推

这个压缩⽂件需要放在指定的⽬录中(/root/rpmbuild/SOURCES) ⾃动解压的时候,会在这个指定⽬录中找这个⽂件

# prefix: /usr/local/mysql-5.6.37 当然这⾥可以定义变量,下⾯使⽤%{prefix}进⾏引⽤

BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root %{_tmppath}这个宏的值可以通过上⾯rpmbuild --showrc|grep_tmppath查看

#安装或编译时使⽤的虚拟⽬录,在⽣成rpm的过程中,执⾏make install时就会把软件安装到该路径中,默认构建根⽬录为%{_topdir}/BUILDROOT

  [wadeson@testdb SPECS]$ rpmbuild --showrc|grep _tmppath

  -14: __dbi_other %{?_tmppath:tmpdir=%{_tmppath}} %{?__dbi_cdb}  -14: _tmppath %{_var}/tmp

  [wadeson@testdb SPECS]$ rpmbuild --showrc|grep _var  -14: _dbpath %{_var}/lib/rpm  -14: _tmppath %{_var}/tmp  -14: _var /var

  即%{_tmppath}真正的值为/var/tmp,

BuildRequires: cmake,ncurses-devel

    #在编译过程中需要的包列表,以逗号分开,并可以指定最⼩版本。#Requires:

AutoReqProv: no

%description

this is rpmbuilding mysql5.6.37 rpm

%define MYSQL_USER mysql define进⾏定义变量    # 1.如何定义变量?

    # %define author zuosi #定义了⼀个变量author,值为zuosi%define MYSQL_GROUP mysql

%prep

%setup -q -n mysql-%{version} 进⾏解压-q不输出信息,-n指定解压⽬录

解压源码包之后,会进⼊⽬录执⾏build,它默认是根据%{name}和%{version}拼接的⽬录.

%build #该阶段执⾏常见的configure和make操作cmake . \\

-DCMAKE_INSTALL_PREFIX:=/usr/local/mysql-5.6.37 \\ # 这⾥的安装的prefix可以定义变量取代,调⽤变量使⽤%{varname}就⾏

-DMYSQL_DATADIR=/data/mysql \\-DSYSCONFDIR=/etc \\

-DWITH_MYISAM_STORAGE_ENGINE=1 \\-DWITH_INNOBASE_STORAGE_ENGINE=1 \\-DWITH_MEMORY_STORAGE_ENGINE=1 \\-DWITH_READLINE=1 \\

-DMYSQL_UNIX_ADDR=/tmp/mysql.sock \\-DMYSQL_TCP_PORT=3306 \\-DENABLED_LOCAL_INFILE=1 \\

-DWITH_PARTITION_STORAGE_ENGINE=1 \\-DEXTRA_CHARSETS=all \\-DDEFAULT_CHARSET=utf8 \\

-DDEFAULT_COLLATION=utf8_general_ci

make -j `cat /proc/cpuinfo | grep processor| wc -l`

查看计算机有⼏个核,然后多线程编译

# make %{?_smp_mflags} ← 多核则并⾏编译,与上⾯选⼀个就⾏

%install

rm -rf %{buildroot} # 先删掉之前的构建

make install DESTDIR=%{buildroot} # 安装到哪⾥  然后执⾏%install

  将编译之后的代码真实的安装⼀遍,

  它安装的⽬录是/home/wadeson/rpmbuild/BUILDROOT/mysql-5.6.37-1.el6.x86_64/usr/local/mysql-5.6.37

  因为我们指定的安装⽬录是/usr/local/mysql-5.6.37,它相当于在⼀个沙盒中安装了⼀遍.它会将沙盒中安装之后的⽂件打成RPM包

%clean

rm -rf %{buildroot}   # 清理构建仓库中的BUILDROOT

%files   # 就是指定哪些沙盒中的⽂件打⼊RPM包%defattr(-, %{MYSQL_USER}, %{MYSQL_GROUP})

  #设置默认⽂件权限式%defattr(, , , ),-使⽤默认的权限,⽂本⽂件是0644,可执⾏⽂件是0755

  #另外,defattr(⽂件权限,⽤户名,组名,⽬录权限)⽤来指定权限,如: %defattr(-,root,root,-),这条指令设置缺省权限。%attr(755, %{MYSQL_USER}, %{MYSQL_GROUP}) /usr/local/mysql-5.6.37/*  给basedir下的mysql赋权限

%pre       # 是RPM安装之前执⾏的命令这⾥主要是创建数据⽂件的⽬录和帐号mkdir -p /data/mysql

if ! id %{MYSQL_USER} > /dev/null 2>&1;then

  useradd -M -s /sbin/nologin %{MYSQL_USER}fi

chown -R mysql:mysql /data/mysql

%post   # 是RPM安装之后执⾏的命令这⾥主要是创建数据库实例,配置服务,配置环境变量

/usr/local/mysql-5.6.37/scripts/mysql_install_db --basedir=/usr/local/mysql-5.6.37 --datadir=/data/mysql --user=mysqlcp /usr/local/mysql-5.6.37/support-files/mysql.server /etc/init.d/mysqldchmod +x /etc/init.d/mysqldchkconfig mysqld on

cp /usr/local/mysql-5.6.37/my.cnf /etc/my.cnf

%preun   # 是卸载RPM包执⾏的命令,主要⽤于清理service mysqld stopchkconfig --del mysqld

userdel mysqlrm -rf /home/mysqlrm -rf /data/mysql

rm -rf /etc/init.d/mysqld

rm -rf /usr/local/mysql-5.6.37

%changelog

下⾯是⼀个完整的spec⽂件:

Name: mysqlVersion: 5.6.37

Release: 1%{?dist}

Summary: MySQL-5.6.37 RPM

Group: applications/databaseLicense: GPL

URL: http://www.mysql.comSource0: mysql-5.6.37.tar.gz

BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-rootBuildRequires: cmake,ncurses-devel#Requires:AutoReqProv: no

%description

this is rpmbuilding mysql5.6.37 rpm%define MYSQL_USER mysql%define MYSQL_GROUP mysql%prep

%setup -q -n mysql-%{version}

%build

cmake . \\

-DCMAKE_INSTALL_PREFIX:=/usr/local/mysql-5.6.37 \\-DMYSQL_DATADIR=/data/mysql \\-DSYSCONFDIR=/etc \\

-DWITH_MYISAM_STORAGE_ENGINE=1 \\-DWITH_INNOBASE_STORAGE_ENGINE=1 \\-DWITH_MEMORY_STORAGE_ENGINE=1 \\-DWITH_READLINE=1 \\

-DMYSQL_UNIX_ADDR=/tmp/mysql.sock \\-DMYSQL_TCP_PORT=3306 \\-DENABLED_LOCAL_INFILE=1 \\

-DWITH_PARTITION_STORAGE_ENGINE=1 \\-DEXTRA_CHARSETS=all \\-DDEFAULT_CHARSET=utf8 \\

-DDEFAULT_COLLATION=utf8_general_cimake -j `cat /proc/cpuinfo | grep processor| wc -l`

%install

rm -rf %{buildroot}

make install DESTDIR=%{buildroot}%clean

rm -rf %{buildroot}

%files

%defattr(-, %{MYSQL_USER}, %{MYSQL_GROUP})

%attr(755, %{MYSQL_USER}, %{MYSQL_GROUP}) /usr/local/mysql-5.6.37/*%pre

mkdir -p /data/mysql

if ! id %{MYSQL_USER} > /dev/null 2>&1;then useradd -M -s /sbin/nologin %{MYSQL_USER}fi

chown -R mysql:mysql /data/mysql

%post

/usr/local/mysql-5.6.37/scripts/mysql_install_db --basedir=/usr/local/mysql-5.6.37 --datadir=/data/mysql --user=mysqlcp /usr/local/mysql-5.6.37/support-files/mysql.server /etc/init.d/mysqldchmod +x /etc/init.d/mysqldchkconfig mysqld on

cp /usr/local/mysql-5.6.37/my.cnf /etc/my.cnf%preun

service mysqld stopchkconfig --del mysqlduserdel mysql

rm -rf /home/mysqlrm -rf /data/mysql

rm -rf /etc/init.d/mysqld

rm -rf /usr/local/mysql-5.6.37

%changelog

完成了spec⽂件后,于是使⽤如下命令进⾏编译:

[wadeson@testdb SPECS]$ rpmbuild --helpUsage: rpmbuild [OPTION...]--quiet

Build options with [ | | ]:

-bp build through %prep (unpack sources and apply patches) from -bc build through %build (%prep, then compile) from

-bi build through %install (%prep, %build, then install) from -bl verify %files section from

-ba build source and binary packages from -bb build binary package only from -bs build source package only from

-tp build through %prep (unpack sources and apply patches) from -tc build through %build (%prep, then compile) from

-ti build through %install (%prep, %build, then install) from -ta build source and binary packages from $rpmbuild -bb mysql.spec

这⾥会输出相应的编译过程,如遇到错误,可根据提⽰做相应修改最终没有错误的话,会在如下⽬录⽣成rpm包:

[wadeson@testdb SPECS]$ ll ../RPMS/x86_64/mysql-5.6.37-1.el6.x86_64.rpm

-rw-rw-r--. 1 wadeson wadeson 53414300 Aug 27 23:48 ../RPMS/x86_64/mysql-5.6.37-1.el6.x86_64.rpm

在上述参数中,补充⼀些知识:查看整个rpm包的宏变量

rpmbuild --showrc:显⽰rpm所有的宏

[wadeson@testdb SPECS]$ rpmbuild --showrc|grep _initddir 显⽰单个宏的值-14: _initddir %{_sysconfdir}/rc.d/init.d

__rm /bin/rm:两个下划线后接命令,代表的就是当前系统本⾝的命令

得到相应的mysql的rpm包后,就可以进⾏ansible批量安装了

[root@testdb ~]# yum install mysql-5.6.37-1.el6.x86_64.rpm 这个过程会在下⾯输出mysql的初始化过程

接下来就可以查看数据⽬录,配置⽂件以及basedir:[root@testdb ~]# ll /data/mysql/总⽤量 110604

-rw-rw----. 1 mysql mysql 12582912 8⽉ 28 00:19 ibdata1-rw-rw----. 1 mysql mysql 50331648 8⽉ 28 00:19 ib_logfile0-rw-rw----. 1 mysql mysql 50331648 8⽉ 28 00:19 ib_logfile1drwx------. 2 mysql mysql 4096 8⽉ 28 00:19 mysql

drwx------. 2 mysql mysql 4096 8⽉ 28 00:19 performance_schemadrwx------. 2 mysql mysql 4096 8⽉ 28 00:19 test配置⽂件做相应的修改,就可以正常的启动mysql了

定制rpm包:

定制RPM安装包可以满⾜⼤规模⾃动化部署的场景,将得到的rpm包通过ansible进⾏分发并安装,并提供不同的配置⽂件,这样还是很⽅便的

因篇幅问题不能全部显示,请点此查看更多更全内容