linux软件包管理之二(yum安装)

前面我们说了rpm的使用,但开始安装以后产生的依赖关系却是最难搞定的。安装x,依赖y,安装y,依赖z,安装z,依赖x。循环依赖。何止难搞啊。

所以在这种情况下就出现了各种包管理器的前端工具:

可以自动解决依赖关系;
yum:rhel系列系统上rpm包管理器的前端工具;
apt-get (apt-cache):deb包管理器的前端工具;

apt-get是用来安装卸载的apt-cache可以用来基于关键词的搜索和管理本地缓存的元数据。   
dnf:Fedora 22+系统上rpm包管理器的前端工具;或许会成为yum的下一版本。


目录

一、yum

1、简介

2、yum客户端配置和仓库的设置

3、yum命令的使用



系统:CentOS_7.1


总结: 应用的安装方式
           1、  使用包管理器:便捷、易用;
           2、  包管理器的前端工具;yum, apt-get,zypper。
           3、  源代码编译;
           4、  简单打包的二进制格式;绿色软件,解压,配置即可运行。


一、yum。

1、简介


YUM: Yellowdog Update Modifier

yum的实现有两部分,一是本地的yum工具,二是yum仓库。


文件服务器(共享rpm包): 通过yum所支持的文件共享机制将各rpm包通过文件服务共享。
仓库存储了众多rpm包,以及包的相关的元数据文件(放置于特定目录下:repodata)


本地yum安装软件的过程:

yum会根据yum配置中所指定的yum仓库,把yum仓库中的元数据文件,缓存到本地,然后分析元数据文件。yum会根据yum仓库中的元数据文件,来分析是否存在所要安装的rpm包所依赖的还未在本机安装的各个rpm包文件,和这些rpm包所依赖的rpm包文件。一切就绪以后,就去yum仓库下载本机还未安装的rpm包,完成安装。
                                    
yum判断包是否已存在,是检测rpm的数据库。 不检测别的路径之类的。yum解决依赖关系是用包来判断的。而不是像编译安装源码的时候,由ld程序来判断库是否存在。所以如果rpm数据库坏了的话,会要安装很多包。  


2、yum客户端配置和仓库的设置

要使用yum管理应用程序,首先得配置其可用的yum仓库,保存在配置文件中:

/etc/yum.conf:为所有仓库提供公共配置
/etc/yum.repos.d/*.repo:为仓库的指向提供配置


配置文件格式:由两段组成,类似windows的ini配置文件。
[main] : 主配置段
[repo] : 仓库配置段

其中/etc/yum.conf中一般是[main]配置段的设置,/etc/yum.repos.d/下面的各以.repo结尾的文件一般都是配置[repo]仓库段的。当然也可以把仓库段写到yum.conf文件中。不过这样分开设置的原因就是为了清晰,容易配置。


我们看下/etc/yum.conf文件中的一些配置:

[main] : 主配置段 
cachedit  缓存目录 
keepcache  是否缓存二进制文件。 0 不缓存, 1 缓存。
debuglevel 调试级别  
logfile   日志文件
exactarch  精确匹配与当前系统的版本号 1 匹配   0是 不用匹配
gpgcheck   校验包完整性,来源合法性。  1 校验   0 不校验。
plugins    支持插件

这个文件不用我们的过多关心。我们主要关心yum.repos.d目录下的仓库文件就好。

配置repo:
[repo_ID]              #注意,所有设置的仓库ID都不能相同。 
name=string            #仓库名称
baseurl=url://path/to/repository/   #仓库的访问路径
enabled={1|0}         #1表示启用   0表示禁用     没有这一项默认也是启用。
gpgcheck={1|0}        #1表示启用,还要指定gpgkey.  0表示禁用  如本地的话无所谓了。
gpgkey=URL            #公钥文件(可以在本地,也可以在服务器端路径),
enablegroups={1|0}    #是否启用组,如果仓库端支持组,可以开启。默认就是开启的。
failovermethod={roundrobin|priority}  #在baseurl指向多个路径的时候,如何选择路径。
                        #默认为:roundrobin,意为随机挑选;
cost=                   #定义此仓库的开销,默认为1000。  值越小,优先级越高。

一个repo文件可以设置多个仓库信息。 baseurl指定仓库的的方式:

客户端配置文件指定对应服务器访问方式: 
ftp   ftp://****/repo
http  http://****/repo
nfs   ntf://****/nts_path
file  file:///****/repository     三个斜线是因为一个是本地的根目录路径。
所指向的目的就是有repodata目录的目录。

