zoukankan      html  css  js  c++  java
  • 深入理解yum工作原理

    复制于 http://www.360doc.com/content/19/0529/15/64405542_838986706.shtml

    复制于 http://www.firefoxbug.com/index.php/archives/2777/

    YUM(Yellowdog Updater Modified):是一个基于RPM的软件包管理器,能够从指定服务器自动下载RPM包并且安装,可以处理软件之间的依赖关系,一次性安装所有依赖的软件包,无需一个个下载安装。

    原理

    yum 运行原理

    yum的工作需要两部分来合作,一部分是yum服务器,还有就是client的yum工具。下面分别介绍两部分工作原理。

    • yum服务器

      所有要发行的rpm包都放在yum服务器上以提供别人来下载,rpm包根据kernel的版本号,cpu的版本号分别编译发布。yum服务器只要提供简单的下载就可以了,ftp或者httpd的形式都可以。yum服务器有一个最重要的环节就是整理出每个rpm包的基本信息,包括rpm包对应的版本号,conf文件,binary信息,以及很关键的依赖信息。在yum服务器上提供了createrepo工具,用于把rpm包的基本概要信息做成一张"清单",这张"清单""就是描述每个rpm包的spec文件中信息。

    • yum client端

      client每次调用yum install或者search的时候,都会去解析/etc/yum.repos.d下面所有以.repo结尾的配置文件(即yum源),这些配置文件指定了yum服务器的地址。yum会定期去"更新"yum服务器上的rpm包"清单",然后把"清单"下载保存到yum自己的cache里面,根据/etc/yum.conf里配置(默认是在/var/cache/yum下面),每次调用yum装包的时候都会去这个cache目录下去找"清单",根据"清单"里的rpm包描述从而来确定安装包的名字,版本号,所需要的依赖包等,然后再去yum服务器下载rpm包安装。(前提是不存在rpm包的cache)

    etc/yum.repos.d下面所有以.repo结尾的配置文件为yum源,yum源相当与一个指向软件仓库的连接,通过yum安装软件,实际上是通过链接进入软件仓库获取到相应软件包再安装的。

    包括YUM服务器和客户端两个部分:
    YUM服务器
    YUM服务器
    Linux客户端
    Linux客户端
    流程
    YUM流程

    yum的设置文件

    配置文件所在目录:/etc/yum.repos.d

    # vim /etc/yum.repos.d/CentOS-Base.repo
    
    • 1

    base

    $releaserver:发行版本号

    $basearch:系统基础架构,如x86_64

    [base]:代表容器名称,名称可以随意取
    name:描述容器含义
    mirrorlist:列出这个容器可以使用的镜像站点,如果不想使用,可以注释
    baseurl:后面接容器地址,mirrorlist是由yum程序自行找镜像站点,baseurl则是指定一个固定容器地址
    gpgcheck:是否需要查阅RPM文件内数字证书
    gpgkey:数字证书公钥文件所在位置,使用默认值

    查看yum server所使用的容器:yum repolist all
    删除所有已下载的所有容器相关数据:yum clean all

    功能

    1 查询

    # yum search raid    //搜索某个软件名称或者描述的重要关键字
    # yum info mdadm     //列出软件功能
    # yum list			 //列出yum服务器上面所有的软件名称
    # yum list pam*		 //找出以pam开头的软件名称
    # yum list updates	 //列出yum服务器上可提供本机进行升级的软件
    
    • 1
    • 2
    • 3
    • 4
    • 5

    2 安装/升级

    # yum install/update 软件名称 
    # yum install 软件名称 -y 		//安装过程中免输入y确认
    
    • 1
    • 2

    3 删除

    # yum remove 软件名称
    
    • 1

    4 软件组功能

    # yum grouplist			 			//查看容器和本机上可用与安装过的软件组
    # yum groupinfo group_name     		//查看group内所有组名称
    # yum install/remove group_name		//安装与删除 
    
    • 1
    • 2
    • 3

    全系统升级

    yum -y update 升级所有包,改变软件设置和系统设置,系统版本内核都升级
    yum -y upgrade 升级所有包,不改变软件设置和系统设置,系统版本升级,内核不改变
    已经上线的用yum -y upgrade 比较稳
    全新的用yum -y update 会更好

    参考资料

    Linux软件安装:RPM、SRPM与YUM功能

    前言

    在前面一篇rpm包制作描述了rpm的打包过程,这篇文章主要讲述yum的工作原理。

    yum 运行原理

    yum的工作需要两部分来合作,一部分是yum服务器,还有就是client的yum工具。下面分别介绍两部分工作原理。

    • yum服务器

      所有要发行的rpm包都放在yum服务器上以提供别人来下载,rpm包根据kernel的版本号,cpu的版本号分别编译发布。yum服务器只要提供简单的下载就可以了,ftp或者httpd的形式都可以。yum服务器有一个最重要的环节就是整理出每个rpm包的基本信息,包括rpm包对应的版本号,conf文件,binary信息,以及很关键的依赖信息。在yum服务器上提供了createrepo工具,用于把rpm包的基本概要信息做成一张"清单",这张"清单""就是描述每个rpm包的spec文件中信息。

    • yum client端

      client每次调用yum install或者search的时候,都会去解析/etc/yum.repos.d下面所有以.repo结尾的配置文件,这些配置文件指定了yum服务器的地址。yum会定期去"更新"yum服务器上的rpm包"清单",然后把"清单"下载保存到yum自己的cache里面,根据/etc/yum.conf里配置(默认是在/var/cache/yum下面),每次调用yum装包的时候都会去这个cache目录下去找"清单",根据"清单"里的rpm包描述从而来确定安装包的名字,版本号,所需要的依赖包等,然后再去yum服务器下载rpm包安装。(前提是不存在rpm包的cache)

    搭建yum服务器

    1. 安装工具createrepo
    $ yum install createrepo
    
    2. 建立repo发布目录
    $ mkdir /var/www/yum/centos/5/{i386,x86_64}
    $ mkdir /var/www/yum/centos/6/{i386,x86_64}
    
    3. 用rpmbuild生成两个rpm包,比如说下面几个包,版本号不一样,包名字不一样
    rpm_test-0.0.1-3.noarch.rpm
    rpm_test-0.0.2-3.noarch.rpm
    rpm_test2-0.0.2-3.noarch.rpm
    
    4. copy rpm包到发布目录下
    $ cp rpm_test-0.0.* /var/www/yum/centos/5/i386/
    
    5. 用createrepo生成meta信息
    $ createrepo -o /var/www/yum/centos/5/i386/ /var/www/yum/centos/5/i386
    3/3 - rpm_test-0.0.1-3.noarch.rpm
    Saving Primary metadata
    Saving file lists metadata
    Saving other metadata
    
    6. 配置apache或者nginx到发布目录
    

    在createrepo之后会在/var/www/yum/centos/5/i386/生成下面的目录和文件

    $ tree repodata/
    repodata/
    |-- filelists.xml.gz
    |-- other.xml.gz
    |-- primary.xml.gz
    `-- repomd.xml
    
    $ gunzip filelists.xml.gz
    $ gunzip primary.xml.gz
    

    filelists.xml里面记录了所有rpm包列表,版本号,配置文件等

    <package pkgid="19c82aa653a394ee1f7dbc7b694fbf0221bc1848" name="rpm_test" arch="noarch"><version epoch="0" ver="0.0.1" rel="3"/><file>/usr/local/rpm_test/conf/test.conf</file><file>/usr/local/rpm_test/test.py</file><file type="dir">/usr/local/rpm_test/conf</file></package> ...

    primary.xml里面记录描述了rpm包的依赖等信息

    配置客户端

    $ vim /etc/yum.repos.d/firefoxbug.repo
    
    [firefoxbug]
    name=firefoxbug
    baseurl=http://42.120.7.71/centos/5/i386/
    enabled=1
    gpgcheck=0
    gpgkey=
    
    

    查看本地yum cache

    默认是在/var/cache/yum下这里记录着每个repo对应的cache

    /var/cache/yum/
    |-- base
    |   |-- cachecookie
    |   |-- mirrorlist.txt
    |   |-- packages
    |   |-- primary.xml.gz
    |   |-- primary.xml.gz.sqlite
    |   `-- repomd.xml
    |-- epel
    |   |-- 76c4dcbfaf075e55d5876839eb11c4f33b3a2495-primary.sqlite
    |   |-- cachecookie
    |   |-- mirrorlist.txt
    |   |-- packages
    |   `-- repomd.xml
    |-- firefoxbug
    |   |-- cachecookie
    |   |-- packages
    |   |-- primary.xml.gz
    |   |-- primary.xml.gz.sqlite
    |   `-- repomd.xml
    |-- timedhosts.txt
    |-- updates
    |   |-- cachecookie
    |   |-- mirrorlist.txt
    |   |-- packages
    |   |-- primary.sqlite
    |   `-- repomd.xml
    
    • 查看firefoxbug这个repo,primary.xml.gz就是yum服务器上的"清单",但是这里以sqlite方式存储了,可以查看sqlite的db
    $ sqlite3 primary.xml.gz.sqlite
    sqlite> .table
    conflicts  db_info    files      obsoletes  packages   provides   requires
    sqlite> select * from packages;
    1|896712eb4b4af2d61745dd30e0a6f6513043fd69|rpm_test|noarch|0.0.2|0|3|rpm_test|rpm_test by Wanghua||1406360629|1406360561|Commercial||tools|firefoxbug|rpm_test-0.0.2-3.src.rpm|280|2402||2734|268|816|rpm_test-0.0.2-3.noarch.rpm||sha
    2|3ad546bd3ce28b0a82a1387f438f456349e20c78|rpm_test2|noarch|0.0.2|0|3|rpm_test|rpm_test by Wanghua||1406363739|1406363674|Commercial||tools|firefoxbug|rpm_test2-0.0.2-3.src.rpm|280|2406||2738|268|816|rpm_test2-0.0.2-3.noarch.rpm||sha
    3|19c82aa653a394ee1f7dbc7b694fbf0221bc1848|rpm_test|noarch|0.0.1|0|3|rpm_test|rpm_test by Wanghua||1406360629|1406356964|Commercial||tools|firefoxbug|rpm_test-0.0.1-3.src.rpm|280|2402||2733|268|816|rpm_test-0.0.1-3.noarch.rpm||sha
    sqlite> select * from requires;
    /bin/sh|||||1|TRUE
    python|GE|0|2.4.3||1|FALSE
    /bin/sh|||||2|TRUE
    python|GE|0|2.4.3||2|FALSE
    /bin/sh|||||3|TRUE
    python|GE|0|2.4.3||3|FALSE
    
    • 每次yum装包或者卸载的时候都会来查询这个sqlite的DB,然后做出相应的操作。
    • 清除本地yum cache

    调用sudo yum clean会把这份"清单""全都清除,下次调用yum install等操作又会重新生成。

    $ sudo yum clean
    
    /var/cache/yum/
    |-- base
    |   |-- packages
    |-- epel
    |   |-- packages
    |-- firefoxbug
    |   |-- packages
    |-- updates
    |   |-- packages
    
    • timedhosts.txt这个文件记录着所有源地址访问所需要的时间,可以查到哪些源的地址比较慢
    • 如果/etc/yum.conf中keepcache选项是1,那么下载的rpm包都会保存到/var/cache/yum/xxx/package下
    • yum install package的时候怎么确定package已经安装了呢?这部分确定不是在/var/cache/yum中得到的,而是在/var/lib/rpm/下面得到。因为装包的时候会要用root去写这个文件夹下面的db。具体这块的内容就得看rpm的源码了
  • 相关阅读:
    游戏开发之路小结(二):关于第一人称射击游戏开发实战小结
    游戏开发之路小结(一):关于太空射击游戏开发实战小结
    游戏开发要涉及的几个方面
    短短几行代码实现让摄像机跟随着物体效果
    关于移动设备几种屏幕输入方式的小结
    软件的体系架构摘要
    jQuery入门笔记之(一)选择器引擎-【转】
    ASCII码对照表
    将数字转出大写如:100转换后结果为一佰
    google搜索技巧总结
  • 原文地址:https://www.cnblogs.com/gaoBlog/p/10944138.html
Copyright © 2011-2022 走看看