深入理解yum工作原理
来源:互联网 发布:知轩藏书被攻击 编辑:程序博客网 时间:2024/05/17 12:25
前言
在前面一篇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 createrepo2. 建立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.rpmrpm_test-0.0.2-3.noarch.rpmrpm_test2-0.0.2-3.noarch.rpm4. 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/i3863/3 - rpm_test-0.0.1-3.noarch.rpmSaving Primary metadataSaving file lists metadataSaving other metadata6. 配置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=firefoxbugbaseurl=http://42.120.7.71/centos/5/i386/enabled=1gpgcheck=0gpgkey=
查看本地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.sqlitesqlite> .tableconflicts db_info files obsoletes packages provides requiressqlite> 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||sha2|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||sha3|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||shasqlite> select * from requires;/bin/sh|||||1|TRUEpython|GE|0|2.4.3||1|FALSE/bin/sh|||||2|TRUEpython|GE|0|2.4.3||2|FALSE/bin/sh|||||3|TRUEpython|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的源码了
- 深入理解yum工作原理
- 深入理解yum工作原理
- 深入理解IIS工作原理
- 深入理解IIS工作原理
- Ajax工作原理深入理解
- 深入理解Mock工作原理
- Ajax工作原理深入理解
- 深入理解VLAN形成和工作原理
- 深入理解VLAN形成和工作原理
- 深入理解----ThreadLocal的工作原理
- 深入理解Tomcat系列之六:Servlet工作原理
- 深入SDRAM工作原理
- 深入git工作原理
- 转载--LVS之原理篇--深入全面理解LVS工作原理
- 深入理解Ajax原理
- 深入理解Ajax原理
- 深入理解Memcache原理
- 深入理解Memcache原理
- java的动态代理机制详解
- JavaScript压缩混淆
- POJ3261——Milk Patterns 后缀数组
- 微信小程序 车轮之 侧滑
- java九九乘法表
- 深入理解yum工作原理
- [leetCode刷题笔记]575. Distribute Candies
- windows下jenkins搭建
- 笔记2
- angularjs 1.6之后$http没有success,error方法
- 初识前端开发
- Windows命名管道
- 【译】理解Node事件驱动架构
- 设计模式之装饰模式