我们这里举个例子,就以我们系统的光盘为例,它就是一个仓库。

wKiom1Z9N5uj38D5AACXp3fF1KA784.jpg

这个光盘的根目录下就有repodata目录,所以我们的路径只要指向光盘的根目录就行。

用系统光盘配置本地的yum源

[root@localhost cdrom]# vim /etc/yum.repos.d/local.repo

[local]
name=local-ISO-local
baseurl=file:///mnt/cdrom
cost=100
gpgcheck=0

配置完了,怎么样,是不是太简单了。不过事实也就这样,如果是网络的yum仓库,可以再加上gpgkey。再提醒一下,上面的[local]是仓库ID,设置的所有ID都不能相同。

我们来试一下:

[root@localhost yum.repos.d]# yum clean all
Loaded plugins: fastestmirror, langpacks
Cleaning repos: local
Cleaning up everything
Cleaning up list of fastest mirrors
[root@localhost yum.repos.d]# yum repolist
Loaded plugins: fastestmirror, langpacks
local                                                                           | 3.6 kB  00:00:00     
(1/2): local/group_gz                                                           | 154 kB  00:00:00     
(2/2): local/primary_db                                                         | 5.1 MB  00:00:00     
Determining fastest mirrors
repo id                                     repo name                                            status
local                                       local-ISO-local                                      8,652
repolist: 8,652
[root@localhost yum.repos.d]#


看一下这个的:

[base]
name=CentOS-$releasever - Base
baseurl=http://172.16.0.1/cobbler/ks_mirror/CentOS-7-x86_64-1503/
        file:///media/cdrom
gpgcheck=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
enabled=0

这里多了key的设置,而且这个库是没有启用的。其中我们看到baseurl有两个地址,failovermethod就是用来如何选择这两个地址的。


在我们的仓库源的配置中,还有yum的内置变量:

yum的repo配置文件中可用的变量:
$releasever: 当前OS的发行版的主版本号;
$arch: 平台;
$basearch:基础平台;
$YUM0-$YUM9    提供的10个可以自定义的变量$YUM0-$YUM10。

[epel]
name=Fedora EPEL
baseurl=http://172.16.0.1/fedora-epel/$releasever/$basearch/
gpgcheck=0
enabled=0

来两张图看一下。我打开的http://172.16.0.1/fedora-epel/。里面显示的就是$releasever。

wKiom1Z9P9OAT7ZuAAFdsKfqrfg180.jpg

我这里是CentOS7的,主版本为7,点开以后。显示的就是$basearch。我这里是x86_64。所以在我的主机上,yum所找的路径就是http://172.16.0.1/fedora-epel/7/x86_64/的路径。

wKioL1Z9QEewOTpnAAE8K7FaiJo843.jpg



创建yum仓库
        createrepo [options] <directory>

我们在只有一部分包的时候,可以自己用这个命令来生成repodata目录,里面都是元数据。

只不过如查想做关于包组的设置就很复杂了,还要编辑xml文档。 不过我们这里可搞不了这么复杂的东西,只是简单的做一个仓库而已。

[root@localhost Packages]# pwd
/var/Tomcat/Packages
[root@localhost Packages]#

现在我在Packages的目录下放了一些程序包。如果想把repodata的目录生成到Packages的目录里面,与程序包在一起,就执行createrepo Packages /var/Tomcat/Packages就可以。如果想把repodata的目录生成在Tomcat的目录中,就写/var/Tomcat。总之想把repodata目录在哪生成,就把路径写到哪。

