标签:yum yumrepo
友情提醒:本文的实验平台vmware 10 + Centos 6.6 X86_64,所述内容中的命令请谨慎使用。
-------------------------------------楔子--------------------------------------------------
胖子法师上次在小酒馆中,关于《grep与正则表达式使用》的阐述为其赢得了几个粉丝。今日在魔法塔中喜滋滋翻看着粉丝来信,一封信中提到在Gnu/Linux os平台上安装程序包的种种不顺,这又勾起了胖子好为人师的念头,他决定再写篇博文关于yum工具的使用,来解救他那为数不多的粉丝。为什么胖子要写yum而不是apt-get呢?因为法师胖子的魔法属于北美redhat流派,仅此而已。
------------------------------------------------------------------------------------------
1.yum是什么?
yum全名:Yellowdog Updater Modified,是个程序包安装管理工具,广泛用在始于redhat系列
发行版的,基于Gnu/linux为内核的os平台上。相对于工具rpm而言yum可自动解决程序包的依赖性,
但yum只是rpm的前端工具,也就是说没有yum,rpm工具依然可以工作,但是没有rpm工具,yum便要歇菜。
2 为什么存在包安装工具和程序包依赖性问题?
组成计算机的硬件所提供的功能,被安装在其上的操作系统抽象为系统调用,为了使程序开发
更加便捷,周期缩短,又将系统调用抽象为功能模块,被称为库。那么再开发程序时,若想使用底层硬件的功能,只需在代码中加入对相应的库的调用即可。开发者编写的代码被称为伪码,必须经过编译的过程才能变为可在操作系统上执行的二进制程序。
而这个编译的过程依据开发语言的不同又分为多个阶段,以C语言开发的程序为例,编译过程为:
源代码-->预处理-->编译-->汇编-->链接-->可执行程序。这个复杂的过程大大增加了程序的安装的
难度。各个发行商都在为帮助其用户跨越这个障碍做着改进,通用的做法是:给其用户提供不再是源代码而是可以在各自os上运行的兼容二进制程序包。因而有了例如windows平台的exe程序,redhat系列平台的rpm格式的包。windows使用注册表管理这些被安装的exe程序,redhat系列使用rpm工具管理rpm包。
这些可被安装的二进制程序一般包含:可执行程序,库文件,配置文件,帮助和文档。其中的库文件不单指上文中提到的底层硬件的功能库,还包含在这个程序体中被大多数程序共同用到功能模块。
它即为本程序提供功能,在程序安装后又可被其它程序所使用。正式因为这个库可被其它程序所使用,才造成了程序的依赖。比如要安装程序A,A提出需要一个库模块D,经过查询模块D由程序B安装后提供,
那么只有先安装B程序,才能得到库模块D,有了库程序D才能安装程序A,这就是程序的依赖。
这里描述的很简单,但是在实际应用中让人很困惑,有时google都不一定能查到模块D是有哪个程序提供。在redhat系列os上虽然rpm功能能管理rpm包,但是却不具有解决这种依赖性的能力。yum的出世替rpm缓解了这个问题。
3 yum工作过程的描述,配置文件说明和yum仓库的配置
3.1)yum工作过程的描述
yum工具的工作框架是C/S模式的,分为服务器端和客户端。
服务端又被称为yum仓库,包含:rpm程序包和这些程序包的描述文件。
这些描述文件主要包含:软件包的名称,软件包安装后生成的文件列表,软件包的额外信息,软件包的修改日志等。
放置在rpm程序包所在的目录的下一级子目录repodate中。使用createrepo命令生成。
客户端包含:
(1)yum命令行工具yum。
(2)yum的配置文件/etc/yum.conf,该文件是对yum工具的使用特性的定义。(参见3.2)
(3)yum库的配置文件/etc/yum.repos.d/xxx.repo,该文件中详细定义yum仓库编号,位置,客户端与服务器端如何交互,该仓库的启用情况和是否对仓库中的软件包进行校验。(参见3.2)
当客户端第一次使用yum命令时,yum命令自动去服务器端yum仓库中下载程序包的描述文件,并存至本地磁盘中。而后使用yum命令时会自动去服务端下载这些描述文件的校验码同本地文件的校验码进行比较,若一致,则表示服务器端rpm包没有发生变化,可继续使用本地这些描述文件进行程序包分析。若校验码不一致,则去服务器端下载最新的程序包描述文件。
当客户端使用yum安装程序时,会使用本地缓存的服务端yum库程序包描述文件,借助本地rpm安装库,分析出该程序是否已安装,若没安装则分析程序是由哪个rpm包安装后生成,所依赖的库程序有哪些, 哪些库程序在本地已安装,还需安装哪些rpm包才能提供其他的库程序,去哪个yum仓库中可寻找到需要的rpm包。然后根据/etc/yum.repos.d/xxx.repo中定义的库位置和交互方式去服务器端相应的yum仓库下载这些需要的rpm包,并执行安装,然后删除这些下载的rpm包(默认行为,可修改)。
yum的其他操作如查询,升级同上。
3.2)配置文件说明:
/etc/yum.conf:该文件是对yum工具特性的定义。
[root@Test01 ~]# cat /etc/yum.conf
[main]
cachedir=/var/cache/yum/$basearch/$releasever
#cachedir定义了一个目录,用来存放yun客户端从服务端yum仓库中下载的程序包描述文件和下载的要安装的程序包。
#$basearch是个宏,表示:适合客户端的平台类型。$releaserver同样也是个宏,表示:os版本类型。
keepcache=1
#表示是否存储下载的rpm包,当值为0时表示不存储,安装后删除下载的rpm包。当值为1时,表示存储下在的rpm包,存放在
#/var/cache/yum/$basearch/$releasever/$repoid/pachages/下
debuglevel=2
#使用yum时显示的调试信息
logfile=/var/log/yum.log
#放置日志文件的位置
exactarch=1
#下载安装包时是否同自己平台绝对一致。1绝对一致,即你平台是i386的,不会安装i686的包。
obsoletes=1
#要不要检查包是不是被废弃。
gpgcheck=1
#是否检查包的来源合法性和完整性
plugins=1
#yum是否支持插件
installonly_limit=5
#限制一次同时安装的程序包的个数
bugtracker_url=http://bugs.centos.org/set_project.php?project_id=16&ref=http://bugs.centos.org/bug_report_page.php?category=yum
#指定bug追踪的路径
distroverpkg=centos-release
#选择发行版程序包的样例
#。。。。。。。。
# PUT YOUR REPOS HERE OR IN separate files named file.repo
# in /etc/yum.repos.d
------>最后这2行是个说明,指定了服务端yum仓库的配置文件放置的位置和文件名样例。
[root@Test01 ~]#
/etc/yum.repos.d/:这个目录中存放了服务端yum仓库的配置文件,这些文件必须是以".repo"结尾,而名字不重要。
这些服务端rpm仓库可每个仓库一个配置文件,也可多个仓库写在同一个配置文件中。
举个例子说明文件的写法:
[root@Test01 yum.repos.d]# cat centos6.6.repo
[base]
#这是yum仓库ID要求客户端本机唯一
name=CentOS $releasever $basearch on local server 172.16.0.1
#这是yum仓库的简单描述
baseurl=http://172.16.0.1/cobbler/ks_mirror/CentOS-6.6-$basearch/
#这定义了服务端yum仓库的位置和yum客户端使用那种协议同服务器端中该仓库进行交互。
#可定义多个url路径。baseurl=url://server1/path/to/repository/
# url://server2/path/to/repository/
#同服务器端仓库的交互方式有http;ftp,若使用本地yum仓库,使用file:///PATH/TO/REPO/
#baseurl 不可同mirrorlist同时定义。
#mirrorlist的写法请参考系统/etc/yum.repos.d/中自带yum仓库配置文件中的写法。
gpgcheck=0
#这定义了是否对从服务器端下载的rpm进行来源校验和包完整性校验。值为0时不校验。值为1时校验,还需定义新的一行
#gpgkey=file:///PATH/TO/key-file
#来指明key文件的位置。
enabled=1
#是否启用这个库,值1启用,值0不启用。
[root@Test01 yum.repos.d]#
yum 仓库repodate目录中文件的说明:
primary.xml.gz:定义了当前仓库中所有的rpm包列表以及各包之间的依赖关系和每个软件包安装生成的文件列表
filelists.xml.gz:当前仓库中所有RPM包的文件列表
other.xml.gz:额外信息,rpm包的修改日志
repomd.xml:记录的是上面三个文件的时间戳和校验和
comps-*.xml:RPM包分组信息(需要手动定义)
3.3)yum仓库的配置举例:
*提醒:
下文中的绿色字体 #开头行,-->后的内容 ,#-->后的内容都是说明,都不要写在你的配置文件中。
蓝色字体为输入shell中命令
3.3.1)使用光驱中的系统光盘配置一个本地yum仓库:
1)将系统光盘放置在光驱中,并将光驱挂载至系统上
在centos 6上光驱一般被认为是/dev/sr0
[lijun@Test02 ~]$ sudo mount |grep ‘sr0‘ -->检查本地是否已经挂载光驱文件
[lijun@Test02 ~]$ sudo ls /media -->检查/media目录下已存在的目录文件
[lijun@Test02 ~]$ sudo mkdir /media/gp1 -->建立挂载目录/media/gp1
[lijun@Test02 ~]$ sudo mount -o ro /dev/sr0 /media/gp1/
-->将光驱挂载至建立的挂在点上
[lijun@Test02 ~]$ sudo mount | grep ‘sr0‘ -->检查下挂载的情况
/dev/sr0 on /media/gp1 type iso9660 (ro) -->发现光驱已被挂载好
[lijun@Test02 ~]$ cd /media/gp1/
[lijun@Test02 gp1]$ ls
CentOS_BuildTag isolinux RPM-GPG-KEY-CentOS-Debug-6
EFI Packages RPM-GPG-KEY-CentOS-Security-6
EULA RELEASE-NOTES-en-US.html RPM-GPG-KEY-CentOS-Testing-6
GPL repodata TRANS.TBL
images RPM-GPG-KEY-CentOS-6
[lijun@Test02 gp1]$
----->进入挂载点,观察光盘文件中存在的文件,Packages目录中是放置的rpm包。repodate中存放的是rpm包的描述文件,就不进入目录详细看了。
2)配置/etc/yum.repos.d/下的仓库指导文件:
[lijun@Test02 gp1]$ cd /etc/yum.repos.d/
[lijun@Test02 yum.repos.d]$ sudo mkdir beifen
[sudo] password for lijun:
[lijun@Test02 yum.repos.d]$ sudo mv CentOS* beifen/
#--------->上面这2步操作,主要是为了能验证本地yum仓库的有效性,而将系统自带的repo文件移走。
[lijun@Test02 yum.repos.d]$ sudo touch localyum.repo
#建立local.repo文件承载本地yum仓库的配置信息。
[lijun@Test02 yum.repos.d]$ sudo vim localyum.repo
[localyumrepo]
#指定本地yum仓库的仓库ID为localyumrepo
name=‘this is local yum repo‘
#给本地yum仓库做个简单描述
baseurl=file:///media/gp1/
#指定本地yum仓库的交互方式和仓库位置
#仓库位置就是上面光盘挂载的目录,注意file后面的///要有3个
enabled=1
#启用这个yum仓库
gpgcheck=0
#不对程序包的来源合法性和包完整性做校验
:wq
#希望你懂得:wq这个符号的用途,不要写在配置文件中
3)测试yum库
3.3.2)配置yum服务器共局域网内用户使用
环境设定:局域网2台计算机:
yum服务器A:主机名:Test01 ip:172.16.34.1/16,使用http交互方式局域网共享xen程序包yum库
测试客户端B:主机名:Test02 ip:172.16.34.2/16
服务器A上操作:
1)IP检查:
2)配置本地yum库安装httpd服务程序包和createrepo命令
配置本地yum库略,参见3.3.1)种举例
[lijun@Test01 ~]$ sudo yum -y install httpd createrepo
#使用本地yum库安装httpd程序和createrepo命令
[lijun@Test01 ~]$ yum list httpd createrepo #--->检查是否安装好
Loaded plugins: fastestmirror, refresh-packagekit, security
Loading mirror speeds from cached hostfile
Installed Packages
createrepo.noarch 0.9.9-18.el6 @localyumbase
httpd.x86_64 2.2.15-29.el6.centos @localyumbase
[lijun@Test01 ~]$
3)建立xen程序包目录并拷贝xen程序包生成数据描述文件和目录repodate
[lijun@Test01 ~]$ cd /var/www/html
[lijun@Test01 html]$ sudo mkdir xen4
[lijun@Test01 html]$ cd xen4/
#拷贝xen程序包,这里略过
[lijun@Test01 xen4]$ sudo createrepo .
#别忘了 createrepo命令后还有个点,表示当前目录
#------>使用createrepo命令为本目录下xen程序包生成目录repodate和xen程序包描述文件
[lijun@Test01 xen4]$ find . -type d -ls --->寻找当前是否有目录文件
24984 4 drwxr-xr-x 3 root root 4096 Apr 9 17:44 .
25027 4 drwxr-xr-x 2 root root 4096 Apr 9 17:44 ./repodata
[lijun@Test01 xen4]$ cd repodata/ ---->查看repodate目录下文件
[lijun@Test01 repodata]$ ls
0f8ae4790015fbfe94dfa9970338b45d4cb7d87e16e422659eae916053df99d4-other.xml.gz
5e09d94ecf0072f1a25d03799fb4d17a152ff092d425fef13cebb17119f2eab5-other.sqlite.bz2
6876ad11e89f7b4114efbfc97f4bc5055b7234e7d361e38a54dcf4c64c263ad4-primary.xml.gz
770a6f4d27e36b3160342cefae3adc950456148c863b4a031b41333cd20cea69-primary.sqlite.bz2
b427deb884b8357c03a921a7427b1389ebb4f69493a99990d54e0d0d7647b266-filelists.sqlite.bz2
d7a723ea54c18e1050ea6d1543b840c8137312ab9130d4731900c772de37023d-filelists.xml.gz
repomd.xml
[lijun@Test01 repodata]$
4)设定http服务并添加防火墙规则允许局域网对80端口的请求:
[lijun@Test01 ~]$ sudo service httpd start
[sudo] password for lijun:
Starting httpd: httpd: apr_sockaddr_info_get() failed for Test01.lijun.com
httpd: Could not reliably determine the server‘s fully qualified domain name, using 127.0.0.1 for ServerName
#这个提示是因为没有在httpd配置文件设定中servername的而采用127.0.0.1代替,算是个提示吧
[ OK ]
[lijun@Test01 ~]$ sudo service httpd status
httpd (pid 1753) is running...
[lijun@Test01 ~]$ sudo chkconfig --level 3 httpd on
#保证每次系统启动后http服务都能自动启动
[lijun@Test01 ~]$ sudo iptables -I INPUT -p tcp -s 172.16.0.0/16 --dport 80 -j ACCEPT
[lijun@Test01 ~]$ sudo iptables -I INPUT 2 -p tcp --dport 80 -j DROP
#添加了2条防火墙规则,只允许来自172.16.0.0/16网段的主机访问80端口
[lijun@Test01 ~]$ sudo cp /etc/sysconfig/iptables /etc/sysconfig/iptables-$(date +%F-%H-%M)
#给原来的防火墙规则文件做个备份
[lijun@Test01 ~]$ # su - -c "iptables-save>/etc/sysconfig/iptables"
#将内存中现在运行的规则写入防火墙规则文件中,保证每次重启80端口能被内网访问到
服务器B上配置和测试:
5)测试同服务器A的连通性:
[lijun@Test02 ~]$ sudo ip addr show eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:70:8f:01 brd ff:ff:ff:ff:ff:ff
inet 172.16.34.2/16 scope global eth0
inet6 fe80::20c:29ff:fe70:8f01/64 scope link
valid_lft forever preferred_lft forever
[lijun@Test02 ~]$ ping -c 1 -w 1 172.16.34.1
PING 172.16.34.1 (172.16.34.1) 56(84) bytes of data.
64 bytes from 172.16.34.1: icmp_seq=1 ttl=64 time=2.16 ms
--- 172.16.34.1 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 2ms
rtt min/avg/max/mdev = 2.169/2.169/2.169/0.000 ms
[lijun@Test02 ~]$ curl -I http://172.16.34.1
HTTP/1.1 200 OK
Date: Sat, 11 Apr 2015 00:10:42 GMT
Server: Apache/2.2.15 (CentOS)
Last-Modified: Fri, 10 Apr 2015 23:57:43 GMT
ETag: "5f47-55-5136787c0023f"
Accept-Ranges: bytes
Content-Length: 85
Connection: close
Content-Type: text/html; charset=UTF-8
6)配置B服务器上的/etc/yum.repos.d/xen.repo 文件
[lijun@Test02 ~]$ cd /etc/yum.repos.d/
[lijun@Test02 yum.repos.d]$ ls
beifen localyum.repo
#因为在上一个例子中用到了B服务器,因此beifen目录和localyum.repo文件
[lijun@Test02 yum.repos.d]$ sudo mv localyum.repo beifen/
#将localyum.repo移走放置干扰
[lijun@Test02 yum.repos.d]$ sudo touch xen.repo
[lijun@Test02 yum.repos.d]$ sudo vim xen.repo
[xen]
name=‘this is ip=172.16.34.1 server xen yum repo‘
baseurl=http://172.16.34.1/xen4/
enabled=1
gpgcheck=0
:wq
[lijun@Test02 yum.repos.d]$ sudo yum clean all
#清除系统现有yum repo的缓存文件
Loaded plugins: fastestmirror, security
Cleaning repos: xen
Cleaning up Everything
Cleaning up list of fastest mirrors
[lijun@Test02 yum.repos.d]$ sudo yum repolist
#使用yum repolist命令列出当前可使用的yum库有哪些
Loaded plugins: fastestmirror, security
Determining fastest mirrors
xen | 2.9 kB 00:00
xen/primary_db | 33 kB 00:00
repo id repo name status
xen ‘this is ip=172.16.34.1 server xen yum repo‘ 41
repolist: 41
[lijun@Test02 yum.repos.d]$ sudo yum search xen
#在配置的可使用yum库中寻找xen关键字,通过这种方式测试yum库的可使用性
Loaded plugins: fastestmirror, security
Loading mirror speeds from cached hostfile
=================================================== N/S Matched: xen ====================================================
xen.x86_64 : Xen is a virtual machine monitor
xen-debuginfo.x86_64 : Debug information for package xen
xen-devel.x86_64 : Development libraries for Xen tools
xen-doc.x86_64 : Xen documentation
xen-hypervisor.x86_64 : Libraries for Xen tools
xen-libs.x86_64 : Libraries for Xen tools
xen-licenses.x86_64 : License files from Xen source
xen-ocaml.x86_64 : Ocaml libraries for Xen tools
xen-ocaml-devel.x86_64 : Ocaml development libraries for Xen tools
xen-runtime.x86_64 : Core Xen runtime environment
kernel-xen.x86_64 : The Linux Kernel
kernel-xen-devel.x86_64 : Development package for building kernel modules to match the kernel
kernel-xen-firmware.x86_64 : Firmware files used by the Linux kernel
kernel-xen-headers.x86_64 : Header files for the Linux kernel for use by glibc
kernel-xen-release.noarch : Configuration files for package managers.
Name and summary matches only, use "search all" for everything.
[lijun@Test02 yum.repos.d]$
4 常用yum命令
通过$man yum 可以看到很详细的yum工具使用手册,这里介绍的是经常用到的几个
命令格式:
yum [options] [command] [package ...]
option:
-y :自动回答为 yes
--disablerepo=repoidglob :临时禁用某些启用的仓库
--enablerepo=repoidglob :临时启用某些配置文件中禁用的仓库
--nogpgcheck :对包不进行校验检查
**这些选项有的在配置文件中设定,那么遵循的原则是:作用范围小的优先生效。命令行中作用范围最小,因而重复的设定,命令行中的生效。
command:
管理repo仓库:
repolist 列出/etc/yum.repos.d/xxx.repo 文件中定义的库。
#yum repolist [all|enabled|disabled]
all:所有的
enabled:启用的
disabled:不可用的
缓存管理:
clean: 清理缓存的
#yum clean [packages|metadate|expire-cache|rpmdb|plugins|all]
程序包查看:
list:列出程序包
#yum list [all|glob-exp]
all:所有的包
glob-exp:使用通配符标识一类包
#yum list {available|updates|installed|extras|obsoletes [glob-expl]}
extras:库中没有提供,但已经安装在系统中的包
updates:可用于升级的包
obsoletes;已经安装过的,但repo中有更好的,可被替代的包,
recent:刚刚加入仓库的包
#yum grouplist {installed|available|}
*这是以包组为单位显示的
installed:已经安装过的
available:可以使用没有被安装的包
程序包安装:
install:安装程序包
#yum install [-y] PACKAGE_NAME [PACKAGE_NAME2]......
-y:自动安装,不在询问用户
* 仓库中某包有多个版本,默认安装最新的
想安装指定的版本 install PACKAGE-VERISON
reinstall :覆盖安装。
#yum reinstall PACKAGE_NAME
localinstall :安装本地rpm包非仓库中的rpm包,使用仓库解决依赖关系 #yum localinstall PACK-FILE
*在RHEL7中被废除
程序包的升级:
# yum update [package1]
*当想升级指定版本时,需指明程序包version
#yum localupdate PACK-FILE
使用本地包升级,使用仓库解决依赖关系。
*RHEL7中被废除
程序包的降级:
#yum downgrade package1 [PACKAGE2]...
检查有哪些升级可用;
#yum check-update
卸载:
#yum remove |erase package-name
*会一并卸载依赖当前包的程序包
查询:
info:查询包相关简要信息
#yum info package-name
provides 或者whatprovides: 查询文件由哪个包安装后生成
#yum provides|whatprovides file
搜索:
search key-word 将会显示 包名和简要信息中包含key-word的行信息。
#yum search key-word
#yum grouplist
显示包组信息:
# yum groupinfo "包名"
安装包组:
#yum groupinstall “包名"
升级包组:
#yum groupupdate "包名"
卸载包组:
#yum groupremove "包名"
**** rhel7 上没有专用包组命令。使用包命令 @”包组名“
eg:#yum install @"Server Platform Development"
本文出自 “哥不是海盗” 博客,谢绝转载!
标签:yum yumrepo
原文地址:http://pirateli.blog.51cto.com/10063802/1631109