首页 > 代码库 > 程序包管理YUM
程序包管理YUM
回顾:
Linux程序包管理的实现,rpm管理器
rpm命令实现程序管理:
安装: -ivh,--nodeps, --replacepkgs
卸载:-e,--nodeps
升级:-Uvh,-Fvh, --nodeps,
降级:--oldpackage
查询: -q, -qa, -qf, -qi, -qd, -qc, -q --scripts, -q--changlog, -q --provides, -q --requires
校验:-V
导入GPG秘钥: --import,-K, --nodigest, --nosignature
数据库重建:--initdb, --rebuilddb
Linux程序包管理(2)
centOS:yum, dnf
YUM工具:
yum是一个c/s结构的工具。
yum工作的前提就是,要求在本地客户端可达的网络服务器上面(这个服务器是一个文件服务器),即这个服务器能够提供文件存储跟文件服务的功能,说白了就是在这个服务器的主机上,能够提供一个很大的存储空间,在这个空间空存储上我们能够用到的几乎所有的rpm包。这整个包目录,通过文件共享的方式,输出到外部主机,或其他主机能够进行访问,
我们可以有任何一个linux主机,这个主机上面本身支持rpm包管理的基本功能,同时再次基础上有支持YUM工具的使用。
YUM工具的工作方式:
在安装rpm包时,不再使用rpm命令,而是使用yum命令,
当yum接收到我们的命令以后,他会根据本地指向的存放rpm工具包的服务器的网络地址。这个地址是URL
在互联网上给我们提供的rpm安装包的服务器有很多,我们本地到底使用哪一个服务器我们必须指明。所以yum就需要有个配置文件,来指明我们要访问的是哪一个网路服务器,并且到服务器上去找我们的访问地址
比如说教室的FTP服务器地址:ftp://10.1.0.1/pub/,/pub下有很多文件这个地址就相当于URL对于真正的URL是指向网络中的单独的一个文件来统一进行定位的。
URL:ftp://10.1.0.1/pub/(URL被称为统一资源定位符)
YUM工具在接收到安装程序包命令后,就会根据配置文件中的地址,去找网络上的服务器,网路上的服务器为了避免YUM下载特定的rpm包时,由于不同的rpm包特多,不好查找,则服务器为YUM提供了一个rpm包的元数据信息表,所以在YUM工具在要下载RPM包之前,先请求服务器将rpm数据包元数据表发给客户机。这个文件可以理解为rpm的户口,这个数据表被先放在缓存中cache,然后YUM工具根据rpm数据表分析要下载的rpm的依赖关系。
具体就是,去本地查询安装的包与本地哪些包有依赖关系,并统计那些包已经安装,那些包未安装,然后将未安装的包列出来,根我们要安装的包一起安装。
然后去服务器下载这些包,然后放在缓存中,然后再本地缓存中执行类似rpm安装的操作。安装完成后,YUM将缓存中的rpm包删除,以节约空间,但是要知道,rpm的元数据表是不删除的,因为下一次再安装rpm包时,我们直接分析本地的元数据即可,我们的元数据可以多次重复使用,
但是这样也会存在问题,就是远程的服务器上面新增加了rpm包,元数据信息表发生了改变这时我们应该怎么办?
其实为了避免这个问题,我们的YUM客户端在每次请求服务器时,都会去请求元数据的,那我们的缓存还有什么用么?
其实元数据这个文件也不小,比如说一个仓库里边有上千个安装包的话,那这个文件的大小也有几兆了,再大也有可能有十几兆的样子,好在他是文本文件,所以可以进行压缩存放的。其实在仓库中元数据文件不止一个,有的存放包名的,有的存放依赖关系的,所以在这个仓库上这个元数据的文件不止一个,除此之外还有一个特殊文件,这个文件中记录了每个元数据文件的校验码,同理我们本地上缓存的元数据也有校验码,当客户端去请求服务器时,客户端是先去请求元数据文件的校验码,对比一下,一样就不进行更新,不一样在进行更新。这样就大大节约了时间,而且也不用下载,节省了网络带宽,提高了速度。
但是也有时候出现例外,当我们用YUM工具分析包,查询包的时候,请求服务器时,出现连接不到的情况,(这里不是安装,是卸载或者查询的时候)我们就得不到本地的元数据文件是不是最新的,那么这时就需要我们定义策略,要我们到底敢不敢用这样的元数据文件,这都是YUM仓库完成的概念。
YUM是独立的自我管理的组件,C/S架构,并不是YUM本身是CS架构的,而是依赖C/S架构。
总结:
第一步:
我们要想使用YUM工具来安装管理程序包的话,首先对于本地linux系统上要有YUM客户端有一些YUM命令,一些YUM工具这是前提,
第二步:
YUM要给基于配置文件,要根据配置文件去找YUM仓库,作为管理员,需要我们作为管理员自己定义,这个YUM是使用互联网上的,还是使用自己本地的,这都有可能。
第三步:
我们既然指向仓库,那么这个仓库要存在,如果网络带宽足够,我们可以使用网络上的镜像网站作为仓库,这样我们就有一些较新的文件,
我们也可以自己间服务,我们可以将互联网上的镜像。镜像到本地,
YUM并不是rpm的取代者,他只是RPM的前端管理工具,即YUM要依赖rpm才能存在如果仅仅是有YUM是不可以的。所以我们不要人为,有了YUM就无需使用rpm了,这是两回事。
我们用YUM解决安装问题,我们任然可以用rpm来查询管理程序。
如果我们要配置本地的YUM仓库的话,我们还需要自行去配置一个服务器主机,这个服务器我们要配置成文件服务器,一般来说YUM所支持的服务器有两种,一种是FTP,一种是HTTP
createrepo专门分析一个仓库有哪些RPM包,包与包之间有哪些依赖关系,他都能抽取出来形成文件,而且还能帮我们生成特征码文件。
createrepo生成高级仓库是比较困难的,我们在将来安装程序时我们一下装一个组,而不是一个包,而要创建分组的话,一个组文件是xfl格式的,
YUM工具
yum repository :简称yun repo :YUM仓库
存储了众多的rpm包,以及包的相关的原数据文件,(放置于特定的目录下:repodata):
并不是rpm包所在的路径就是仓库,而是repodata这个目录所在的目录才是仓库指向的路径
系统本身的安装光盘就是一个YUM仓库
仓库首先是一个文件服务器:
这个服务器一般是通过
ftp://
http://
nfs://
file:///(如果访问不到互联网,我们就本地仓库,我们将光盘挂载上,然侯后将光 盘做为本地仓库)
yum本身也是一个程序包,首先我们应该保证这个程序已经安装上了。
[root@localhost~]# rpm -q yum
yum-3.2.29-73.el6.centos.noarch
[root@localhost~]#
确定本地作为客户机应安装了yum程序后,我们在查询yum的配置文件。
[root@localhost~]# rpm -qc yum
/etc/logrotate.d/yum
/etc/yum.conf //yum的主配置文件
/etc/yum/version-groups.conf
[root@localhost~]#
YUM配置文件
/etc/yum.conf
yum的主配置文件主要是用来指向我们用的那些yum仓库的。
其实yum的配置文件并不只是/etc/yum.conf这一个,其实yum的配置文件由两部分组成,/etc/yum.conf这个文件其实使用了包含指令,他还包含一个/etc/yum.repos.d/*.repo文件。这是YUM遵循把大配置文件 分成多段小文件的管理风格。
这样一分以后,yum的主配置文件,只提供仓库指向的公共配置
一个yum客户端可以指向一个仓库,实际上,一个yum可以指向n个仓库的。同类仓库存在多个,这叫镜像,我们用的时候用一个。
在cenots上,一个文件不是.repo结尾的话,就不能作为yum程序所使用
两个配置文件:
/etc/yum.conf //为所有仓库提供公共配置
/etc/yum.repos.d/*.repo //为仓库的指向提供配置
查看YUM的主配置文件
[root@localhost ~]# less /etc/yum.conf
内容:
[main] //这个主配置文件用中括号定义的,每一个中括号中,定义了一个配置段,配置段只对某些地方代码有效,而main配置段,就叫主配置段。
cachedir=/var/cache/yum/$basearch/$releasever
keepcache=0 //使用过的文件是否保存在缓存
debuglevel=2 //调试级别
logfile=/var/log/yum.log //用到的安装日志文件。
exactarch=1 //安装程序包时,是否进行精确平台匹配
obsoletes=1
gpgcheck=1 //安装包时,是否检查包的完整性跟合法性
plugins=1 //是否支持插件机制
installonly_limit=5 //同时安装几个程序包
bugtracker_url=http://bugs.centos.org/set_project.php?project_id=19&ref=http://bugs.centos.org/bug_report_page.php?category=yum //bug错误的追踪地址
distroverpkg=centos-release //发行版从哪获取的。
# This is the default, if you make this bigger yum won‘t see if themetadata
# is newer on the remote and so you‘ll"gain" the bandwidth of not having to
# download the new metadata and"pay" for it by yum not having correct
# information.
# Itis esp. important, to have correct metadata, for distributions like
# Fedora which don‘t keep old packagesaround. If you don‘t like this checking
# interupting your command line usage, it‘smuch better to have something
# manually check the metadata once an hour(yum-updatesd will do this).
# metadata_expire=90m
# PUT YOUR REPOS HERE OR IN separate filesnamed file.repo//每一个仓库也有这么一个配置段,只是这个配置段中括号里面的是仓库的名称
# in /etc/yum.repos.d //每一个仓库都在这个文件下。
(END)
如果我们不了解这个YUM的主配值文件,我们可以man手册yum的主配置文件,yum.conf
[root@localhost ~]# whatis yum.conf
yum.conf [yum] (5) - Configuration file for yum(8)
[root@localhost ~]#
[root@localhost ~]# man yum.conf //如果我们看主配置文件选项不懂可以这样查看
在默认情况下,我们yum的配置文件很少进行修改。主要是仓库的定义。
man yum.conf 配置文件中,[repository] OPTIONS这个分段是指定仓库的配置选项
关键是仓库的指定:
仓库的定义:
等号左右不要有空格,否则有语法错误。仓库定义最关键的就是仓库ID,和名称,再这仓库指向,其他的选项都是普通的选项。
[repositoryID] // 一定为其指定,确定的仓库ID,如果定义多个YUM源,则这个一定不能以样。
name= Some name forthis repository //仓库的名称,可以随便起,但最好是这个仓 库的完整描述
baseurl=url://path/to/repository/ //仓库的地址路径等号两边不能留空格,否则 会有语法错误。
enabled={1|0} //是否启用此仓库,默认为1,表示启用此仓库,就算不写enabled 也表示启用,如果不启用则写enabled=0
gpgcheck={1|0} //对于此仓库中的程序包再安装之间是否检查来源合法性
gpgkey=URL //指明一个URL,这个URL是能访问秘钥文件的路径
enablegroups ={1|0} //是否支持在此仓库使用组来批量管理程序包,默认是支持的。
failovermethod={roundrobin| priority} //故障转移方法,前面提到我们baseurl可以 指定多个路径,那这多个路径应该先用那个 呢?如果一地个坏了,则用哪一个?平时好的 时候用哪一个?则roundrobin是轮询,其实 就是从里面随机挑一个,priority是根据优先 级去选择的,即第一个第二个.....,如果不指定 的话,是随机的,而不是自上而下。
repo_gpgcheck={1|0} //检查仓库元数据文件的签名信息 GPG是非对称加密。
mirrorlist //真正以镜像方式指向URL,一般与baseurl不同时使用,而且要使用 mirrorlist时,yum必须支持插件功能。
cost= //开销,默认值为1000,可以通过更改这个开销数字的大小,来是的 先使用哪个路径
注意:baseurl可以指明多个路径,其实指定多个路径后,我们使用时是从其中随机找一个路径
( baseurl=url://server1/path/to/repository/
url://server2/path/to/repository/
url://server3/path/to/repository/)
配置YUM指向,然后使用YUM仓库
第一步:切换到存放存放仓库的目录中
[root@localhost ~]# cd /etc/yum.repos.d/
[root@localhost yum.repos.d]# ls
CentOS-Base.repo CentOS-Debuginfo.repo CentOS-fasttrack.repo CentOS-Media.repo CentOS-Vault.repo
[root@localhost yum.repos.d]#
分析第一个文件CentOS-Base.repo:
[root@localhost yum.repos.d]# less CentOS-Base.repo
它里面定义了好几个仓库,一个叫[base], [updates],[extras], [centosplus], [contrib]
从里面截取一段来分析:
[base]
name=CentOS-$releasever - Base
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=os&infra=$infra //默认使用的是mirrorlist,后面跟的是url,这里面用到了$releasever等等,带$就是 变量
#baseurl=http://mirror.centos.org/centos/$releasever/os/$basearch/ 同样我们也可以使用 它来指定
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6
#released updates
上面没有写enabled,说明默认是启用的。
[root@localhost yum.repos.d]# ls
CentOS-Base.repo CentOS-Debuginfo.repo CentOS-fasttrack.repo CentOS-Media.repo CentOS-Vault.repo这后面几个仓库默认都是未被启用的,enabled=0都是。
所以我们可以知道,当我们不启用仓库时,就写
enabled=0
第二步:不使用原来的Base仓库,将原来的仓库改名。
现在我们假如不想用Base.repo仓库了,我们可以将里面没有将enabled写成零的,改为零,但是这样还有一个问题,就是我们在将来定义自己的仓库时,还定义仓库名为base,则会报错的,因为不能是两个仓库的名相同。
所以最简单的方法就是重命名:
[root@localhost yum.repos.d]# mv CentOS-Base.repo CentOS-Base.repo.bak
第三步:我们自己定义仓库
教室的YUM源地址是:http://10.1.0.1/cobbler
在里面找到一个叫repodata的目录,这个repodata所在的路径就是我们的仓库路径。
在阿里云网站上的镜像YUM仓库路径:
http://mirrors.aliyun.com/centos/6.8/contrib/x86_64/
或http://mirrors.aliyun.com/epel/6/x86_64/
步骤:
[root@localhostyum.repos.d]# vim centos-local.repo
需要写进去的内容:
[base]
name=BaseRepo on aliyum
baseurl=http://mirrors.aliyun.com/centos/6.8/contrib/x86_64/
gpgcheck=0
最后保存退出wq
这样YUM仓库就配置好了。
第四步:使用仓库:
执行yum的第一个命令:
[root@localhostyum.repos.d]# yum repolist //列出可用的yum仓库,第一次用YUM仓库,会先去仓库上下载元数据primary_db文件
或者,将马哥教室的YUM源加到上面的vim centos-local.repo文件中。
name=local repo 10.1.0.1
baseurl=http://10.1.0.1/cobbler/ks_mirror/6/
gpgcheck=0
yum的命令:
语法:
yum [options] [command] [package ...]
命令:
前面的星号表示“yum”关键字
command is one of:
* install package1 [package2] [...]
* update [package1] [package2] [...]
* update-to [package1] [package2] [...]
* check-update
* upgrade [package1] [package2] [...]
* upgrade-to [package1] [package2] [...]
* distribution-synchronization [package1] [package2]
[...]
* remove | erase package1 [package2] [...]
* list [...] //显示程序包,执行命令为yum list
* info [...]
* provides | whatprovides feature1 [feature2] [...]
* clean [ packages | metadata | expire-cache | rpmdb |plugins | all ]
* makecache
* groupinstall group1 [group2] [...]
* groupupdate group1 [group2] [...]
* grouplist [hidden] [groupwildcard] [...]
* groupremove group1 [group2] [...]
* groupinfo group1 [...]
* search string1 [string2] [...]
* shell [filename]
* resolvedep dep1 [dep2] [...]
* localinstall rpmfile1 [rpmfile2] [...]
(maintained for legacy reasons only - use install)
* localupdate rpmfile1 [rpmfile2] [...]
(maintained for legacy reasons only - use update)
* reinstall package1 [package2] [...]
* downgrade package1 [package2] [...]
* deplist package1 [package2] [...] //显示包与包的依赖关系
* repolist [all|enabled|disabled] //显示仓库列表,默认显示启用的,即执行的 命令为 yum repolistenabled
* version [ all | installed | available | group-* | //查看rpmdb信息
nogroups* | grouplist | groupinfo ]
* history[info|list|packages-list|packages-info|sum-
mary|addon-info|redo|undo|rollback|new|sync|stats]
* load-transaction [txfile]
* check
* help [command] //获取某个命令自己的帮助信息的。
显示仓库列表:
*repolist [all|enabled|disabled]
显示程序包:
list
yumlist [all | glob_exp1] [glob_exp2] [...]
yum{available| updates |installed} [glob_exp1] [...]
glob_exp1:表示自己定义的通配符格式查找
available:表示仓库中有但未安装
updates:表示可用的升级包
installed:表示已经安装的包
安装程序包:
*install package1 [package2] [...] //可以同时安装多个程序包
注意:
(如果一个程序有多个安装包,那我们可以指定安装包的版本即可:yum install gcc-4.5.7,实际上安装程序包的时候,默认安装最新版,所以只有我们再安装老版本的程序包时,我们才会指定版本号)
升级程序包:
*update [package1] [package2] [...]
降级程序包:
*downgrade package1 [package2] [...]
检查可用升级包:
*check-update
卸载程序包:
*remove | erase package1 [package2] [...] //卸载程序包时,会将依赖这个程序包的 那个程序包一并卸载
查看程序包信息,相当于rpm -qi命令:
*info [...] //后面跟程序包即可
查看指定的特性(可以是某文件)是由那个程序包所提供:相当于rpm -qf
*provides | whatprovides feature1 [feature2] [...]
清理本地缓存:
*clean [ packages | metadata | expire-cache | rpmdb | plugins | all ]
packages:程序包
metadata:元数据
expire-cache:过期缓存
plugins:插件
构建缓存:
*makecache //其实这部没必要做
搜索:后面跟上关键字即可,用来以指定的关键字,搜索程序包名及summary信息
*search string1 [string2] [...]
重新安装程序包:
*reinstall package1 [package2] [...]
查看指定包所依赖的capabilities:
*deplist package1 [package2] [...] //依赖关系分析,显示包与包的依赖关系
查看yum事务历史:
*history[info|list|packages-list|packages-info|sum-mary|addon-info|redo|undo|rollback|n ew|sync|stats]
(history,表示查看yum在每次安装升级卸载程序包时,就相当于启动了一个yum事物。)
yumhistory summary //只查看摘要信息
安装及升级本地程序包: //其实现在直接使用install+后跟程序包即可。但是在centos5 要使用,或者安装yum之前的某个版本则也要使用
*localinstall rpmfile1 [rpmfile2] [...]
(maintained for legacy reasons only - use install)
*localupdate rpmfile1 [rpmfile2] [...]
(maintained for legacy reasons only - use update)
包组管理的相关命令:
* groupinstall group1 [group2] [...]
* groupupdate group1 [group2] [...]
* grouplist [hidden] [groupwildcard] [...]
* groupremove group1 [group2] [...]
* groupinfo group1 [...]
yum源配置指向只能升级,不能降级。
配置本地yum源:
每一个发行版的光盘,中都有repodata文件。所以我们可以直接将光盘当做本地yum源来使用。直接使用file:///来直接指向就行。
第一步:
挂载光盘:(以只读方式挂载)
mount -r /dev/cdrom /media/cdrom
mount //直接执行mount命令就可以查看光盘是否挂载成功
成功挂载则显示:/dev/sr0 on /media type iso9660 (ro)
[root@localhost ~]# cd /media
[root@localhost media]# ls
CentOS_BuildTag RELEASE-NOTES-en-US.html
EFI repodata //发现可以查看到一个repodata文件。有他就可以作为 YUM源
EULA RPM-GPG-KEY-CentOS-6
GPL RPM-GPG-KEY-CentOS-Debug-6
images RPM-GPG-KEY-CentOS-Security-6
isolinux RPM-GPG-KEY-CentOS-Testing-6
Packages TRANS.TBL
[root@localhost media]#
第二步:切换到、/etc/yum.repos.d/目录下,并建立一个本地YUM源文件
cd /etc/yum.repos.d
vim local.repo
在local.repo文件中写入的内容:
[base]
name=CentOS 6 Release 6.8
baseurl=file:///media/cdrom
enabled=1
gpgcheck=0
第三步:最后查看一下我们创建的YUM源
yum repolist
提醒:YUM的修改操作,是会启动事物的,而事物一般是有隔离概念的。也就是说,在一个终端中安装,再启动一个终端安装是不被允许的。第二个终端会一直处于阻塞的状态,知道最后我们不得不手动关闭这个进程。
本文出自 “11847750” 博客,请务必保留此出处http://11857750.blog.51cto.com/11847750/1875141
程序包管理YUM