定制化RPM服务

第1章 RPM的原理及应用

1.1 RPM介绍

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

RPM是一个开放的软件包管理系统。它工作于Red Hat Linux以及其它LinuxUNIX 系统,可被任何人使用。redhat软件公司鼓励其它厂商来了解RPM并在自己的产品中使用它。RPM的发布基于GPL协议。对于最终用户来说,使用RPM所提供的功能来维护系统是比较容易和轻松的。安装、卸载和升级RPM软件包只需一条命令就可以搞定。RPM维护了一个所有已安装的软件包和文件的数据库,可以让用户进行查询和验证工作。在软件包升级过程中,RPM会对配置文件进行特别处理,绝对不会丢失以往的定制信息。对于程序员RPM可以让我们连同软件的源代码打包成源代码和二进制软件包供最终用户使用。

RPM拥有功能强大的查询选项。我们可以搜索数据库来查询软件包或文件。也可以查出某个文件属于哪个软件包或出自哪儿。RPM软件包中的文件是以压缩格式存放的,拥有一个定制的二进制头文件,其中包含有关包和内容的信息,可以让我们对单个软件包的查询简便又快速。

RPM另一个强大的功能是进行软件包的验证。如果我们担心误删了某个软件包中的某个文件,我们就可以对它进行验证。任何非正常现象将会被通知。如果需要的话还可以重新安装该软件包。在重新安装过程中,所有被修改过的配置文件将被保留。

RPM设计目标之一就是要保持软件包的原始特征, 就象该软件的原始发布者发布软件时那样。通过使用RPM我们可以拥有最初的软件和最新的补丁程序,还有详细的软件构建信息。

概括的说:RPM有五种基本的操作功能(不包括创建软件包):安装、卸载、升级、查询、和验证。关于rpm命令的使用我们可以用以下命令:

rpm –help

1.2 RPM功能

1.2.1 安装

rpm -ivh name1.rpm ... nameN.rpm

通过rpm -ivh可以把rpm软件包安装到系统中,使用该选项可以解决大部分rpm软件包的安装,可使用rpm --help查看详细的参数说明。

1.2.2 删除

rpm -e name1 ... nameN

可以使用-e参数卸载rpm包

1.2.3 升级

rpm -Uvh  name1.rpm ... nameN.rpm

由于开源软件更新速度快,用户当然要使用最新版本的软件包,此时最合适的就是rpm升级功能,当然最理想的参数选项就是-Uvh

1.2.4 查询

rpm -q  options name1

实际上我们通常使用rpm工具最多的功能还是它的查询功能,比如查看软件包的版本、依赖关系等软件包的详细说明都要用到。最有用的参数选项是-qpi

1.2.5 校验已安装的软件包

rpm -V  name1

可用通过-V参数来验证已安装软件包

第2章 FPM原理及应用

FPM的作者是jordansissel

FPMgithubhttps://github.com/jordansissel/fpm 

FPM功能简单说就是将一种类型的包转换成另一种类型。

2.1 FPM支持的包类型

支持的源类型包:

包类型(源)

含义

dir

将目录打包成所需要的类型,可以用于源码编译安装的软件包

rpm

rpm包进行转换

gem

rubygem包进行转换

python

python模块打包成相应的类型

 

支持的目标类型包:

包类型(目标)

含义

rpm

转换为rpm

deb

转换为deb

solaris

转换为solaris

puppt

转换为puppet

2.2 安装FTP工具

fpmruby写的,因此系统环境需要ruby,且ruby版本号大于1.8.5

q  安装ruby模块

yum -y install ruby rubygems ruby-devel

q  查看当前使用的rubygems仓库

gem sources list

q  添加淘宝的Rubygems仓库,移除原生的Ruby仓库

gem sources --add https://ruby.taobao.org/ --remove http://rubygems.org/

q  安装一个低版本的json

gem install json -v 1.8.3

q  安装FPM工具

gem install fpm –v 1.3.3

q  查看fpm版本

gem list fpm
gem list json

注:centos7系统可直接gem install fpm安装

2.3 FTP参数详解

常用参数如下:

-s

指定源类型

-t

指定目标类型,即想要制作为什么包

-n

制定包的名字

-v

制定包的版本号

-C

指定打包的相对路径

-d

制定依赖于哪些包

-f

