博客是我工作的好帮手,遇到困难就来博客找资料
分类: 系统运维
2017-03-13 15:59:24
1. 程序包管理器的功能
我们知道,由程序员编写并提供的程序源代码要转换成目标二进制格式才能在计算机上运行起来,但用户要在平台上使用时需要手动编译安装后才能使用,对于普通用户来说有一定难度。因此为了降低普通用户对应用程序的使用难度,程序员可在提供源代码的同时提供已在特定环境下编译好的程序文件,只要用户的平台环境和程序员的平台环境相同,就可以通过解压程序员提供的二进制格式文件即可使用,而无需自己手动编译安装。
一个已编译好的程序由二进制程序、库文件、配置文件和帮助手册等组成,而程序包管理器的功能就是将编译好的应用程序的各组成文件(二进制程序、库文件、配置文件、帮助文件等)打包成一个或几个程序包文件,从而更方便地实现程序包的安装、升级、卸载和查询等管理操作。
2. 源码到程序包的转换过程
3. rpm包管理器概述
rpm是Redhat公司针对自己的操作系统RHEL提出的一种管理软件包的方法,rpm原来全称为RedHat Package Manager,后来由于rpm包管理器的使用方便以及Redhat公司采取各种商业策略,使得rpm成为了工业标准,其他系统可借鉴使用rpm,因此rpm全称后来改为:RPM Package Manager。在系统上只要安装了rpm包管理器,那么只要符合rpm标准的程序包文件都可以实现更为方便地安装、升级、卸载和查询等管理操作。
4. 为什么要使用rpm?
Linux的哲学思想之一是“一个程序只做一件事,并且做好”。因此Linux经常通过使用众多功能单一的程序来完成复杂任务,最常见的例子是管道命令的使用。而各个程序功能的单一,带来的问题是各个程序文件之间的产生了极大的依赖性,这是一个需要解决的问题。此外,要安装各种功能的程序,而各程序在安装时的路径、生成的文件各不相同,这给卸载某程序将带来极大麻烦,极不方便管理,以及对程序的版本的管理等。在Linux上只要安装rpm包管理器即可解决以上问题,rpm包管理器可将编译好的各个应用程序组成文件打包成一个或有限个rpm程序包,每个包中会记录当前包的依赖性。一旦程序包安装了之后,rpm会追踪其各个文件的安装路径(包括程序运行时产生的临时文件)。rpm包管理器就是通过这种方式来实现对rpm程序包的管理的,而对程序包的管理无外乎是安装、升级、卸载、查询等操作。
5. 程序包管理器的组成部分
程序包管理器由程序包组成清单和数据库两部分组成:
(1)程序包的组成清单(每个程序都单独实现):
①文件清单
②安装或卸载时运行的脚本
(2)数据库(为所有rpm程序包所共用):
①程序包的名称和版本
②依赖关系
③功能说明
④安装生成的各个文件的文件路径及校验码信息
6. rpm包命名格式
rpm包有主包和支包(主包的子包)之分,支包作为主包的功能性补充。其中rpm主包的命名格式为:name-VERSION-release.arch.rpm。各个部分解释如下:
name:程序名
VERSION:版本
VERSION由三部分组成:
①major:程序的主版本号
②minor:程序的次版本号
③release:程序的修订号
release[.os].arch:代表rpm包的发行号
①release[.os]:rpm版本+操作系统
②arch:archetecture,支持的硬件架构。常见的硬件架构有i386, x64(amd64), ppc, noarch(支持任何架构)等
举个例子,zsh-5.0.2-25.el7.x86_64.rpm代表:该zsh程序包的主版本号为5,次版本号为0,修订号为2;rpm的版本号为25,支持的操作系统是RHEL 7(CentOS 7),支持的硬件架构是x86_64。
对于支包来说,其命名格式为:
name-function-VERSION-release.arch.rpm
常见的function有:devel, utils(工具程序), libs, ...
7. 获取程序包的途径
如何获取rpm包呢?
(1)系统发行版的光盘或官方的文件服务器(或镜像站点)
常见的镜像网站如:
(2)项目的官方站点
(3)第三方组织
(a)EPEL
(b)搜索引擎
...
(4)自己制作rpm包
建议:检查其合法性(来源合法性、程序包的完整性)
8. CentOS系统上rpm命令管理程序包
8.1. 安装
语法格式:
rpm {-i|--install} [install-options] PACKAGE_FILE ...
常用命令选项:
-v:verbose,输出详细的过程信息;
-vv:very verbose,输出更为详细的过程信息;
安装选项(install-options):
-h:hash marks输出进度条;hash标记符为#,每个#表示2%的进度;
--test:测试安装,检查并报告依赖关系及冲突信息等;相当于dry run;
--nodeps:忽略依赖关系,不建议使用;
--replacepkgs:重新安装;
--noscripts:指定不运行脚本;
--nosignature:不检查包签名信息,即不检查程序包的来源合法性;
--nodigest:不检查包完整性信息;
用法:
rpm -ivh PACKAGE_FILE ...
注意:rpm可以自带脚本
最多有四类脚本:(--noscripts可指定不运行这四类脚本)
preinstall:安装过程开始之前运行的脚本,%pre;--nopre可指定不运行;
postinstall:安装过程完成之后运行的脚本,%post;--nopost可指定不运行;
preuninstall:卸载过程真正开始执行之前运行的脚本,%preun;--nopreun可指定不运行;
postuninstall:卸载过程完成之后运行的脚本,%postun;--nopostun可指定不运行;
命令演示:
安装zsh,首先挂载光盘:
[root@osyunwei ~]# mkdir /media/cdrom
[root@osyunwei ~]# mount /dev/sr0 /media/cdrom
mount: block device /dev/sr0 is write-protected, mounting read-only
用rpm下载zsh:
[root@osyunwei ~]# cd /media/cdrom/Packages/
[root@osyunwei Packages]# rpm -ivh zsh-4.3.11-4.el6.centos.2.x86_64.rpm
Preparing... ########################################### [100%]
1:zsh ########################################### [100%]
8.2. 升级
语法格式:
rpm {-U|--upgrade} [install-options] PACKAGE_FILE ...
rpm {-F|--freshen} [install-options] PACKAGE_FILE ...
常用选项:
-U:升级或安装;
-F:升级;
-v:同“安装”;
-vv:同“安装”.
安装选项(install-options):
--oldpackage:降级 --> 某些程序升级后遇到不兼容的情况,此时需要降级;
--force:强制升级 --> 某些程序升级后会引起依赖性问题,此时可能会用到此选项;
其他安装选项同“安装”。
用法:
rpm -Uvh PACKAGE_FILE ...
rpm -Fvh PACKAGE_FILE ...
注意:
(1)Linux支持多内核版本并存,所以不要对内核做升级操作,因为这样有可能会导致无法“回滚”,建议直接安装新版本内核即可。
(2)如果某原程序包的配置文件安装后曾被修改过,则在升级时,新版本的程序提供的同一个配置文件不会覆盖原有版本的配置文件,而是把新版本的配置文件重命名(FILENAME.rpmnew)后提供;
命令演示:
查看当前已安装的zsh的版本:
[root@osyunwei ~]# rpm -q zsh
zsh-4.3.11-4.el6.centos.2.x86_64
从网易镜像站点下载zsh-5.0.2-25.el7_3.1.x86_64.rpm程序包:
[root@osyunwei ~]# wget /centos/7/updates/x86_64/Packages/zsh-5.0.2
25.el7_3.1.x86_64.rpm
用rpm升级zsh:
[root@osyunwei ~]# rpm -Uvh zsh-5.0.2-25.el7_3.1.x86_64.rpm
warning: zsh-5.0.2-25.el7_3.1.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID f4a80eb5
: NOKEY
error: Failed dependencies:
libc.so.6(GLIBC_2.14)(64bit) is needed by zsh-5.0.2-25.el7_3.1.x86_64
libc.so.6(GLIBC_2.15)(64bit) is needed by zsh-5.0.2-25.el7_3.1.x86_64
发现有依赖关系导致无法升级。
此时若要强行升级可使用--nodeps选项:
[root@osyunwei ~]# rpm -Uvh --nodeps zsh-5.0.2-25.el7_3.1.x86_64.rpm
warning: zsh-5.0.2-25.el7_3.1.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID f4a80eb5
: NOKEY
Preparing... ########################################### [100%]
1:zsh ########################################### [100%]
注意:忽略依赖性升级后程序不一定能正常运行!
再将zsh降级:
[root@osyunwei ~]# cd /media/cdrom/Packages/
[root@osyunwei Packages]# rpm -Uvh --oldpackage zsh-4.3.11-4.el6.centos.2.x86_64.rpm
Preparing... ########################################### [100%]
1:zsh ########################################### [100%]
8.3. 卸载
语法格式:
rpm {-e|--erase} [--allmatches] [--nodeps] [--test] PACKAGE_NAME ...
卸载选项(erase options):
--allmatches:卸载所有匹配指定名称的程序包的各版本;
--nodeps:忽略依赖关系;
--test:测试卸载,dry run模式。
用法:
rpm -e PACKAGE_NAME
命令演示:
卸载已安装的zsh程序包:
[root@osyunwei ~]# rpm -e zsh
如果没有任何显示就说明卸载成功了!
8.4. 查询
语法格式:
rpm {-q|--query} [select-options] [query-options]
[select-options]:
PACKAGE_NAME:查询指定的程序包是否安装,及其版本;
-a, --all:查询所有已经安装过的包;
-f, --file FILE:查询指定的文件由哪个程序包安装生成;
-p, --package PACKAGE_FILE:用于实现对未安装的程序包执行查询操作;
--whatprovides CAPABILITY:查询指定的CAPABILITY由哪个程序包提供;
--whatrequires CAPABILITY:查询指定的CAPABILITY被哪个包所依赖。
[query-options]:
--changelog:查询rpm包的changelog;
-i, --info:程序包相关的信息,版本号、大小、所属的包组等
-l, --list:程序包安装生成的所有文件列表;
-c, --configfiles:查询指定的程序包提供的配置文件;
-d, --docfiles:查询指定的程序包提供的文档;
--provides:列出指定的程序包提供的所有的CAPABILITY;
-R, --requires:查询指定的程序包的依赖关系;
--scripts:查看程序包自带的脚本片段。
用法:
rpm -qi PACKAGE
rpm -qf FILE
rpm -qc PACKAGE
rpm -qd PACKAGE
rpm -qpi PACKAGE_FILE
rpm -apl PACKAGE_FILE
rpm -qpc PACKAGE_FILE
列了这么多个选项,不如来个实例吧!
(1)查看zsh是否已经安装:
[root@osyunwei ~]# rpm -qa | grep '^zsh'
zsh-4.3.11-4.el6.centos.2.x86_64 //显示已安装zsh;
或:
[root@osyunwei ~]# rpm -q zsh
zsh-4.3.11-4.el6.centos.2.x86_64 //显示已安装zsh;
(2)查询/etc/fstab由哪个程序包安装生成:
[root@osyunwei ~]# rpm -qf /etc/fstab
setup-2.8.14-20.el6_4.1.noarch
(3)列出安装httpd生成的所有文件列表:
[root@osyunwei ~]# rpm -ql httpd
(4)列出httpd程序包的依赖关系:
[root@osyunwei ~]# rpm -qR httpd
/bin/bash
/bin/sh
.....(省略).....
libz.so.1()(64bit)
rpmlib(CompressedFileNames) <= 3.0.4-1
.....(省略).....
rpmlib(VersionedDependencies) <= 3.0.3-1
rtld(GNU_HASH)
system-logos >= 7.92.1-1
rpmlib(PayloadIsXz) <= 5.2-1
(5)查看httpd程序包提供的文档:
[root@osyunwei ~]# rpm -qd httpd
/usr/share/doc/httpd-2.2.15/ABOUT_APACHE
/usr/share/doc/httpd-2.2.15/CHANGES
/usr/share/doc/httpd-2.2.15/LICENSE
/usr/share/doc/httpd-2.2.15/NOTICE
/usr/share/doc/httpd-2.2.15/README
/usr/share/doc/httpd-2.2.15/VERSIONING
/usr/share/man/man8/apachectl.8.gz
/usr/share/man/man8/htcacheclean.8.gz
/usr/share/man/man8/httpd.8.gz
/usr/share/man/man8/rotatelogs.8.gz
/usr/share/man/man8/suexec.8.gz
(6)查询httpd程序包提供的配置文件:
[root@osyunwei ~]# rpm -qc httpd
/etc/httpd/conf.d/welcome.conf
/etc/httpd/conf/httpd.conf
/etc/httpd/conf/magic
/etc/logrotate.d/httpd
/etc/sysconfig/htcacheclean
/etc/sysconfig/httpd
/var/www/error/HTTP_BAD_GATEWAY.html.var
/var/www/error/HTTP_BAD_REQUEST.html.var
.....(以下省略).....
(7)查看httpd程序包自带的脚本片段:
[root@osyunwei ~]# rpm -q --scripts httpd
(8)列出bash程序包提供的所有的CAPABILITY:
[root@osyunwei ~]# rpm -q --provides bash
config(bash) = 4.1.2-40.el6
bash = 4.1.2-40.el6
bash(x86-64) = 4.1.2-40.el6
(9)查看httpd程序包提供的所有的CAPABILITY:
[root@osyunwei ~]# rpm -q --provides httpd
config(httpd) = 2.2.15-53.el6.centos
httpd-mmn = 20051115
httpd-suexec = 2.2.15-53.el6.centos
.....(中间省略).....
mod_vhost_alias.so()(64bit)
webserver
.....(以下省略).....
(10)查询指定的CAPABILITY (这里为webserver)由哪个程序包提供:
[root@osyunwei ~]# rpm -q --whatprovides webserver
httpd-2.2.15-53.el6.centos.x86_64
(11)查询指定的CAPABILITY (这里为bash)被哪个包所依赖:
[root@osyunwei ~]# rpm -q --whatrequires bash
jline-0.9.94-0.8.el6.noarch
initscripts-9.03.53-1.el6.centos.x86_64
dracut-004-409.el6.noarch
lvm2-2.02.143-7.el6.x86_64
rsyslog-5.8.10-10.el6_6.x86_64
cronie-1.4.4-15.el6_7.1.x86_64
autofs-5.0.5-122.el6.x86_64
eclipse-pde-3.6.1-6.13.el6.x86_64
(12)查看bash的更新日志(changelog):
[root@osyunwei ~]# rpm -q --changelog bash
...
* Fri Oct 17 1997 Donnie Barnes
- added BuildRoot
* Tue Jun 03 1997 Erik Troan
- built against glibc
(13)查看程序包相关的信息,版本号、大小、所属的包组等:
[root@osyunwei ~]# rpm -qi zsh
8.5. 校验
用途:可检查程序包中的数据是否被修改过。
语法格式:
rpm {-V|--verify} [select-options] [verify-options]
用法:
rpm -V PACKAGE_NAME
校验属性:
S file Size differs
M Mode differs (includes permissions and file type)
5 digest (formerly MD5 sum) differs
D Device major/minor number mismatch
L readLink(2) path mismatch
U User ownership differs
G Group ownership differs
T mTime differs
P caPabilities differ
命令演示:
修改zsh程序包的配置文件,首先查看zsh程序包的配置文件有哪些:
[root@osyunwei ~]# rpm -qc zsh
/etc/skel/.zshrc
/etc/zlogin
/etc/zlogout
/etc/zprofile
/etc/zshenv
/etc/zshrc
用vim修改/etc/zshrc文件,在首行添加一个'#'字符,然后再用-V选项检验:
[root@osyunwei ~]# vim /etc/zshrc
[root@osyunwei ~]# rpm -V zsh
S.5....T. c /etc/zshrc
显然,文件/etc/zshrc的大小、md5值、时间戳(mtime)发生了变化。
8.6. 数据库重建
默认rpm管理器的数据库路径为/var/lib/rpm,刚才的查询操作正是通过此处的数据库进行。
获取帮助:
CentOS 6:man rpm
CentOS 7:man rpmdb
语法格式:
rpm {--initdb|--rebuilddb} [-v] [--dbpath DIRECTORY] [--root DIRECTORY]
常用选项:
--initdb:初始化数据库,当前无任何数据库可初试化创建一个新的数据库;当前有时不执行任何操作;
--rebuilddb:重新构建,通过遍历读取当前系统上所有已经安装过的程序包进行重新创建;
命令演示:
在/tmp/mydb目录下创建初始化数据库:
[root@osyunwei ~]# rpm --initdb --dbpath /tmp/mydb
[root@osyunwei ~]# ls /tmp/mydb/
__db.001 __db.002 __db.003 __db.004 Packages
在/tmp/mydb目录下重新创建数据库:
[root@osyunwei ~]# rpm --rebuilddb --dbpath /tmp/mydb
[root@osyunwei ~]# ls /tmp/mydb/
Packages
注意:不一定能够重建完整的数据库,所以慎用该命令吧!
8.7. 包来源合法性验证和完整性验证
首先要了解一下什么是数字签名?
数字签名就是用本地密钥去加密对应数据的特征码。
程序包开发者将程序包制作好之后,采用单向加密算法对程序包进行计算,得到定长特征码,再
用私钥对这段定长特征值进行加密,并将加密过的特征码附于程序包尾部,这就是数字签名。
程序使用者先得到开发者的公钥,用于解密特征码,如果解密成功,说明来源合法;然后使用者在本地对该程序包用单向加密算法再次计算出定长特征码,如果使用者计算出的特征码和程序开发者提供的特征码相同,则说明程序数据完整。虽然用了两种加密算法,但却没有保密性的概念,而是作为验证。
特征码有没有被篡改的可能性?假设中间人得到程序包的特征值后,想篡改特征码,但篡改后需要用本地私钥进行加密,因此来源就不合法了,更不用谈完整性了,所以特征码是无法修改的。
但存在一个问题,就是使用者如何获得正确的公钥?这要求下载公钥的网站的正确性以及数据在网络传输过程中的安全性,涉及网络安全问题。
对于CentOS发行版来说,假设已获取正确的公钥,那么导入信任的包制作者的公钥(或签名密钥)操作如下:
rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
两种验证方式:
(1)安装此组织签名的程序时,程序内部会自动执行验证。
(2)手动验证:rpm -K PACKAGE_FILE,同样由程序内部自行执行校验操作。
命令演示:
校验zsh程序包的来源合法性及数据完整性:
[root@osyunwei Packages]# rpm -K zsh-4.3.11-4.el6.centos.2.x86_64.rpm
zsh-4.3.11-4.el6.centos.2.x86_64.rpm: rsa sha1 (md5) pgp md5 OK //校验通过;
1. yum概述
之前在上一篇文章里提到的rpm包管理器虽然在数据库中为用户指定了程序包之间的依赖关系,但用户仍需根据程序包的依赖关系去手动使用rpm命令来安装每个程序包,过程略为繁琐。而yum作为前端管理工具则为用户解决这一问题。
yum的全称为:Yellow dog Updater, Modifier,是通过修改Yellow Dog Linux的Yellow Dog Updater开发而成。
yum是基于rpm包管理器的前端程序包管理器,可以从指定服务器上自动下载程序包,并自动分析程序包的元数据、自动处理程序包之间的依赖关系,能一次性安装完所有依赖的包,而无须繁琐地一次次安装所有依赖包。
需要注意的是,yum前端管理工具是基于rpm管理功能的,因此yum不能脱离rpm而存在。yum只是让程序包管理起来更为方便,但不意味着可以取代rpm。另外,yum访问文件服务器(仓库)的模式是基于C/S架构的,而文件服务器(仓库)则需要以某种共享服务方式将其提供的程序包及包相关的元数据提供给其他主机使用,通常使用到的协议有http、https、ftp、nfs等。此外,还可以使用光盘作为本地仓库或者自己制作本地仓库,通常使用到的协议是file。
因此对于用户来讲,使用yum这样的前端程序管理工具比直接使用rpm就要简便得多了。下面介绍yum的工作原理。
2. yum的工作原理
要能使用yum这个工具来安装程序包,首先要确保系统上支持rpm包管理功能,并且安装了yum程
序。以下将使用yum下载程序包的流程绘制成图:
当用户使用yum去请求安装某一个程序包时,yum工具会先去yum配置文件中查找yum仓库指向的路径,根据该路径去访问远程或本地的文件服务器,这个服务器作为yum仓库并且存储了众多的rpm包以及包相关的元数据文件。当yum根据仓库路径访问到仓库后,会首先尝试请求获取rpm包的元数据文件并缓存至本地(/var/cache/yum目录),而这个元数据文件包括了该仓库所有rpm包的程序包名、版本号、依赖性以及每个程序包所提供的capabilities等。而后,yum根据用户要安装的程序包名去元数据文件里查找,看看仓库里是否有用户请求下载的程序包文件,如果找到了则根据元数据文件分析该程序包的依赖关系并分析本地系统上有哪些包已安装、哪些包还没安装,再将所有用户需要安装且本地尚未安装的程序包名列出来,并以客户端的角色发送至文件服务器(仓库)请求下载之。如果请求成功,则yum将要安装的程序包文件也缓存至本地并执行安装操作。安装完成之后将缓存的程序包文件删除以节约空间,而缓存中只留下元数据文件。
为什么只缓存元数据而不缓存程序包呢?因为程序包一般只安装一次即可,很少会再安装第二次,而且基于节约空间的考虑,因此yum在安装完程序包后会将缓存中的程序包删除。而缓存元数据好处则是当下一次用户使用yum请求安装程序包时可以节约带宽,无需再次重新请求获取全部的元数据文件,并且可以提高本地分析程序包的速度。
当用户第二次使用yum请求安装程序包时,基于实时同步更新缓存以及节约带宽的考虑,yum会先请求下载yum仓库下rpm包元数据的校验码文件至本地,将其与本地缓存上的元数据校验码相比较,如果
相同,说明无须更新;如果不同,则说明仓库中rpm包已经更新,因此yum会重新请求下载仓库上的元数
据文件以更新元数据缓存。接着同样是分析程序包依赖性、请求要安装的全部程序包等。
3. yum客户端配置文件
yum的配置文件主要有/etc/yum.conf和/etc/yum.repos.d/*.repo,
其中/etc/yum.conf为主配置文件,为所有yum仓库提供公共配置;
而/etc/yum.repos.d目录下以.repo结尾的文件则为各yum仓库的指向提供配置信息。
需要注意的是,在CentOS发行版中,/etc/yum.repos.d目录下使用多个以.repo结尾的
仓库配置文件是为了方便管理,既可以用多个以.repo结尾的文件分别配置多个不同的仓库指向,又可以
在一个.repo文件中配置多个仓库指向。而且,当同时存在多个同一类的仓库时,每个仓库称为镜像,
yum支持镜像列表插件并且只使用其中的一个仓库指向即可,因为同一类仓库中的程序包是相同的。这时
应该使用离用户较近的镜像站点,在repo选项中可通过开销(cost)指定具体使用哪一个仓库。当同时存
在多个不同类的仓库时,每个仓库中的程序包各不相同,yum也可同时分析、使用这些仓库。
我们通常在/etc/yum.repos.d目录下配置yum的指向路径相关信息,而在这个配置文件中的仓库指向的定义选项主要有以下几项:
[repositoryID] //仓库名
name=Some name for this repository //对repo作功能性说明;
baseurl=url://path/to/repository/ //仓库指向的路径,可指向多个路径;
enabled={1|0} //是否启用该仓库,默认为1(启用);
gpgcheck={1|0} //是否要对程序包数据的来源合法性和数据完整性做校验;
gpgkey=URL //指定GPG密钥文件的访问路径,可由仓库提供;
enablegroups={1|0} //是否允许以组的方式管理仓库;
failovermethod={roundrobin|priority}
//当baseurl同时指向多个仓库路径时,可指定以什么方式选择url去访问仓库,以及当某一路径访问
失败时,可指定如何再选择路径;roundrobin是随机挑选路径访问,priority是自上而下选择路径访
问;默认为roundrobin;
cost= //开销;开销越小,该仓库url更优;默认为1000.
各类型文件服务器:
示例:使用光盘当做本地yum仓库
(1) 挂载光盘至某目录,例如/media/cdrom
# mount -r -t iso9660 /dev/cdrom /media/cdrom
(2) 创建配置文件
[CentOS7]
name=this is a local repo.
baseurl=file:///media/cdrom
gpgcheck=0
enabled=1
4. yum命令的用法
配置好本地仓库指向后,就可以使用yum安装程序包了,接下来介绍yum命令如何使用:
语法格式:
yum [options] [command] [package ...]
常用选项:
--nogpgcheck:禁止进行gpg check;
-y:自动回答为"yes"
-q:静默模式;
--disablerepo=repoidglob:临时禁用此处指定的repo;支持glob风格通配,表示某一类repo;
--enablerepo=repoidglob:临时启用此处指定的repo;支持glob风格通配,表示某一类repo;
--noplugins:临时禁用所有插件。
yum的子命令用法:
(1)显示仓库列表:
# yum repolist [all|enabled|disabled]
(2)显示程序包:
# yum list [all | glob_exp1] [glob_exp2] [...]
# yum list {available|installed|updates} [glob_exp1] [...]
(3)安装程序包:
# yum install package1 [package2] [...]
(4)重新安装:
# yum reinstall package1 [package2] [...]
相当于:rpm -ivh --replacepkgs
(5)升级程序包:
# yum update [package1] [package2] [...]
(6)降级程序包:
# yum downgrade package1 [package2] [...]
相当于:rpm -Uvh --oldpackage
(7)检查可用升级:
# yum check-update
(8)卸载程序包:
# yum remove | erase package1 [package2] [...]
注意:依赖于此包的程序会一同被卸载。
(9)查看程序包information:
# yum info [...]
(10)查看指定的特性(可以是文件)是由哪个程序包所提供:
# yum provides | whatprovides feature1 [feature2] [...]
相当于rpm -qf FILE;
(11)清理本地缓存:
# yum clean [ packages | metadata | expire-cache | rpmdb | plugins | all ]
(12)构建缓存:
# yum makecache [fast]
(13)搜索:
# yum search string1 [string2] [...]
以指定的关键字搜索程序包名及summary信息;匹配方式为模糊匹配;
(14)查看指定包所依赖的capabilities:
# yum deplist package1 [package2] [...]
(15)查看yum事务历史:
# yum history [info|list|packages-list|packages-info|summary|addon-info|redo|undo|rollbac
k|new|sync|stats]
仅能查到有改动的历史,例如安装、升级、卸载等。
(16)安装及升级本地程序包:
# yum localinstall rpmfile1 [rpmfile2] [...]
(maintained for legacy reasons only - use install)
# yum localupdate rpmfile1 [rpmfile2] [...]
(maintained for legacy reasons only - use update)
注意:本地程序包指非仓库的程序包,可以是从互联网上下载的程序包。当本地程序包的安装存在依赖关系并且该包依赖于仓库里的程序包时,使用此选项可借助yum安装这个本地程序包。但从CentOS 6/7后,直接install选项指定本地rpm程序包即可,即:# yum install local_rpmfile.
(17)包组管理的相关命令:
# yum groupinstall group1 [group2] [...]
# yum groupupdate group1 [group2] [...]
# yum grouplist [hidden] [groupwildcard] [...]
# yum groupremove group1 [group2] [...]
# yum groupinfo group1 [...]
5. yum的repo配置文件中可用的变量
前面提到,/etc/yum.repos.d目录下的配置文件能为yum指明仓库的路径及其相关信息,而使用不
同平台类型的用户可通过镜像网站来安装仓库里的程序包。而在/etc/yum.repos目录下的配置文件中,
通过引用变量来表示baseurl可以使yum自动指向适合其平台的仓库路径,这样即使不会配置yum的repo
配置文件的用户也可使用默认的yum源,可方便镜像源管理员的管理。
在yum的repo配置文件中可用的变量有:
①$releasever:当前OS的发行版的主版本号;
②$arch:平台;
③$basearch:基础平台;例如i386,i486,i586,i686的基础平台为i386,即只要是32位的系统统统视
为i386基础平台;常见的基础平台有i386, x86_64, ppc等;
④$YUM0-$YUM9:供用户自定义的内部变量;
示例:baseurl=
6. 创建yum仓库--createrepo命令
如果管理上百台服务器主机,则当全部主机要求从互联网上某个文件服务器下载安装某个程序包时,会对带宽造成极大的消耗,为了节约带宽,可将远程文件服务器上的yum仓库镜像至本地,做成本地服务器,而全部主机只需通过内网访问本地服务器即可下载安装程序包,大大节约了带宽。
前面提到,一个yum仓库不仅包括众多的rpm包,还包括包相关的元数据文件。因此要创建仓库,除了要提供rpm包之外,还需要为所有rpm包制作元数据文件,而在Linux上只需通过执行createrepo命令就可以创建出元数据文件,createrepo是通过读取各个rpm包上的元数据信息并堆积形成元数据文件来实现的。
接下来简单介绍createrepo命令的使用:
createrepo命令:
createrepo - Create repomd (xml-rpm-metadata) repository
用于创建yum仓库的元数据目录文件(repodata)
常用选项:
--basedir:可通过此选项将repodata目录输出到当前rpm程序包的父目录去;
命令演示:
这里以/local_repo/Packages目录下事先复制过来的rpm包作为使用示例,如图:
开始创建元数据目录文件repodata:
再次ls查看:
可以发现,当前目录下多了一个repodata目录。
切换至repodata目录查看:
需要注意的是,rpm包的元数据文件是使用UUID来命名文件的,其中filelists类文件用来存放程序包文件名列表,而primary类文件则可用于存放程序包(组)的版本号、依赖性信息等。另外,repodata目录下的repomd.xml文件即为元数据的校验码文件。
7. 即将取代yum的dnf
虽然yum功能强大,并且支持许多插件扩展功能,但yum在设计体系上存在一些不足的地方,例如,yum在安装程序包时,如果突然中断,则下一次重新安装时yum无法识别该程序包是否已安装,而dnf主要就是为了解决yum这一缺陷的,预测将来dnf会取代yum这个工具。
1. 编译安装概述
前面两篇关于程序包管理器的文章谈到,无论是使用rpm命令还是yum命令安装的都是已编译好的程序包,在整个安装过程中用户只需执行一条命令即可完成安装。这样带来的好处是方便,但因为是安装的是已编译好的包,所以用户的系统平台环境必须与rpm包制作者的系统平台环境相同。此外,如果用户要安装使用某程序上的某个功能,而rpm包制作者在编译过程中默认没有指定该功能的实现,这时候该怎么办呢?更何况如果某程序只是提供源码而没有现成的rpm包。这时就需要用户手动编译安装了,而编译安装就是将程序源代码编译成完全适合自己平台类型的程序包。
因此,用户首先得获得程序源码包(SRPM, Source RPM)。RPM包的命名格式为:name-VERSION-release.arch.rpm,而程序源码包(SRPM)的命名格式为:name-VERSION-release.src.rpm。可以发现,SRPM与RPM相比,将arch替换为src,说明SRPM包去掉了arch这一平台类型限制,因此经过用户自己编译安装可以编译成适合自己平台的程序包。
以下为编译过程图解(以C源代码为例):
我们知道,程序源代码一般为多文件组织格式,因此文件中的代码文件之间很有可能存在跨文件的依赖关系,这将给用户自行编译安装带来了极大麻烦,因为对先编译哪些文件、后编译哪些文件根本无从知晓,因此这就需要项目管理器(或者项目构建器)了。
C/C++的项目管理器为make,make工具可以在编译过程中指定使用哪个预处理器进行预处理、使用哪个编
译器进行编译以及先编译什么程序文件、后编译什么程序文件,甚至完成更为复杂的操作等,能帮助用
户快速地编译安装。
make工具的执行依赖于makefile配置文档,因此make执行的所有操作皆由makefile指定。makefile可由
执行configure脚本生成。而在执行configure脚本时,configure会结合用户通过命令行指定的选项以及
各个Makefile.in模板文件来生成makefile文件。编译完成之后即可使用make install命令将编译好的程序包复制到用户指定的各个目录下。
2. C代码编译安装三步骤
(1) 执行configure脚本(# ./configure [option...])
常用选项:
--help:获得其支持使用的选项
--prefix=/PATH/TO/SOMEWHERE:指定默认安装位置;默认为/usr/local/;
--sysconfdir=/PATH/TO/SOMEWHERE:配置文件安装位置;
--enable-FEATURE[=ARG]:开启指定特性以及安装路径;默认开启时无须指定;
--disable-FEATURE:关闭指定特性;默认关闭时无须指定;
--with-PACKAGE[=ARG]:安装指定依赖包以及其安装路径;
--without-PACKAGE:不安装指定依赖包;
执行configure脚本的作用:
①用户可以通过选项传递参数给configure脚本,以指定启用的功能特性、安装路径等;而configure脚本在执行的过程中会参考用户的指定以及Makefile.in文件生成makefile文件;
②检查程序指定要启用的功能特性所依赖到的外部环境。
(2) 执行make程序
作用:
make会执行真正的编译操作,但make本身并不是编译器,它只是一个项目构建工具,
make程序会根据执行configure脚本所生成的makefile文件,并调用所需要用到的编译器来构建应用程序。
(3) 执行make install安装操作
作用:
在前面的make程序执行之后,在当前目录下会创建出已编译完成的目标二进制格式的应用程序(包括二进制程序、库文件、配置文件及帮助文档等),而make install则会执行安装操作,即把当前目录下已编译好的程序包(二进制程序、库文件、配置文件及帮助文档等)复制到用户指定的各个目录下。
注意:各个程序在编译安装过程中可能不尽相同,因此建议安装前查看INSTALL, README。
3. 编译安装后的配置
(1) 导出目标二进制程序目录至PATH环境变量中
方法:
在生产环境中如果该二进制程序作为全局变量,可以在/etc/profile.d/目录下创建/etc/profile.d/NAME.d文件,其中'NAME'可定义设置名称。在该文件中写入下面一行:
export PATH=PATH:/PATH/TO/BIN
这里的/PATH/TO/BIN即为目标二进制程序所在目录。
(2) 导出库文件路径
方法:
①在/etc/ld.so.conf.d/目录下创建/etc/ld/so.conf.d/NAME.conf,其中NAME为自定义设置名称。而后,添加新的库文件所在目录至此文件中即可。
②做完这一步之后,需要让系统重新生成缓存:
# ldconfig [-v]
(3) 导出头文件(位于include目录)
程序编译安装完成之后,一般在安装路径中会有include目录,这个include目录就是头文件,头文件的功能是把外部文件的内容包含到源文件中,例如外部函数等。在程序开始编译之前,会执行一段预处理指令,而预处理指令则把头文件的内容包含到源文件中。
如果要导出头文件,可基于软链接的方式来实现:
# ln -sv 头文件目录 链接头文件目录
(4) 导出帮助手册
方法:
在CentOS 6上:
编辑/etc/man.config文件,添加一个MANPATH:
# MANPATH /PATH/TO/MAN
这里'/PATH/TO/MAN'为目标程序的安装路径下的帮助手册目录。
在CentOS 7上:
编辑/etc/man_db.conf文件,添加一个MANPATH:
# MANPATH_MAP /PATH/TO/BIN /PATH/TO/MAN
这里/PATH/TO/BIN是目标二进制程序所在目录,/PATH/TO/MAN则是该程序的帮助手册所在目录。
yum安装软件No more mirrors to try
很简单:
1.yum clean metadata
2.yum clean all