1.1 yum介绍
YUM主要用于自动安装、升级rpm软件包,它能自动查找并解决rpm包之间的依赖关系。要成功的使用YUM工具安装更新软件或系统,就需要有一个包含各种rpm软件包的repository(软件仓库),这个软件仓库我们习惯称为yum源。网络上有大量的yum源,但由于受到网络环境的限制,导致软件安装耗时过长甚至失败。特别是当有大量服务器大量软件包需要安装时,缓慢的进度条令人难以忍受。因此我们在优化系统时,都会更换国内的源。相比较而言,本地YUM源服务器最大优点是局域网的快速网络连接和稳定性。有了局域网中的YUM源服务器,即便在Internet连接中断的情况下,也不会影响其他YUM客户端的软件安装和升级。
1.2 rpm 介绍
1.2.1 概述
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命令的使用我们可以用以下命令:
[root@hostname root]rpm -help
1.2.2 RPM工具功能
1) 安装
rpm -i ( or --install) options file1.rpm ... fileN.rpm 通过rpm -ivh可以把rpm软件包安装到系统中,当然也可以使用不同的参数选项,笔者建议使用-ivh ,使用该选项可以解决大部分rpm软件包的安装,至于详细的参数说明可用查看rpm的man 文档。
2 )删除
rpm -e ( or --erase) options pkg1 ... pkgN 如果某个软件包你再也不想使用了,那就用以上这个命令彻底的把你指定的rpm软件包清除掉把。
3 )升级
rpm -U ( or --upgrade) options file1.rpm ... fileN.rpm 由于开源软件更新速度快,用户当然要使用最新版本的软件包,此时最合适的就是rpm升级功能,当然最理想的参数选项就是-Uvh。
4 )查询
rpm -q ( or --query) options 实际上我们通常使用rpm工具最多的功能还是它的查询功能,比如查看软件包的版本、依赖关系等软件包的详细说明都要用到。最有用的参数选项是-qpi。
5 )校验已安装的软件包
rpm -V ( or --verify, or -y) options 一般我们可用通过该命令来验证已安装软件包,根据笔者的经验该命令一般没什么用途,只做一个了解就ok了。
参考:https://www.ibm.com/developerworks/cn/linux/l-rpm/
1.3 FPM打包工具
1.3.1 FPM功能
简单说就是将一种类型的包转换成另一种类型。
1.3.2 . 支持的源类型包
dir #将目录打包成所需要的类型,可以用于源码编译安装的软件包 rpm #对rpm进行转换 gem #对rubygem包进行转换 python #将python模块打包成相应的类型
1.3.3 支持的目标类型包
rpm #转换为rpm包 deb #转换为deb包 solaris #转换为solaris包 puppet #转换为puppet模块
1.4 服务端配置
1.4.1 FPM安装
fpm是ruby写的,因此系统环境需要ruby,且ruby版本号大于1.8.5。 # 安装ruby模块 yum -y install ruby rubygems ruby-devel # 查看当前使用的rubygems仓库 gem sources list # 添加淘宝的Rubygems仓库,外国的源慢,移除原生的Ruby仓库 gem sources -a http://mirrors.aliyun.com/rubygems/ --remove http://rubygems.org/ # 安装fpm,gem从rubygem仓库安装软件类似yum从yum仓库安装软件。首先安装低版本的json,高版本的json需要ruby2.0以上,然后安装低版本的fpm,够用。 gem install json -v 1.8.3 gem install fpm -v 1.3.3 # 上面的2步安装仅适合CentOS6系统,CentOS7系统一步搞定,即gem install fpm [root@m01 tools]# gem install fpm Fetching: cabin-0.9.0.gem (100%) Successfully installed cabin-0.9.0 Fetching: backports-3.11.1.gem (100%) Successfully installed backports-3.11.1 Fetching: arr-pm-0.0.10.gem (100%) Successfully installed arr-pm-0.0.10 Fetching: clamp-1.0.1.gem (100%) Successfully installed clamp-1.0.1 Fetching: ffi-1.9.21.gem (100%) Building native extensions. This could take a while... ....... Parsing documentation for pleaserun-0.0.30 Installing ri documentation for pleaserun-0.0.30 Parsing documentation for fpm-1.9.3 Installing ri documentation for fpm-1.9.3 14 gems installed [root@m01 tools]# echo $? #不知道有没有安装好的话,可以检测这条命令是否执行成功 0 说明:过程可能会有点慢
1.4.1.1 安装时遇到的问题
1.Need executable 'rpmbuild' to convert dir to rpm {:level=>:error} 解决方法: [root@m01~]# yum install -y rpm-build 2.如果里面有gcc make的错误. 解决方法: yum install -y gcc
1.4.2 FPM参数
详细使用见fpm –help
常用参数 -s 指定源类型 -t 指定目标类型,即想要制作为什么包 -n 指定包的名字 -v 指定包的版本号 -C 指定打包的相对路径 Change directory to here before searching forfiles -d 指定依赖于哪些包 -f 第二次打包时目录下如果有同名安装包存在,则覆盖它 -p 输出的安装包的目录,不想放在当前目录下就需要指定 --post-install 软件包安装完成之后所要运行的脚本;同--after-install --pre-install 软件包安装完成之前所要运行的脚本;同--before-install --post-uninstall 软件包卸载完成之后所要运行的脚本;同--after-remove --pre-uninstall 软件包卸载完成之前所要运行的脚本;同--before-remove
1.4.3 使用实例–实战定制nginx的RPM包
1.4.3.1 安装nginx
- 检测80端口是否开启或者被占用(如果开启请关闭)
lsof -i:80
- 检查防火墙是否开启(我这是centos7)
[root@cs tools]# systemctl status firewalld ● firewalld.service - firewalld - dynamic firewall daemon Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled) Active: inactive (dead)
- 检查selinux是否开启
[root@cs tools]# grep 'SELINUX' /etc/selinux/config # SELINUX= can take one of these three values: SELINUX=disabled # SELINUXTYPE= can take one of three two values: SELINUXTYPE=targeted
- 下载并安装nginx
yum -y install pcre-devel openssl-devel useradd nginx -M -s /sbin/nologin tar xf nginx-1.12.2.tar.gz cd nginx-1.12.2 ./configure --prefix=/application/nginx-1.12.2 --user=nginx --group=nginx --with-http_ssl_module --with-http_stub_status_module make && make install ln -s /application/nginx-1.12.2/ /application/nginx
1.4.4 编写脚本
[root@oldboy ~]# cd /server/scripts/ [root@oldboy scripts]# vim nginx_rpm.sh # 这是安装完rpm包要执行的脚本 #!/bin/bash useradd nginx -M -s /sbin/nologin ln -s /application/nginx-1.12.2/ /application/nginx
1.4.5 打包
[root@oldboy ~]# fpm -s dir -t rpm -n nginx -v 1.12.2 -d 'pcre-devel,openssl-devel' --post-install /server/scripts/nginx_rpm.sh -f /application/nginx-1.12.2/ Created package {:path=>"nginx-1.12.2-1.x86_64.rpm"} fpm #固定命令 -t #指定目标类型,即想要制作为什么包 -s #指定源类型 rpm #对rpm进行转换 dir #将目录打包成所需要的类型,可以用于源码编译安装的软件包 -n #指定包名 -v #指定包的版本号 -d #指定依赖哪些包 -f #第二次打包时目录下如果有同名安装包在,则覆盖它 --post-install #软件包安装完成之后所要运行的脚本;同--after-install libiconv-devel (打包php的时候5.5以上的php不要安装这个依赖包,否则你打包好之后,yum安装会报错) [root@m01 server]# ll -h nginx-1.12.2-1.x86_64.rpm -rw-r--r-- 1 root root 2.6M Feb 21 03:13 nginx-1.12.2-1.x86_64.rpm
- 查看rpm自带执行脚本,执行脚本是不是以文件的形式存在rpm中的
[root@cs tools]# rpm -qp --scripts nginx-1.12.2-1.x86_64.rpm postinstall scriptlet (using /bin/sh): #!/bin/bash useradd nginx -M -s /sbin/nologin ln -s /application/nginx-1.12.2/ /application/nginx
- 查看rpm的依赖
[root@cs tools]# rpm -qpR nginx-1.12.2-1.x86_64.rpm pcre-devel openssl-devel /bin/sh rpmlib(PayloadFilesHavePrefix) <= 4.0-1 rpmlib(CompressedFileNames) <= 3.0.4-1
- 查看rpm的内容
[root@cs tools]# rpm -qpl nginx-1.12.2-1.x86_64.rpm /application/nginx-1.12.2/conf/fastcgi.conf /application/nginx-1.12.2/conf/fastcgi.conf.default /application/nginx-1.12.2/conf/fastcgi_params /application/nginx-1.12.2/conf/fastcgi_params.default /application/nginx-1.12.2/conf/koi-utf /application/nginx-1.12.2/conf/koi-win /application/nginx-1.12.2/conf/mime.types ....
- 查看rpm包信息
[root@cs tools]# rpm -qpi nginx-1.12.2-1.x86_64.rpm Name : nginx Version : 1.12.2 Release : 1 Architecture: x86_64 Install Date: (not installed) Group : default Size : 5686816 License : unknown Signature : (none) Source RPM : nginx-1.12.2-1.src.rpm Build Date : Wed 21 Feb 2018 01:24:36 PM CST Build Host : cs Relocations : / Packager : <root@cs> Vendor : root@cs URL : http://example.com/no-uri-given Summary : no description given Description : no description given
1.4.6 安装rpm包
1.4.6.1 安装rpm包的三种方法
rpm命令安装 [root@LB-nginx-01 ~]# rpm -ivh nginx-1.12.2-1.x86_64.rpm error: Failed dependencies: pcre-devel is needed by nginx-1.12.2-1.x86_64 openssl-devel is needed by nginx-1.12.2-1.x86_64 但会报如上依赖错误,需要先yum安装依赖才能安装rpm包。 yum命令安装rpm包 yum -y localinstall nginx-1.12.2-1.x86_64.rpm 这个命令会自动先安装rpm包的依赖,然后再安装rpm包。 搭建内网yum仓库YUM仓库搭建
1.4.7 错误说明:
[root@m01 application]# fpm -s dir -t rpm -n mysql -v 5.6.34 -f /application/mysql-5.6.34-linux-glibc2.5-x86_64 --post-install /server/scripts/mysql_rpm.sh All flags should be before the first argument (stray flags found: ["--post-install"] {:level=>:warn} Invalid package configuration: Cannot package the path './--post-install', does it exist? {:level=>:error} 解决方法: --post-install不能放到最后,选项的顺序最好不要随意变换
1.4.8 安装createrepo软件(创建存储库)
yum -y install createrepo
- 创建yum仓库目录
mkdir -p /application/nginx/html/CentOS7/ #将保存好的rpm包放入/application/nginx/html/CentOS7/
- 初始化yum仓库
createrepo -pdo /application/nginx/html/CentOS7/ /application/nginx/html/CentOS7/
- 当有新的rpm包执行更新(刚开始不用执行)
createrepo --update /application/nginx/html/CentOS7/
- 修改nginx配置文件,好默认能够访问CentOS目录下的rpm包
cat >/application/nginx/conf/nginx.conf<<EOF worker_processes 1; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; server { listen 80; server_name localhost; location / { root html/CentOS7; autoindex on; ##开启目录浏览功能,默认是不支持的 index index.html index.htm; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } } } EOF
- 检查语法重启nginx服务
/application/nginx/sbin/nginx -t /application/nginx/sbin/nginx
- 只下载软件不安装
yum install yum-utils -y #安装yum包相关软件 yumdownloader pcre-devel openssl-devel
- 每加入一个rpm包就要更新一下
createrepo --update/application/nginx/html/CentOS7
#访问ip可以查看yum仓库内容,下面会多个一个repodata/目录,是createrepo生成的。
#这是一个简单的yum仓库就搭建完成了,但是现在只有nginx的功能,以后可以增加更多的内容,放进来目录即可
1.5 客户端部署
- 备份原有repo
cd /etc/yum.repos.d/ mkdir yum_bak #把之前的yum源移动到刚创建的目录做备用 mv *.repo yum_bak
- 新建一个本地yum源文件
cat >/etc/yum.repos.d/local.repo<<EOF [local] name=Server baseurl=http://10.0.0.61 enabled=1 gpgcheck=0 EOF
- 清空之前的缓存
yum clean all
- 在哪个路径下执行yum操作没有影响
[root@web01 yum.repos.d]# yum install nginx
- 检查nginx是否安装成功
[root@web01 yum.repos.d]# netstat -lntup|grep nginx tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 2022/nginx [root@web01 yum.repos.d]# ps -ef|grep nginx root 2022 1 0 21:52 ? 00:00:00 nginx: master process/application/nginx/sbin/nginx www 2023 2022 0 21:52 ? 00:00:00 nginx: worker process root 2027 1947 0 21:52 pts/1 00:00:00 grep nginx
- 其他
cachedir=/var/cache/yum //yum 缓存的目录,yum 在此存储下载的rpm 包和数据库,默认设置为/var/cache/yum keepcache=0 //安装完成后是否保留软件包,0为不保留(默认为0),1为保留 debuglevel=2 //Debug 信息输出等级,范围为0-10,缺省为2 logfile=/var/log/yum.log //yum 日志文件位置。用户可以到/var/log/yum.log 文件去查询过去所做的更新。 exactarch=1 //有1和0两个选项,设置为1,则yum 只会安装和系统架构匹配的软件包,例如,yum 不会将i686的软件包安装在适合i386的系统中。默认为1。 obsoletes=1 //这是一个update 的参数,具体请参阅yum(8),简单的说就是相当于upgrade,允许更新陈旧的RPM包。 gpgcheck=1 // 有1和0两个选择,分别代表是否是否进行gpg(GNU Private Guard) 校验,以确定rpm 包的来源是有效和安全的。这个选项如果设置在[main]部分,则对每个repository 都有效。默认值为0。 plugins=1 //是否启用插件,默认1为允许,0表示不允许。我们一般会用yum-fastestmirror这个插件。 installonly_limit=5 #允许保留多少个内核包。 distroverpkg=redhat-release //指定一个软件包,yum 会根据这个包判断你的发行版本,默认是redhat-release,也可以是安装的任何针对自己发行版的rpm 包。
rpm的常用命令
rpm -qpi your.rpm #查看rpm包信息 rpm -qpl your.rpm #查看rpm包内容 rpm -qpR your.rpm #查看rpm包的依赖 rpm -qp --scripts your.rpm #查看rpm包要执行的脚本,存的不是文件了。 rpm -ivh your.rpm #安装rpm包
老男孩参考文档http://blog.oldboyedu.com/autodeploy-rpm/