强制输出,会覆盖前一个版本(默认为false

-p

输出的安装包存放目录,如果不想放在当前目录就需要指定

--post-install

指定软件包安装完成后需要运行的脚本

--pre-install

指定软件包安装完成前需要运行的脚本

--post-uninstall

指定软件包卸载完成后需要运行的脚本

--pre-uninstall

指定软件包卸载完成前需要运行的脚本

第3章 定制Nginx服务实践

3.1 安装Nginx服务

yum install pcre pcre-devel openssh openssl-devel -y
useradd  -u 888 -s /sbin/nologin -M www
cd /usr/local/src
wget http://nginx.org/download/nginx-1.12.2.tar.gz
tar xf nginx-1.12.2.tar.gz
cd nginx-1.12.2
./configure --user=www --group=www --with-http_ssl_module --with-http_stub_status_module --prefix=/opt/nginx-1.12.2
make && make install
ln -s /opt/nginx-1.12.2 /opt/nginx

3.2 FPM打包脚本

安装之后需要执行的操作脚本:

[root@ntp scripts]# cat nginx_rpm.sh
#!/bin/bash
#Date:      2017-12-20
#Version:   V1.0
#Description:   do something after nginx.rpm installed
user=`cat /etc/passwd| awk -F ":" '{print $1}' | grep "www" | wc -l`
if [ $user -eq 0 ]
then
    useradd -u 888 -s /sbin/nologin -M www
fi
ln -s /opt/nginx-1.12.2 /opt/nginx

卸载之后需要执行的脚本:

#!/bin/bash
/opt/nginx/sbin/nginx -s stop
userdel -rf www
rm -rf /opt/nginx
rm -rf /opt/nginx-1.12.2

3.3 FPM打包命令

[root@ntp scripts]# fpm -s dir -t rpm -n nginx -v 1.12.2 -d "pcre pcre-devel openssh openssl-devel" --post-install /service/scripts/nginx_rpm.sh --pre-uninstall /service/scripts/nginx_rpm_rm.sh  -f /opt/nginx-1.12.2
no value for epoch is set, defaulting to nil {:level=>:warn}
no value for epoch is set, defaulting to nil {:level=>:warn}
Created package {:path=>"nginx-1.12.2-1.x86_64.rpm"}
第4章 定制MySQL实践

4.1 安装MySQL数据库

cd /usr/local/src
wget http://mirrors.sohu.com/mysql/MySQL-5.5/mysql-5.5.55-linux2.6-x86_64.tar.gz
useradd -s /sbin/nologin mysql -M
tar xf mysql-5.5.55-linux2.6-x86_64.tar.gz
mv mysql-5.5.55-linux2.6-x86_64 /opt/mysql-5.5.55
ln -s /opt/mysql-5.5.55 /opt/mysql
chown -R mysql.mysql /opt/mysql*

4.2 FPM打包脚本

安装前脚本:

#!/bin/bash
 
#add mysql-server user
useradd -s /sbin/nologin -M mysql
 
#create mysql soft link
ln -s /opt/mysql-5.5.55 /opt/mysql
chown -R mysql.mysql /opt/mysql
chown -R mysql.mysql /opt/mysql-5.5.55
 
#init mysql database
cd /opt/mysql/scripts &&\
./mysql_install_db --basedir=/opt/mysql/ --datadir=/opt/mysql/data --user=mysql >/dev/null
 
#config file
\cp /opt/mysql/support-files/my-small.cnf /etc/my.cnf
 
#startup scripts
cp /opt/mysql/support-files/mysql.server /etc/init.d/mysqld
sed -i 's#/usr/local/mysql#/opt/mysql#g' /etc/init.d/mysqld
sed -i 's#/usr/local/mysql#/opt/mysql#g' /opt/mysql/bin/mysqld_safe
sed -i 's#basedir=$#basedir=/opt/mysql#g' /etc/init.d/mysqld
sed -i 's#datadir=$#datadir=/opt/mysql/data#g' /etc/init.d/mysqld
chmod 777 /etc/init.d/mysqld
 
#set env var
echo 'export PATH=/opt/mysql/bin:$PATH' >> /etc/profile
source /etc/profile

卸载后脚本:

#!/bin/bash
 
#stop mysql service
/etc/init.d/mysqld stop
 
#set env var
sed -i 's#export PATH=/opt/mysql/bin:$PATH##g' /etc/profile
source /etc/profile
 
#remove file
rm -f /etc/init.d/mysqld
rm -f /etc/my.cnf
rm -fr /opt/mysql
rm -rf /opt/mysql-5.5.55
 
#delete mysql user
userdel -r mysql

4.3 FPM打包命令

fpm -s dir -t rpm -n mysql -v 5.5.55 --post-install /service/scripts/mysql_rpm.sh --post-uninstall /service/scripts/mysql_rpm_rpm.sh -f /opt/mysql-5.5.55
no value for epoch is set, defaulting to nil {:level=>:warn}
no value for epoch is set, defaulting to nil {:level=>:warn}
Created package {:path=>"mysql-5.5.55-1.x86_64.rpm"}
第5章 安装RPM

安装rpm包的三种方法:

5.1 RPM命令安装

可以直接使用命令rpm安装,但此方法需要事先安装依赖包,有些时候很麻烦,不推荐:

rpm -ivh nginx-1.12.2-1.x86_64.rpm
Preparing...                ########################################### [100%]
   1:nginx                  ########################################### [100%]

5.2 YUM本地安装

这个命令会自动先安装rpm包的依赖包,然后再安装rpm

yum -y localinstall nginx-1.12.2-1.x86_64.rpm

5.3 YUM仓库安装

搭建yum仓库,然后直接通过命令安装:

yum -y install nginx


自此,FPM自定义封装MySQL和Nginx服务完毕!