RPM全称是 Red Hat Package Manager(Red Hat包管理器)。几乎所有的 Linux 发行版本都使用这种形式的软件包管理安装、更新和卸载软件。
RPM是一个开放的软件包管理系统。它工作于Red Hat Linux以及其它Linux和UNIX 系统,可被任何人使用。redhat软件公司鼓励其它厂商来了解RPM并在自己的产品中使用它。RPM的发布基于GPL协议。对于最终用户来说,使用RPM所提供的功能来维护系统是比较容易和轻松的。安装、卸载和升级RPM软件包只需一条命令就可以搞定。RPM维护了一个所有已安装的软件包和文件的数据库,可以让用户进行查询和验证工作。在软件包升级过程中,RPM会对配置文件进行特别处理,绝对不会丢失以往的定制信息。对于程序员RPM可以让我们连同软件的源代码打包成源代码和二进制软件包供最终用户使用。
RPM拥有功能强大的查询选项。我们可以搜索数据库来查询软件包或文件。也可以查出某个文件属于哪个软件包或出自哪儿。RPM软件包中的文件是以压缩格式存放的,拥有一个定制的二进制头文件,其中包含有关包和内容的信息,可以让我们对单个软件包的查询简便又快速。
RPM另一个强大的功能是进行软件包的验证。如果我们担心误删了某个软件包中的某个文件,我们就可以对它进行验证。任何非正常现象将会被通知。如果需要的话还可以重新安装该软件包。在重新安装过程中,所有被修改过的配置文件将被保留。
RPM设计目标之一就是要保持软件包的原始特征, 就象该软件的原始发布者发布软件时那样。通过使用RPM我们可以拥有最初的软件和最新的补丁程序,还有详细的软件构建信息。
概括的说:RPM有五种基本的操作功能(不包括创建软件包):安装、卸载、升级、查询、和验证。关于rpm命令的使用我们可以用以下命令:
rpm –help
rpm -ivh name1.rpm ... nameN.rpm
通过rpm -ivh可以把rpm软件包安装到系统中,使用该选项可以解决大部分rpm软件包的安装,可使用rpm --help查看详细的参数说明。
rpm -e name1 ... nameN
可以使用-e参数卸载rpm包。
rpm -Uvh name1.rpm ... nameN.rpm
由于开源软件更新速度快,用户当然要使用最新版本的软件包,此时最合适的就是rpm升级功能,当然最理想的参数选项就是-Uvh。
rpm -q options name1
实际上我们通常使用rpm工具最多的功能还是它的查询功能,比如查看软件包的版本、依赖关系等软件包的详细说明都要用到。最有用的参数选项是-qpi。
rpm -V name1
可用通过-V参数来验证已安装软件包。
FPM的作者是jordansissel
FPM的github:https://github.com/jordansissel/fpm
FPM功能简单说就是将一种类型的包转换成另一种类型。
支持的源类型包:
包类型(源) | 含义 |
dir | 将目录打包成所需要的类型,可以用于源码编译安装的软件包 |
rpm | 对rpm包进行转换 |
gem | 对rubygem包进行转换 |
python | 将python模块打包成相应的类型 |
支持的目标类型包:
包类型(目标) | 含义 |
rpm | 转换为rpm包 |
deb | 转换为deb包 |
solaris | 转换为solaris包 |
puppt | 转换为puppet包 |
fpm是ruby写的,因此系统环境需要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安装
常用参数如下:
-s | 指定源类型 |
-t | 指定目标类型,即想要制作为什么包 |
-n | 制定包的名字 |
-v | 制定包的版本号 |
-C | 指定打包的相对路径 |
-d | 制定依赖于哪些包 |
-f | 强制输出,会覆盖前一个版本(默认为false) |
-p | 输出的安装包存放目录,如果不想放在当前目录就需要指定 |
--post-install | 指定软件包安装完成后需要运行的脚本 |
--pre-install | 指定软件包安装完成前需要运行的脚本 |
--post-uninstall | 指定软件包卸载完成后需要运行的脚本 |
--pre-uninstall | 指定软件包卸载完成前需要运行的脚本 |
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
安装之后需要执行的操作脚本:
[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
[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"}
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*
安装前脚本:
#!/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
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"}
安装rpm包的三种方法:
可以直接使用命令rpm安装,但此方法需要事先安装依赖包,有些时候很麻烦,不推荐:
rpm -ivh nginx-1.12.2-1.x86_64.rpm Preparing... ########################################### [100%] 1:nginx ########################################### [100%]
这个命令会自动先安装rpm包的依赖包,然后再安装rpm包
yum -y localinstall nginx-1.12.2-1.x86_64.rpm
搭建yum仓库,然后直接通过命令安装:
yum -y install nginx 自此,FPM自定义封装MySQL和Nginx服务完毕!
原文地址:http://blog.51cto.com/13178102/2052563