YUM:Yellow dog Updater Modified
程序员文章站
2022-03-23 21:00:45
1. 什么是YUM YUM(全称为 Yellow dog Updater Modified) 是一个在Fedora和RedHat以及CentOS中的Shell前端软件包管理器。基于RPM包管理,能够从指定的服务器自动下载RPM包并且安装,可以自动处理依赖性关系,并且一次安装所有依赖的软件包,无须繁琐 ......
# 1. 什么是yum
yum(全称为 yellow dog updater modified)
是一个在fedora和redhat以及centos中的shell前端软件包管理器。基于rpm包管理,能够从指定的服务器自动下载rpm包并且安装,可以自动处理依赖性关系,并且一次安装所有依赖的软件包,无须繁琐地一次次下载、安装。
**yum是c/s架构,是rpm的前端工具,依赖于rpm存在的**
服务器端:
首先要是一个文件服务器,有很大的存储空间,里面放着rpm包、元数据文件、conf文件、binary信息。并通过文件共享服务让外部客户端可以访问到存放rpm包的目录。
> yum支持的文件服务器有以下几种:
> - ftp://
> - http://
> - nfs://
> - file:/// ##为什么有三个斜杠,这是因为第三个斜杠是linux目录中的斜杆
客户端:
1. 支持rpm包管理基本功能,本地也要有yum程序;
2. 本地要有配置文件(配置远程服务器yum仓库或本地服务器yum仓库);
# 2. yum的工作流程
在客户端,当yum接收到用户命令(例如:安装程序包的命令)之后,会向着本地配置文件中配置的服务器地址(url)发起连接。yum不会直接向服务器请求程序包,而是请求yum服务器上存放rpm包名、版本、包和包之间依赖关系的元数据文件。这个文件下载到本地之后,会先存放到cache中,然后yum会在本地上分析这个文件中是否存有要安装程序包的包名,如果有就根据这个元数据文件尝试分析该包的依赖关系,得出要依赖哪些程序包之后,就在本地已安装的程序包中查询被依赖的包中哪些已安装,哪些没有安装;
分析完之后,yum会启动文件服务器的客户端向着yum服务器下载那些没有安装的程序包。下载完成后先缓存在本地,在本地开始执行类似于rpm安装的操作;而安装时会先安装被依赖的程序包,所有程序包安装完成后会通知客户端,并自动删除缓存区中的程序包以节省空间;但是元数据不会被删除,因为下次再安装新的程序包时,直接分析本地的元数据就可以获取依赖关系,通过这种方式可以节省时间与网络带宽。
但是上述这种机制,也存在着一些问题,万一服务器上的程序包或者依赖关系发生了变化,就会导致服务器和客户端本地的元数据不一致。想解决这个问题,可以在每次使用yum的时候,都向服务器请求元数据。但是这种方式浪费带宽和时间,有的时候明明没有变化,但还是需要下载。
yum服务器上有一个特殊文件,文件中记录了每一个元数据文件的校验码,实际上每次运行yum的时候,都会向服务器请求这个文件(刚刚配置好yum源的时候,本地没有这个文件,这时候肯定是要下载元数据的),并和本地元数据中的校验码文件进行对比,如果一致则代表元数据没有变化,本地元数据有效,否则就重新请求元数据。
# 3. yum命令
## 3.1 常用命令行选项
如果一个功能在配置文件中使能了,却在命令行运行命令的时候去使能了,命令行优先。
```
-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:指定下载目录
```
## 3.2 查询功能
**显示仓库列表**
`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 ##查看的是统计数据;
```
## 3.3 安装/升级/移除功能
**安装程序包**
```
默认会安装最新的,安装的时候指定部分包名就行,不需要指定完成的rpm程序包名称
yum install package1 [package2] [...]
```
**重新安装程序包**
```
重新安装(基于覆盖方式安装),类似于rpm -ivh --replacepgks
yum reinstall package1 [package2] [...]
```
**升级程序包**
`yum update [package1] [package2] [...]`
**降级程序包**
```
类似于rmp -uvh --oldpackages
yum downgrade package1 [package2] [...]
```
**检查可升级的程序包**
`yum check-update `
**卸载程序包**
```
卸载某个程序包,会把依赖它的程序包也一起卸载
remove | erase package1 [package2] [...]
```
## 3.4 清除/构建缓存
当更换新的yum仓库之后,执行一次清理和构建是很有必要,这可以使得本地和yum仓库中的元数据等信息同步。
**清理本地缓存目录**
用于清理在yum缓存目录中积累的各种各样的东西
`yum clean [ packages | metadata | expire-cache | rpmdb | plugins | all ]`
**构建元数据**
下载并使用所有当前可用的yum仓库的元数据
`yum makecache [fast]`
## 3.5 安装/升级本地程序包
**安装本地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
```
## 3.6 包组管理相关命令
```
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
```
# 4. yum客户端的配置文件
## 4.1 主配置文件/etc/yum.conf
一个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会根据这个包判断发行版本
```
## 4.2 仓库文件/etc/yum.repos.d/xx.repo
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 ##安装包组中指定类型的包;
```
## 4.3 yum的repo配置文件中可用的变量
**示例:**
```
[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中使用
# 5. repodata目录
yum仓库存储了众多的rpm包,以及包的相关的元数据文件,其中包含元数据在内的一些文件就是放置于repodata目录下的;
一般出现的找不到repodata目录或文件的错误的原因通常有三个:
1. 路径问题;
2. 没有生成repodate目录;
3. *.repo配置文件冲突。
repodata作为软件的仓库,其目录下有四个必要文件,其中最主要的是repomd.xml文件。
1. filelists.xml.[gz]
2. other.xml.[gz]
3. primary.xml.[gz]
4. repomd.xml(md意思是metadata)
```
[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从远程仓库下载程序包时,就先下载这个文件,比较与本地是否一致,如果一致,本地缓存继续有效,否则重新下载;
```
# 6. createrepo_c命令
每个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] `
**options**
```
-u,--baseurl :可选指明base url本地的路径;
-o,--outputdir :可选输出目录的路径;
-x,--excludes :排除指定的程序包;
-i,--pkglist :包含对哪些包创建;
-g,--groupfile :指明包组文件;
--basedir:指明获取repodata的basedir路径,默认当前工作目录;
--update:只更新那些在上次产生元数据之后被改变(基于文件大小和mtime),添加或者删除了的项目,这可以大大减少i/o和处理时间;
--update-md-path:使用已经存在的repodata。
-o --outputdir :可选的输出目录
```
# 7. 配置yum实验
## 7.1 使用系统光盘作为yum源
```
[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
```
## 7.2 在本地构建yum仓库
```
1、创建目录
mkdir /mnt/sdf
2、拷贝rpm包到本地yum仓库的目录
cp /mnt/iso/packages /mnt/sdf
3、在仓库所在目录下更新创建源(repodata)
##最终会在/mnt/sdf下创建一个叫做repodata的目录
createrepo /mnt/sdf # 重新生成metadata,如果之前存在repodata可以使用--update进行更新;
4、创建配置文件
cat >/etc/yum.repos.d/custom.repo /etc/cron.d/yumupdate
```
上一篇: 虾米音乐歌单怎么转到酷狗? 酷狗音乐导入虾米音乐歌单的技巧
下一篇: C++优先级