YUM(全称为 Yellow dog Updater Modified)
是一个在Fedora和RedHat以及CentOS中的Shell前端软件包管理器。基于RPM包管理,可以从指定的服务器自动下载RPM包而且安装,能够自动处理依赖性关系,而且一次安装全部依赖的软件包,无须繁琐地一次次下载、安装。php
YUM是C/S架构,是RPM的前端工具,依赖于RPM存在的
服务器端:
首先要是一个文件服务器,有很大的存储空间,里面放着RPM包、元数据文件、conf文件、binary信息。并经过文件共享服务让外部客户端能够访问到存放RPM包的目录。前端
YUM支持的文件服务器有如下几种:nginx
- ftp://
- http://
- nfs://
- file:/// ##为何有三个斜杠,这是由于第三个斜杠是Linux目录中的斜杆
客户端:sql
在客户端,当YUM接收到用户命令(例如:安装程序包的命令)以后,会向着本地配置文件中配置的服务器地址(URL)发起链接。YUM不会直接向服务器请求程序包,而是请求YUM服务器上存放RPM包名、版本、包和包之间依赖关系的元数据文件。这个文件下载到本地以后,会先存放到cache中,而后YUM会在本地上分析这个文件中是否存有要安装程序包的包名,若是有就根据这个元数据文件尝试分析该包的依赖关系,得出要依赖哪些程序包以后,就在本地已安装的程序包中查询被依赖的包中哪些已安装,哪些没有安装;shell
分析完以后,YUM会启动文件服务器的客户端向着YUM服务器下载那些没有安装的程序包。下载完成后先缓存在本地,在本地开始执行相似于RPM安装的操做;而安装时会先安装被依赖的程序包,全部程序包安装完成后会通知客户端,并自动删除缓存区中的程序包以节省空间;可是元数据不会被删除,由于下次再安装新的程序包时,直接分析本地的元数据就能够获取依赖关系,经过这种方式能够节省时间与网络带宽。centos
可是上述这种机制,也存在着一些问题,万一服务器上的程序包或者依赖关系发生了变化,就会致使服务器和客户端本地的元数据不一致。想解决这个问题,能够在每次使用YUM的时候,都向服务器请求元数据。可是这种方式浪费带宽和时间,有的时候明明没有变化,但仍是须要下载。缓存
YUM服务器上有一个特殊文件,文件中记录了每个元数据文件的校验码,实际上每次运行YUM的时候,都会向服务器请求这个文件(刚刚配置好YUM源的时候,本地没有这个文件,这时候确定是要下载元数据的),并和本地元数据中的校验码文件进行对比,若是一致则表明元数据没有变化,本地元数据有效,不然就从新请求元数据。服务器
若是一个功能在配置文件中使能了,却在命令行运行命令的时候去使能了,命令行优先。网络
-q, --quiet:静默模式 -v, --verbose:详细模式 -y, --assumeyes:自动回答为yes; --assumeno:自动回答为no --nogpgcheck:禁止进行GPG Check; -R [minutes], --randomwait=[minutes]:最多等待时间 --disablerepo=repoidglob:禁用此处指定的repo仓库ID,可配置通配符进行匹配; --enablerepo=repoidglog:启用指定的repo仓库ID,可配置通配符进行匹配; -x [package], --exclude=[package]:通配要排除的包 --noplugins:禁用全部插件; --color=COLOR:带颜色 --downloadonly:仅下载包,不安装或升级。默认下载在yum的缓存目录中,默认为/var/cache/yum/$basearch/$releasever --downloaddir=DLDIR:指定下载目录 --installroot=:指定另外一个installroot,至关于运行了chroot。注意:当建立其余instalroot的时候,能够指定--releasever=/,不然$releasever将重新制定的目录的rpmdb中获取。例如:yum --installroot=/tmp --releasever=/ install nginx --releasever=:假设当前的release version是指定的字符串。这个选项在使用--installroot的时候很是有用。你可使用--releasever=/指定$releasever从--installroot以外的目录获取。例如:yum --installroot=/tmp --releasever=7 install nginx
显示仓库列表
yum repolist [all|enabled|disabled]
按照选项列出程序包信息架构
Note:根据命令格式可搭配glob风格的通配符; 列出全部可提供的或已安装的程序包; yum list [all | glob_exp1] [glob_exp2] [...] 列出软件仓库中全部能够提供安装的程序包 yum list available [glob_exp1] [...] 列出软件仓库中全部可用来更新的程序包(可让本地系统用来更新的包) yum list updates [glob_exp1] [...] 列出args指定的包。若是参数与可用包的名称不匹配,则假定它是shell样式的glob,而且打印任何匹配项。 yum list installed [glob_exp1] [...] 列出系统上已经安装,但在被配置文件里列出的YUM仓库里不存在的程序包 yum list extras [glob_exp1] [...] 列出系统上已经安装,但在配置文件里列出的YUM仓库中被废弃的程序包 yum list obsoletes [glob_exp1] [...] 列出最近添加到YUM仓库的RPM包 yum list recent
显示程序包信息,至关于rpm -qi PACKAGE
yum info [...]
查看指定特性(也能够是文件)是哪一个程序包提供的
yum provides | whatprovides feature1 [feature2] [...]
搜索包含包名和摘要字符串
模糊搜索,搜索包名和摘要信息 yum search string1 [string2] [...]
查看指定包所依赖的capabilities
yum deplist package1 [package2] [...]
查看rmp包db版本信息
yum version [ all | installed | available | group-* | nogroups* | grouplist | groupinfo ]
查看yum事务历史
yum history [info|list|packages-list|packages-info|summary|addon-info|redo|undo|rollback|new|sync|stats] 事务就是执行yum命令,查询不算事务,通常包括安装、升级、卸载等,修改类的操做才算事务; 例如: ]# yum history ##查看yum的历史事务信息; ]# yum history summary ##查看yum历史事务的摘要信息; ]# yum history list ##查看yum历史事务列表,默认操做; ]# yum history liststats ##查看的是统计数据;
安装程序包
默认会安装最新的,安装的时候指定部分包名就行,不须要指定完成的RPM程序包名称 yum install package1 [package2] [...]
从新安装程序包
从新安装(基于覆盖方式安装),相似于rpm -ivh --replacepgks yum reinstall package1 [package2] [...]
升级程序包
yum update [package1] [package2] [...] 升级软件包的同时也升级软件和系统内核 yum upgrade [package1] [package2] [...] 只升级软件包,不升级软件和系统内核
降级程序包
相似于rmp -Uvh --oldpackages yum downgrade package1 [package2] [...]
检查可升级的程序包
yum check-update
卸载程序包
卸载某个程序包,会把依赖它的程序包也一块儿卸载 remove | erase package1 [package2] [...]
当更换新的YUM仓库以后,执行一次清理和构建是颇有必要,这可使得本地和YUM仓库中的元数据等信息同步。
清理本地缓存目录
用于清理在yum缓存目录中积累的各类各样的东西
yum clean [ packages | metadata | expire-cache | rpmdb | plugins | all ]
构建元数据
下载并使用全部当前可用的YUM仓库的元数据
yum makecache [fast]
安装本地RPM包
不用管这个RPM包的依赖问题,依赖问题会被yum解决 yum localinstall rpmfile1 [rpmfile2] [...] maintained for legacy reasons only - use install
升级本地程序包
不用管这个RPM包的依赖问题,依赖问题会被yum解决 yum localupdate rpmfile1 [rpmfile2] [...] maintained for legacy reasons only - use update
Note:若是包组名称中包含空格,则要使用双引号包围; yum groupinstall group1 [group2] [...]:安装包组; yum groupupdate group1 [group2] [...]:升级包组; yum grouplist [hidden] [groupwildcard] [...]:查看包组; yum groupremove group1 [group2] [...]:移除包组; yum groupinfo group1 [...]:查看包组相关信息,就是包组内有多少程序包等信息; ##Mandatory Packages:必须安装的包; ##Default Packages:默认安装的包; ##Optional Packages:可选安装的包(若是被依赖也会安装); 安装一个包组的时候,默认状况只会安装Mandatory或Default ,其中Optional Packages不会被安装,想改变这种状况须要/etc/yum.repos.d/xxxx.repo中加入此选项 group_package_types=default, mandatory, optional
一个YUM客户端能够指向一个或多个仓库(如:一个仓库存储的是基本程序包,一个仓库存储的是扩展程序包,一个仓库存储是第三方程序包);
当安装程序包时,若是存在多个同一类仓库(经过镜像来管理);yum会同时分析多个仓库,从中找出版本最新的程序包安装,而且能够经过自定义COST,实现优先使用自定义的仓库。
[root@Centos7 ~]# cat /etc/yum.conf ##Centos7.4,没有更改过彻底默认。 1表示使能,0表示不使能;等号左右不要有空格,不然可能出现语法错误; [main] ##仓库ID cachedir=/var/cache/yum/$basearch/$releasever ##缓存文件存放目录 keepcache=0 ##缓存文件是否保存下来 debuglevel=2 ##debug调试级别,默认为2 logfile=/var/log/yum.log ##日志文件路径 exactarch=1 ##安装程序包的时候,作精确地平台匹配(例如:配置为0则容许在i386上更新i686的RPM包) obsoletes=1 ##仅在更新的时候生效,容许更新陈旧的RPM包 gpgcheck=1 ##安装程序包的时候,检查GPG(GNU Private Guard) plugins=1 ##是否容许使用插件(咱们通常会用yum-fastestmirror这个插件) installonly_limit=5 ##同时安装几个程序包 bugtracker_url=http://bugs.centos.org/set_project.php?project_id=23&ref=http://bugs.centos.org/bug_report_page.php?category=yum ##追踪BUG的URL distroverpkg=centos-release ##指定基准包,yum会根据这个包判断发行版本
repo文件是Fedora、Redhat和Centos中yum源(软件仓库)的配置文件,一般一个repo文件定义了一个或者多个软件仓库的细节内容,例如咱们将从哪里下载须要安装或者升级的软件包,repo文件中的设置内容将被yum读取和应用!
Note:文件必须以.repo结尾,不然不会被YUM使用
一个repo文件能够指向一个仓库,为仓库的指向提供配置信息;
一个repo文件也能够指向多个仓库,只不过为了便于管理切割成了多个repo文件;
自定义repo文件的部分参数
1表示使能,0表示不使能;等号左右不要有空格,不然可能出现语法错误; [repositoryID]: ##设定仓库ID(main不能做为ID,由于它是公共的); name=Some name for this repository ##设定YUM仓库名; baseurl=url://server1/path/to/repository/ ##设定YUM仓库访问路径(指向repodata这个目录的上级目录); url://server2/path/to/repository/ ##第二行及其以后的URL不能顶格写 url://server3/path/to/repository/ mirrorlist= ##不能与baseurl同时使用,设定镜像服务器地址URL(指向的是个文本文件,里面存放多个指向仓库的URL,YUM会将这个文件下载到本地而后链接仓库); enabled={1|0} ##设定是否启用仓库,默认启用; gpgcheck={1|0} ##设定是否在安装此仓库中的程序包时,进行GPG校验,来RPM包的完整性和来源合法性; repo_gpgcheck={1|0} ##设置是否检查仓库元数据签名信息; gpgkey=URL ##指向GPG密钥文件的访问路径(多是仓库或权威机构提供); enablegroups={1|0} ##设置是否在仓库上使用组批量管理程序包; failovermethod={roundrobin|priority} ##故障转移方法(轮询|优先级),默认为roundrobin随机挑选,priority是按顺序选择; exclude=compiz* *compiz* fusion-icon* ##用来禁止这个软件仓库中的某些软件包的安装和更新,可使用通配符,并以空格分隔,能够视状况须要自行添加; keepalive={1|0} ##是否当远程服务器是HTTP/1.1时,保持链接功能; username ##有些服务器不支持匿名访问,须要指明要访问服务器的用户名; password ##有些服务器不支持匿名访问,须要指明要访问服务器的密码; cost= ##访问仓库的开销(默认为1000),用数字表示; group_package_types=default, mandatory, optional ##安装包组中指定类型的包;
示例:
[centosplus] baseurl=http://mirrors.aliyun.com/centos/$releasever/centosplus/$basearch/ http://mirrors.aliyuncs.com/centos/$releasever/centosplus/$basearch/ http://mirrors.cloud.aliyuncs.com/centos/$releasever/centosplus/$basearch/ gpgcheck=1 enabled=0 gpgkey=http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7
$releasever:程序的版本,对YUM而言指的是redhat-relrase版本。只替换为主版本号,如Redhat6.5 则替换为6
$arch:系统架构
$basearch:系统基本架构,如i686,i586等的基本架构为i386
$YUM0-$YUM9:在系统定义的环境变量,能够在yum中使用
YUM仓库存储了众多的RPM包,以及包的相关的元数据文件,其中包含元数据在内的一些文件就是放置于repodata目录下的;
通常出现的找不到repodata目录或文件的错误的缘由一般有三个:
repodata做为软件的仓库,其目录下有四个必要文件,其中最主要的是repomd.xml文件。
[Allen@Centos7 ~]$ ls -lh /mnt/sdf/repodata/ total 13M -rw-r--r--. 1 root root 1.3M Sep 10 14:07 4153601518ea9bea00dea4b73816fccd29a5167fca6902ee31f536e023763371-other.sqlite.bz2 -rw-r--r--. 1 root root 953K Sep 10 14:07 a7877ff695cd6b491a74016534c4201fcf0aa92f2bf7301c7cf72488e72f9807-other.xml.gz -rw-r--r--. 1 root root 3.2M Sep 10 14:07 bcb5a2092e7ad381b6e5b6f7982ca60efde0fd570bec36afb318829b0892152c-filelists.xml.gz -rw-r--r--. 1 root root 1.5M Sep 10 14:07 c2839d685c7b3885e9d9d883e3d2eff9f857a0ab8a6dbb4c8ada69fc041283a5-primary.xml.gz -rw-r--r--. 1 root root 3.1M Sep 10 14:07 d6ce21daefa0b83ba93871586fcf46030b8cea7675b31b42734353c112c165b7-primary.sqlite.bz2 -rw-r--r--. 1 root root 3.1M Sep 10 14:07 ee7a27844625d211f084876e6f94e1768f2a747d612c7252d77bee234405934d-filelists.sqlite.bz2 -rw-r--r--. 1 root root 3.1K Sep 10 14:07 repomd.xml ...primary:存储主matadata数据,包括全部包名,版本号,依赖关系等等; ...filelists:保存了每一个程序包安装后会生成的文件; repomd:存储了以上6个文件的指纹信息(校验码);即当yum从远程仓库下载程序包时,就先下载这个文件,比较与本地是否一致,若是一致,本地缓存继续有效,不然从新下载;
每一个rpm包都包含一个内部文件清单,每个文件就是capability,若是这个程序包还能额外提供其它的capability,须要在制做rpm包的sbark文件中显示说明;
YUM仓库经过createrepo_c命令,经过分析每个rpm包自带的元数据,而后抽取出来,并罗列保存在元数据文件里,好比:在制做rpm包时,每一个包叫什么名字、依赖哪些包、提供哪些capability等,这些信息在制做rpm包时都已经提供了。
createrepo命令建立高级仓库时比较困难,高级仓库中要对程序包分组,建立分组,组文件是xml格式的,所以要建立时要精通xml语法才能建立;
createrepo_c就能够建立repodata目录
NAME
createrepo_c - Create rpm-md format (xml-rpm-metadata) repository
SYNOPSIS
createrepo_c [options] <directory>
OPTIONS
-u,--baseurl <url>:可选指明base URL本地的路径; -o,--outputdir <url>:可选输出目录的路径; -x,--excludes <package>:排除指定的程序包; -i,--pkglist <filename>:包含对哪些包建立; -g,--groupfile <groupfile>:指明包组文件; --basedir:指明获取repodata的basedir路径,默认当前工做目录; --update:只更新那些在上次产生元数据以后被改变(基于文件大小和mtime),添加或者删除了的项目,这能够大大减小I/O和处理时间; --update-md-path:使用已经存在的repodata。 -o --outputdir <URL>:可选的输出目录
[Allen@Centos7 ~]$ cat /etc/yum.repos.d/cd.repo [mycdrom] name=Centos7.4 baseurl=file:///mnt/iso/ enabled=1 gpgcheck=1 gpgkey=file:///mnt/iso/RPM-GPG-KEY-CentOS-7 [root@study ~]# yum --enablerepo=mycdrom install software_name
一、建立目录 mkdir /mnt/sdf 二、拷贝rpm包到本地YUM仓库的目录 cp /mnt/iso/Packages /mnt/sdf 三、在仓库所在目录下更新建立源(repodata) ##最终会在/mnt/sdf下建立一个叫作repodata的目录 createrepo /mnt/sdf # 从新生成metadata,若是以前存在repodata可使用--update进行更新; 四、建立配置文件 cat >/etc/yum.repos.d/custom.repo<<EOF [Centos7.4] name=Custom YUM baseurl=file:///mnt/sdf/ ##指向repodata这个目录的上级目录(repodata目录所在的目录) enabled=1 gpgcheck=1 gpgkey=file:///mnt/iso/RPM-GPG-KEY-CentOS-7 EOF
包含kernel在内的全部程序都进行升级,kernel重启后生效
手动执行 yum -y update 建立系统定时任务,这个任务会被crond服务按期执行 echo '10 1 * * * root /usr/bin/yum -y --enablerepo=epel update' > /etc/cron.d/yumupdate