[root@localhost Tomcat]# createrepo /var/Tomcat
Spawning worker 0 with 6 pkgs
Spawning worker 1 with 5 pkgs
Workers Finished
Saving Primary metadata
Saving file lists metadata
Saving other metadata
Generating sqlite DBs
Sqlite DBs complete
[root@localhost Tomcat]# ls
Packages  repodata
[root@localhost Tomcat]# ll repodata/
total 72
-rw-r--r-- 1 root root 21530 Dec 25 21:56 282d63e759701587df0e25f630bf0da57cd43e03dbe8fc1a82c2d55ddf3f4eec-filelists.sqlite.bz2
-rw-r--r-- 1 root root  4795 Dec 25 21:56 8f7537e789f91b7341edc73c5b292490c3f3ae0e858dbcc246efa0a258c0e6ea-other.sqlite.bz2
-rw-r--r-- 1 root root  3251 Dec 25 21:56 a5ab93ffbc767157518f1645ae0aa99085b1fe68d1c247a039b8cd5df9e02234-primary.xml.gz
-rw-r--r-- 1 root root  7067 Dec 25 21:56 b0ec609f795a0170b5076f3a0364b5e838ed809577b3a6918f368aaa10b2b184-primary.sqlite.bz2
-rw-r--r-- 1 root root  2226 Dec 25 21:56 d5b90d9abf14281cc9c10cc8509b6a5a5eb5fab43cc26a8339cb7fe715ddc7fb-other.xml.gz
-rw-r--r-- 1 root root 17957 Dec 25 21:56 f49edcdd8e44b5b61542bf4323695d76dbe4b05f710fded09f0a3457db5c8f7f-filelists.xml.gz
-rw-r--r-- 1 root root  2979 Dec 25 21:56 repomd.xml
[root@localhost Tomcat]#


软件仓库这就完成了。来做个源的配置看看:

[root@localhost Tomcat]# vim /etc/yum.repos.d/tomcat.repo
[tomcat]
name=tomcat_local
baseurl=file:///var/Tomcat
gpgcheck=0
cost=10

[root@localhost Tomcat]# yum repolist
Loaded plugins: fastestmirror, langpacks
Loading mirror speeds from cached hostfile
repo id                                        repo name                                         status
local                                          local-ISO-local                                   8,652
epel/7/x86_64                                  Fedora EPEL                                       8,508
tomcat                                         tomcat_local                                         11
repolist: 17,171
[root@localhost Tomcat]#

  有了,我们的tomcat有11个包,包是有点少,但我们设置成功了。

[root@localhost Tomcat]# yum install tomcat
=======================================================================================================
 Package                            Arch          Version                          Repository     Size
=======================================================================================================
Installing:
 tomcat                             noarch        7.0.54-1.el7                     tomcat         85 k
Installing for dependencies:
 apache-commons-collections         noarch        3.2.1-21.el7                     local         506 k
 apache-commons-daemon              x86_64        1.0.13-6.el7                     local          54 k
 python-lxml                        x86_64        3.2.1-4.el7                      local         758 k
 tomcat-el-2.2-api                  noarch        7.0.54-1.el7                     tomcat         76 k
 tomcat-jsp-2.2-api                 noarch        7.0.54-1.el7                     tomcat         90 k
 tomcat-lib                         noarch        7.0.54-1.el7                     tomcat        3.7 M
 tomcat-servlet-3.0-api             noarch        7.0.54-1.el7                     tomcat        207 k
 ttmkfdir                           x86_64        3.0.9-41.el7                     local          47 k
.....

可以看到tomcat的源已经可以正常使用了。结果也安装成功了。


3、yum命令的使用

yum [options] [command] [package ...]

yum的命令行选项:
--nogpgcheck:禁止进行gpg check;

在用yum安装本地包的时候可能会用到。不然没有key是无法安装的。
-y: 自动回答为“yes”;不用确认,自动安装。
-q:静默模式;
--disablerepo=repoidglob:临时禁用此处指定的repo;
--enablerepo=repoidglob:临时启用此处指定的repo;
--noplugins:禁用所有插件;


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 [...]
* 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]
* version [ all | installed | available | group-* | nogroups* | grouplist | groupinfo ]
* history [info|list|packages-list|packages-info|summary|addon-info|redo|undo|rollback|new|sync|stats]
* check
* help [command]


常用到的:


显示仓库列表:默认只显示enabled的仓库。

        repolist [all|enabled|disabled]


显示程序包:最常使用的就是 yum list all | grep ****。来查找某个不确定名称的包。

        list

         # yum list [all | glob_exp1] [glob_exp2] [...]
         # yum list {available|installed|updates} [glob_exp1] [...]

[root@localhost yum.repos.d]# yum list zs* php*
Loaded plugins: fastestmirror, langpacks
Loading mirror speeds from cached hostfile
Installed Packages
php-common.x86_64                                 5.4.16-23.el7_0.3                           installed
zsh.x86_64                                        5.0.2-7.el7                                 @local

用通配符来匹配包名称。对应于上面glob_exp1...的部分。

而available那部分,只列出可以安装的,已安装的,有更新的,再加通配符。

