公司安装服务器 boos编译安装太慢
需要把mysql5.7生成rpm包
yum install rpm* rpm-build rpmdev*
yum install -y gcc make gcc-c++ cmake bison-devel ncurses ncurses-devel bzip2-devel python-devel python-libs bzip2 libicu-devel
1.建立一个普通用户,有普通用户来制作rpm,用root的可能会因为代码问题导致毁灭的后果
useradd ibuler
su - ibuler
2.确定我们在哪个目录下制作RPM,通常这个目录我们topdir,这个需要在宏配置文件中指定,这个配置文件称为macrofiles,它们通常为 /usr/lib/rpm/macros:/usr/lib/rpm/macros.*:~/.rpmmacros,这个在rhel 5.8中可以通过rpmbuild --showrc | grep macrofiles 查看,6.3的我使用这个找不到,但使用是一样的。你可以通过rpmbuild --showrc | grep topdir 查看你系统默认的工作车间
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
我们还是自定义工作目录(或车间)吧
vi ~/.rpmmacros
%_topdir /home/ibuler/rpmbuild ##目录可以自定义
mkdir ~/rpmbuild
3.在topdir下建立需要的目录
cd ~/rpmbuild
mkdir -pv {BUILD,BUILDROOT,RPMS,SOURCES,SPECS,SRPMS}
4.把收集的源码放到SOURCES下
cp /export/boost_1_59_0.tar.gz SOURCES ##事先放好的
cp /export/mysql-5.7.17.tar.gz SOURCES ##事先放好的
5.在SPECS下建立重要的spec文件
/home/ibuler/rpmbuild/SPECS
vi mysql-5.7.17.spec ##内容见后讲解,rhel6.3会自动生成模板
6.用rpmbuild命令制作rpm包,rpmbuild命令会根据spec文件来生成rpm包
rpmbuild
-ba 既生成src.rpm又生成二进制rpm
-bs 只生成src的rpm
-bb 只生二进制的rpm
-bp 执行到pre
-bc 执行到 build段
-bi 执行install段
-bl 检测有文件没包含
我们可以一步步试,先rpmbuild -bp ,再-bc 再-bi 如果没问题,rpmbuild -ba 生成src包与二进制包吧
rpmbuild -ba /home/ibuler/rpmbuild/SPECS/mysql-5.7.17.spec
7.安装测试有没有问题,能否正常安装运行,能否正常升级,卸载有没有问题
spec文件
Name: mysql
Version: 5.7.17
Release: 1%{?dist}
Summary: mysql_install
Group: System Environment/Daemons
License: GPLv2
URL: http://www.boost.org/users/history/version_1_59_0.html&&http://dev.mysql.com/downloads/mysql/
Source0: boost_1_59_0.tar.gz
Source1: %{name}-%{version}.tar.gz
Source2: my.cnf
BuildRoot: %(mktemp -ud %{_tmppath}/%{name}-%{version}-%{release}-XXXXXX)
BuildRequires: gcc,make,gcc-c++,cmake,bison-devel,ncurses,ncurses-devel,bzip2-devel,python-devel,python-libs,bzip2,libicu-devel
%description
Build mysql-5.7.17.tar.gz to mysql-5.7.17.rpm
%prep
%setup -q -b 0 -b 1
%build
cd ../boost_1_59_0
BOOST_ROOT=`pwd`
export BOOST_ROOT
./bootstrap.sh --prefix=%{buildroot}/usr/ --with-toolset=gcc --with-icu
install -d -m 755 %{buildroot}/usr/
./b2 install threading=multi link=shared
cd ../mysql-5.7.17
make -j3 %{?_smp_mflags}
%install
make install DESTDIR=%{buildroot}
install -d -m 755 %{buildroot}/usr/
%{__install} -p -D %{SOURCE2} %{buildroot}/export/servers/mysql/etc/my.cnf
%pre
if [ $1 == 1 ];then
# /usr/sbin/useradd mysql -M -s /sbin/nologin 2>/dev/null
useradd mysql
mysqldir=(/export/data/mysql/tmp /export/data/mysql/data /export/servers/mysql/etc /export/data/mysql/dumps /export/data/mysql/log /home/mysql/scripts /home/mysql/logs)
mkdir -p ${mysqldir[*]}
chown mysql:mysql -R /export/data/mysql /home/mysql/
serverid=$(ifconfig |grep Bcast|grep 'inet addr:' | awk '{print $2}' |awk -F. '{print $3$4}')
sed -i 's/360360/'$serverid'/' /export/servers/mysql/etc/my.cnf
if [ ! -z $pool ];then sed -i 's/innodb_buffer_pool_size = 20G/innodb_buffer_pool_size = '$pool'/' /export/servers/mysql/etc/my.cnf;echo -e "\033[;37;34m
`cat /export/servers/mysql/etc/my.cnf|grep innodb_buffer_pool_size`\033[0m";fi
echo -e "\033[;37;32mDONE\033[0m"
fi
%post
if [ $1 == 1 ];then
/export/servers/mysql/bin/mysqld --initialize --user=mysql --basedir=/export/servers/mysql/ --datadir=/export/data/mysql/data/ --initialize-insecure
/sbin/install-info %{_infodir}/%{name}.info %{_infodir}/dir 2> /dev/null || :
fi
%preun
if [ $1 == 0 ];then
/usr/sbin/userdel -r mysql 2> /dev/null
/etc/init.d/mysqld stop > /dev/null 2>&1
/sbin/chkconfig --del mysqld 2> /dev/null
/sbin/install-info --delete %{_infodir}/%{name}.info %{_infodir}/dir 2> /dev/null || :
fi
%postun
if [ $1 == 0 ];then
rm -rf /usr/local/mysql 2> /dev/null
rm -rf /usr/bin/mysql* 2> /dev/null
rm -rf /etc/my.cnf 2> /dev/null
rm -rf /etc/init.d/mysqld 2> /dev/null
fi
%clean
rm -rf %{buildroot}
%files
%defattr(-,root,root,-)
%doc
/export/servers/mysql
%changelog
到此整个流程完毕。下面来说说其中最最重要的spec的格式,先说最简单的,最容易实现的
- vi tengine.spec
- ### 0.define section #自定义宏段,这个不是必须的
- ### %define nginx_user nginx #这是我们自定义了一个宏,名字为nginx_user值为nginx,%{nginx_user}引用
- ### 1.The introduction section #介绍区域段
- Name: tengine #名字为tar包的名字
- Version: 1.4.2 #版本号,一定要与tar包的一致哦
- Release: 1%{?dist} #释出号,也就是第几次制作rpm
- Summary: tengine from TaoBao #软件包简介,最好不要超过50字符
- Group: System Environment/Daemons #组名,可以通过less /usr/share/doc/rpm-4.8.0/GROUPS 选择合适组
- License: GPLv2 #许可,GPL还是BSD等
- URL: http://laoguang.blog.51cto.com #可以写一个网址
- Packager: Laoguang <ibuler@qq.com>
- Vendor: TaoBao.com
- Source0: %{name}-%{version}.tar.gz
- #定义用到的source,也就是你收集的,可以用宏来表示,也可以直接写名字,上面定义的内容都可以像上面那样引用
- #patch0: a.patch #如果需要补丁,依次写
- BuildRoot: %_topdir/BUILDROOT
- #这个是软件make install 的测试安装目录,也就是测试中的根,我们不用默认的,我们自定义,
- #我们可以来观察生成了哪此文件,方便写file区域
- BuildRequires: gcc,make #制作过程中用到的软件包
- Requires: pcre,pcre-devel,openssl,chkconfig #软件运行需要的软件包,也可以指定最低版本如 bash >= 1.1.1
- %description #软件包描述,尽情的写吧
- It is a Nginx from Taobao. #描述内容
- ### 2.The Prep section 准备阶段,主要目的解压source并cd进去
- %prep #这个宏开始
- %setup -q #这个宏的作用静默模式解压并cd
- #%patch0 -p1 #如果需要在这打补丁,依次写
- ### 3.The Build Section 编译制作阶段,主要目的就是编译
- %build
- ./configure \ #./configure 也可以用%configure来替换
- --prefix=/usr \ #下面的我想大家都很熟悉
- --sbin-path=/usr/sbin/nginx \
- --conf-path=/etc/nginx/nginx.conf \
- --error-log-path=/var/log/nginx/error.log \
- --http-log-path=/var/log/nginx/access.log \
- --pid-path=/var/run/nginx/nginx.pid \
- --lock-path=/var/lock/nginx.lock \
- --user=nginx \
- --group=nginx \
- --with-http_ssl_module \
- --with-http_flv_module \
- --with-http_stub_status_module \
- --with-http_gzip_static_module \
- --http-client-body-temp-path=/var/tmp/nginx/client/ \
- --http-proxy-temp-path=/var/tmp/nginx/proxy/ \
- --http-fastcgi-temp-path=/var/tmp/nginx/fcgi/ \
- --http-uwsgi-temp-path=/var/tmp/nginx/uwsgi \
- --http-scgi-temp-path=/var/tmp/nginx/scgi \
- --with-pcre
- make %{?_smp_mflags} #make后面的意思是:如果就多处理器的话make时并行编译
- ### 4.Install section 安装阶段
- %install
- rm -rf %{buildroot} #先删除原来的安装的,如果你不是第一次安装的话
- make install DESTDIR=%{buildroot}
- #DESTDIR指定安装的目录,而不是真实的安装目录,%{buildroot}你应该知道是指的什么了
- ### 4.1 scripts section #没必要可以不写
- %pre #rpm安装前制行的脚本
- if [ $1 == 1 ];then #$1==1 代表的是第一次安装,2代表是升级,0代表是卸载
- /usr/sbin/useradd -r nginx 2> /dev/null ##其实这个脚本写的不完整
- fi
- %post #安装后执行的脚本
- %preun #卸载前执行的脚本
- if [ $1 == 0 ];then
- /usr/sbin/userdel -r nginx 2> /dev/null
- fi
- %postun #卸载后执行的脚本
- ### 5.clean section 清理段,删除buildroot
- %clean
- rm -rf %{buildroot}
- ### 6.file section 要包含的文件
- %files
- %defattr (-,root,root,0755) #设定默认权限,如果下面没有指定权限,则继承默认
- /etc/ #下面的内容要根据你在%{rootbuild}下生成的来写
- /usr/
- /var/
- ### 7.chagelog section 改变日志段
- %changelog
- * Fri Dec 29 2012 laoguang <ibuler@qq.com> - 1.0.14-1
- - Initial version
http://laoguang.blog.51cto.com/6013350/1103628