目录
1. 安装软件的方式
1 编译安装软件
优点:定制优化安装目录;按需开启功能;可定制(定制安装目录和软件功能),一般情况下不需要网络,可选择软件版本
缺点:需要查找并誓言出适合的编译参数;很多人碰到软件版本升级,某些参数已经取消掉了,并且报错提示非常明显,但还是有很多人无所适从;mysql、php等软件编译耗时较长;慢、复杂,需要查找编译参数(文多了大神们讨厌),找依赖很麻烦,纯编译一开就比较复杂;
2 YUM安装软件
优点:全自动化安装;简单,c便捷;不需要为依赖问题发愁了;
缺点:自主性太差;网络太差,网络不好下载速度慢;没有办法定制、软件的功能,存放位置都已经固定好了,不易变更;
3 二进制安装
优点:简单、快;
缺点:不能定制、包容量大(mysql的二进制包近200M)
2. 定制RPM包
根据自己的需求编译软件è制作RPM包è搭建内网yum仓库èyum安装
结合前两者的优点,暂未发现说明缺点,可能的缺点就是RPM包的通用型差,只能适用于本公司的环境,另外一般人不会定制RPM包。
缺点:第一步编译安装复杂,打包不能再再次更改,一般人不会这个方法。
这是互联网企业运维自动化的必备技能,è自动化运维的基石
2.1 RPM简介
1. RPM的全称是Red Hat PackageManager(red hat包管理器)
2. 几乎所有的Linux发行版本都使用这种形式的软件包管理安装、更新和卸载软件。
3. rpm命令有五种基本功能(不包括创建软件包);安装、卸载、升级、查询和验证。
4. 关于rpm命令的使用我们可以使用rpm –help来获得。
5. rpmbuild是redhat系的原生打包命令,这个命令的使用难点主要在于spec文件的编写,语法复杂。
6. 参考定制nginx的spec文件
2.2 fpm工具介绍
- FPM的作者是iordansissel
- FPM的github:https://github.com/jordansissel/fpm
- FPM功能简单说就是将一种类型的包转换成另一种类型
支持的源类型包
ü dir 将目录打包成所需要的类型,可以用于源码编译安装的软件包
l rpm 对rpm进行转换
l gem 对rubygem包进行转换
l python 将python模块打包成响应的类型
支持的目标类型包
ü rpm 转换为rpm包
l deb 转换为deb包
l solaris 转换为salaris包
l puppet 转换为puppet模块
2.3 FPM安装 *****
1 fpm是ruby写的,因此系统环境需要ruby,且ruby版本号大于1.8.5
yum -y install ruby rubygems ruby-devel #<== 安装ruby依赖
rpm -qa ruby rubygems ruby-devel
2 安装fpm工具
gem sources -a http://mirrors.aliyun.com/rubygems/
#<== 换成阿里云的rubygems仓库,外国的源慢
gem sources --remove http://rubygems.org/ #<== 移除原生的ruby仓库
gem sources --list #<== 查看软件源,会显示aliyun.的
gem install fpm -v 1.3.3
#<== -v参数指定安装fpm-1.3.3版本的软件,fpm这个工具升级平凡,而且在每次升级后会出现各种样的问题,但是老版本的fpm工具能够满足我们的需求,因此使用此版本了。如果后面不加-v参数,默认会下载最新版本(如果安装不成功可以先下载最新版本然后再尝试下载1.3.3版本)
fpm --help #<==只要能使用,就表示安装成功
如果以上下载不成功执行第二种方法,如下
gem sources -a https://ruby.taobao.org/ #<== 添加淘宝的 rubygems仓库
gem sources --remove http://rubygems.org/ #<== 移除原生的ruby仓库
gem sources –list
gem install fpm -v 1.3.3
fpm --help #<==只要能使用,就表示安装成功
-----------------关于fpm安装时出现错误的解决方法--------------------
解决方法1:
不指定版本安装一次 gem install fpm
指定版本安装一次 gem install fpm -v 1.3.3
解决办法2:
gem install json -v 1.8.3
gem install fpm -v 1.3.3
3. FPM常用参数—>详细使用见fpm --help
fpm参数 |
解释说明 |
-s |
指定源类型 *** |
-t |
指定目标类型,即想要制作为什么包 *** |
-n |
指定包的名字 *** |
-v |
指定包的版本号 *** |
-C |
指定打包的相对路径 |
-d |
指定依赖于那些包 *** |
-f |
第二次打包时目录如果有同名安装包存在,则覆盖它 ** |
-p |
输出的安装包的目录,不想放在当前目录下就需要指定 |
-post-install |
软件包安装完之后所要运行的脚本;同-after-install *** |
-pre-install |
软件包安装完成之前所要运行的版本;同-before-install ** |
-post-uninstall |
软件包卸载完成之后所要运行的版本,同-after-remove |
-pre-uninstall |
软件包卸载完成之前所要运行的脚本,同-before-remove |
2.4 yum安装时如何解决依赖问题的
- 在使用yum安装软件a时,yum会在下载完A的rpm包后,对该rpm包进行检查(rpm包中会给出安装rpm包依赖的基础库和软件),如果检查出A的安装还要依赖软件B,那么此时yum就会自动下载并安装B,B安装完毕后,就会继续安装A,如果是内网yum源的话,我们只需要把B放在内网yum网即可,如果检查出A的安装不需要其他软件的支持,那么yum会自动安装A
- 因此使用fpm打包使用-d参数添加依赖关系。
-
实战定制nginx的RPM包 *****
1 查看系统环境
[[email protected] ~]# cat /etc/redhat-release #<== 查看系统版本
CentOS release 6.7 (Final)
[[email protected] ~]# uname -r #<== 查看系统内核
2.6.32-573.el6.x86_64
[[email protected] ~]# getenforce #<== SELinux为关闭状态
Disabled
[[email protected] ~]# /etc/init.d/iptables stop #<== 防火墙确认为关闭
2. 准备环境
mkdir -p /home/oldboy/tools #<== 软件包统一存放目录(规范)
mkdir -p /application/ #<== 软件统一安装目录
sed -i ‘s#keepcache=0#keepcache=1#g‘ /etc/yum.conf #<== 开启yum缓存
find /var/cache/ -type f -name ‘*rpm‘|xargs rm -f #<== 清空本机yum缓存,排除rpm包干扰
3. 编译安装web服务软件nginx
yum -y install pcre pcre-devel opensslopenssl-devel
cd /home/oldboy/tools
wget -q https://nginx.org/download/nginx-1.6.3.tar.gz
tar xf nginx-1.6.3.tar.gz
useradd -M -u504 -s /sbin/nologin nginx
cd/home/nginx/tools/nginx-1.6.3
./configure --user=nginx --group=nginx --prefix=/application/nginx-1.6.3/ --with-http_stub_status_module --with-http_ssl_module
make && make install
4. 将以上安装nginx的依赖包进行打包
find /var/cache/ -type f -name ‘*rpm‘ #<== 使用该命令,查找nginx安装后的依赖包并进行打包
我进行打包时,收缩到的依赖包都在这两个目录下(/var/cache/yum/x86_64/6/base/packages/ 和 var/cache/yum/x86_64/6/updates/packages/),然后使用mv命令将其移动到一起,在相对路径下打包,命令如下:
cd/var/cache/yum/x86_64/6/updates/packages
mv */var/cache/yum/x86_64/6/base/packages/
cd/var/cache/yum/x86_64/6/base/
tar zcf nginx_yum.tar.gz./packages/*
5. 编写脚本
mkdir -p /server/scripts/
cd /server/scripts/
vim nginx_rpm.sh #<== 这是安装完rpm包要执行的脚本
#!/bin/bash
useradd -u504 -M -s /sbin/nologinnginx
ln -s /application/nginx-1.6.3//application/nginx
/application/nginx/sbin/nginx
cat >>/etc/rc.local<<EOF
#This is start nginx service Yes
/application/nginx/sbin/nginx
EOF
6. 打包(rpm包)
cd /server/scripts/
fpm -s dir -t rpm -n nginx-v 1.6.3 -d ‘pcre-devel,openssl-devel‘ --post-install /server/scripts/nginx_rpm.sh-f /application/nginx-1.6.3/
#<== -s:指定源类型;-n:指定包名字;-v:指定包版本号;-d:指定依赖包;多个依赖包以逗号分隔符;-post-install:安装完rpm包后执行的脚本;-f:如果下面有同名的话强制覆盖;
显示出来的内容暗黄色的表示正确的,红色的则代表作错误
sz nginx-1.6.3-1.x86_64.rpm #<== 下载下来
fpm与rpmbuild命令关系:在第一个窗口执行打包命令,再另外打开一个窗口,使用top命令,可以看到rpmbuild进程,因此,fpm命令其实是对rpmbuild命令进行封装,其实底层还是rpmbuild命令,因此系统必须要有rpmbuild命令,如果没有,使用yum安装:yum -y installrpm-build
fpm打包注意事项
l 1. 相对路径问题:不要使用相对路径,如果使用相对路径打包时打包就会从根开始,安装到根(/)下了,热不是指定的/application/nginx-1.6.3/目录。和tar打包类似,只是fpm能被yum命令识别而已。
l 2. 软连接问题:当删除一个软连接文件时(rm-f nginx)它可以删除,但是如果是(rm -f nginx/)后面机上路径符的话他代表一个目录,如果想rm -fr nginx/这样删除的话源目录和软连接目录都会存在,就是两者下面的都没有啦。
rpm常用命令组合
说明 |
rpm命令组合 |
查看rpm帮助 |
man rpm |
查看rpm包信息 |
rpm -qpi nginx-1.6.3-1.x86_64.rpm |
查看rpm包内容 |
rpm -qpl nginx-1.6.3-1.x86_64.rpm |
查看rpm包依赖 |
rpm -qpR nginx-1.6.3-1.x86_64.rpm |
查看rpm包带的执行脚本, 执行脚本不是以文件的形式存在rpm包中· |
rpm -qp --scripts nginx-1.6.3-1.x86_64.rpm |
安装rpm包 |
rpm -lvh nginx-1.6.3-1.x86_64.rpm |
rpm -lvh --ald *.rpm |
1. 自动安装或更新rpm包。 2. 如果自己找的依赖包少了,它还会自动帮我们到网上去下载 |
rpm -lvh --ald *.rpm #<== --aid参数解决RPM包循环依赖的问题,即当前目录有所有相互依赖的rpm包,就可以用这种方法,就是说把所有的依赖包放在一个目录里面,然后通过这条命令,rpm就会自动把nginx软件的依赖包都安装好,然后再安装nginx包,自动解决依赖问题 |
3. 安装rpm包 *****
- 首先确认Nginx的rpm包和依赖包的tar包已经下载到windows,如果没有问题就对当前状态做个快照,然后还原初始快照。
- 还原完后,新的机器是没有Nginx的,上传rpm包和tar(nginx依赖)包
cd /home/oldboy/tools/
rz (nginx-1.6.3-1.x86_64.rpm和nginx_yum.tar.gz)
安装rpm包的三种方法
1. yum命令安装rpm包(本地测试成功)
yum localinstallnginx-1.6.3-1.x86_64.rpm
# 这个命令会自动先从网络安装rpm包的依赖,然后再安装Nginx的rpm包
2. fpm命令安装
[[email protected]]# rpm -ivh nginx-1.6.3-1.x86_64.rpm #<== 啊喔!安装报错
error: Failed dependencies:
pcre-devel is neededby nginx-1.6.3-1.x86_64
openssl-devel isneeded by nginx-1.6.3-1.x86_64
以上报错是因为缺少软件包,必须手动安装(缺点)
rpm -ivhopenssl-devel-1.0.1e-42.el6.x86_64.rpm #<== 必须手动先安装依赖包
rpm -ivh pcre-devel-7.8-7.el6.x86_64.rpm #<== 必须手动先安装依赖包
解决方法:
1 yum安装依赖包
2以上报错是因为缺少软件依赖包,必须一个一个手动安装(缺点)
rpm -ivhopenssl-devel-1.0.1e-42.el6.x86_64.rpm #<== 必须手动先安装依赖包
rpm -ivh pcre-devel-7.8-7.el6.x86_64.rpm #<== 必须手动先安装依赖包
3如果本机已有所有的依赖包,就可以用下面的方法。
tar xfnginx_yum.tar.gz #<== 解压nginx依赖包(将所有需要的rpm包放在一个目录)
rpm -ivh--aid *.rpm
执行命令如下
[[email protected] tools]# rpm -ivh --aid *rpm #<== 报错--
Preparing... ###########################################[100%]
file/usr/lib64/libkadm5clnt_mit.so.8.0 from install ofkrb5-libs-1.10.3-42z1.el6_7.x86_64 conflicts with file from packagekrb5-libs-1.10.3-42.el6.x86_64
………………
报错原因:rpm包冲突,使用U参数,因为有些包本地有,需要更新。
[[email protected] tools]# rpm -Uvh --aid *rpm #<== 正确
Preparing... ########################################### [100%]
1:krb5-libs ########################################### [ 9%]
--------------------------内容省略------------------------------------
10:openssl-devel ########################################### [91%]
11:nginx ########################################### [100%]
3. 搭建内网yum仓库
具体见yum仓库搭建----------
4. 定制LNMP的RPM包思路
1. 编译安装好nginx、mysql、php,此处有个问题,就是php的大部分依赖环境时通过yum安装,但又一个libiconv-1.14.tar.gz包需要编译安装,安装时已经制定了安装目录,只需一同打包即可。
2. 还有一个问题,就是mysql这个目录比较大,用fpm打包耗时长,平时我们有可能需要对nginx或php做优化,这样有得重新打包,因此我们可以将mysql分离出来,分别打包,只需在制作nginx+php的rpm包时添加mysql的依赖即可