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=mysql
cp /usr/local/mysql-5.6.37/support-files/mysql.server /etc/init.d/mysqld
chmod +x /etc/init.d/mysqld
chkconfig mysqld on
cp /usr/local/mysql-5.6.37/my.cnf /etc/my.cnf
%preun # 是卸载RPM包执行的命令,主要用于清理
service mysqld stop
chkconfig --del mysqld
userdel mysql
rm -rf /home/mysql
rm -rf /data/mysql
rm -rf /etc/init.d/mysqld
rm -rf /usr/local/mysql-5.6.37
%changelog
下面是一个完整的spec文件:
Name: mysql
Version: 5.6.37
Release: 1%{?dist}
Summary: MySQL-5.6.37 RPM
Group: applications/database
License: GPL
URL: http://www.mysql.com
Source0: mysql-5.6.37.tar.gz
BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root
BuildRequires: 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_ci
make -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=mysql
cp /usr/local/mysql-5.6.37/support-files/mysql.server /etc/init.d/mysqld
chmod +x /etc/init.d/mysqld
chkconfig mysqld on
cp /usr/local/mysql-5.6.37/my.cnf /etc/my.cnf
%preun
service mysqld stop
chkconfig --del mysqld
userdel mysql
rm -rf /home/mysql
rm -rf /data/mysql
rm -rf /etc/init.d/mysqld
rm -rf /usr/local/mysql-5.6.37
%changelog
完成了spec文件后,于是使用如下命令进行编译:
[wadeson@testdb SPECS]$ rpmbuild --help
Usage: 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_logfile1
drwx------. 2 mysql mysql 4096 8月 28 00:19 mysql
drwx------. 2 mysql mysql 4096 8月 28 00:19 performance_schema
drwx------. 2 mysql mysql 4096 8月 28 00:19 test
配置文件做相应的修改,就可以正常的启动mysql了
定制rpm包:
定制RPM安装包可以满足大规模自动化部署的场景,将得到的rpm包通过ansible进行分发并安装,并提供不同的配置文件,这样还是很方便的