[root@localhost yum.repos.d]# yum list installed zs*
Loaded plugins: fastestmirror, langpacks
Loading mirror speeds from cached hostfile
Installed Packages
zsh.x86_64                                      5.0.2-7.el7                                      @local
[root@localhost yum.repos.d]#

安装程序包
        install package1 [package2] [...]
        reinstall package1 [package2] [...]  (重新安装)

[root@localhost yum.repos.d]# yum reinstall zsh

升级程序包
        update [package1] [package2] [...]
        downgrade package1 [package2] [...] (降级)

我这里的yum源里没有可升级的包,但是有一个单独的rpm包。我们可以这样升级,yum会自动解决依赖关系,如果是被依赖,可能就失败了,没有尝试过。

[root@localhost ~]# yum update zsh-5.0.2-7.el7_1.2.x86_64.rpm
Updating:
 zsh           x86_64           5.0.2-7.el7_1.2            /zsh-5.0.2-7.el7_1.2.x86_64           5.6 M
[root@localhost ~]# rpm -q zsh
zsh-5.0.2-7.el7_1.2.x86_64

然后降级

[root@localhost ~]# rpm -q zsh
[root@localhost ~]# rpm -q zsh
zsh-5.0.2-7.el7.x86_64

yum升级需谨慎,注意要指明程序包,如果不指会全部升级的。

如果有多个版本可升级:

要升级到指定的版本,要加上版本号  yum update 版本号 package_name


检查可用升级
        check-update

[root@localhost Packages]# yum check-update zsh

卸载程序包
        remove | erase package1 [package2] [...]

[root@localhost Packages]# yum erase zsh

查看程序包information
        info [...]

[root@localhost Packages]# yum info zsh

与rpm -qi的意思差不多。


查看指定的特性(可以是某文件)是由哪个程序包所提供:
        provides | whatprovides feature1 [feature2] [...]

[root@localhost Packages]# yum provides /etc/fstab

查看/etc/fstab是由哪个程序包所生成的。差rpm -qf差不多。


清理本地缓存
        clean [ packages | metadata | expire-cache | rpmdb | plugins | all ]


 all:所有; packages:下载的rpm包;metadata:元数据,;expire-cache:过期缓存;
 rpmdb :rpm数据库;plugins :插件。

构建缓存
        makecache
也不用专门运行这个,yum repolist 的时候就自动缓存过了。

   

搜索
        search string1 [string2] [...]
以指定的关键字搜索程序包名及summary信息;

[root@localhost ~]# yum search zsh

    查看指定包所依赖的capabilities:
        deplist package1 [package2] [...]

查看yum事务历史
history [info|list|packages-list|packages-info|summary|addon-info|redo|undo|rollback|new|sync|stats]

每一次yum的安装删除,只要是修改类的操作,都会以一个事务记录下来。

[root@localhost ~]# yum history list

我们可以用上面这个来查看有多少事务。还可以用info来查看各个事务的信息。

[root@localhost ~]# yum history info 10


安装及升级本地程序包
        * localinstall rpmfile1 [rpmfile2] [...]
           (maintained for legacy reasons only - use install)
        * localupdate rpmfile1 [rpmfile2] [...]
           (maintained for legacy reasons only - use update)

在老的版本中,要用localinstall才能用yum安装本地的程序包,现在直接用install也一样。

所需要的依赖,会自动在yum源中解决。

[root@localhost ~]# yum install zsh-5.0.2-7.el7_1.2.x86_64.rpm

这是从本地安装的包文件,不是从源里面安装的。 而升级的那个,我们在上面升级部分用的就是。


包组管理的相关命令
        * groupinstall group1 [group2] [...]
        * groupupdate group1 [group2] [...]
        * grouplist [hidden] [groupwildcard] [...]
        * groupremove group1 [group2] [...]
        * groupinfo group1 [...]

直接安装包组,如开发组,解决开发环境,只不过安装的包可能多点。

[root@localhost ~]# yum group list
[root@localhost ~]# yum groupinstall "Development Tools"
[root@localhost ~]# yum groupremove "Development Tools"
[root@localhost ~]# yum groupinfo "Development Tools"

第一个,查看有哪些包组。第二安装包组,因为有空格,组名要用引号引起来。每四个查看一个组的信息,如组内有哪些包,哪些是必须要安装的,哪些是默认的,哪些是可选的。



谢谢浏览,没想到笔记东拼西凑这么多,大家看的也累了吧,如果发现问题可要提出来啊,大家一起讨论讨论。


你可能感兴趣的:(yum)