yum本地源 baseurl repodata repomd.xml comps.xml

(一)相关讲解
repodata作为软件的仓库,其目录下有四个必要文件:filelists.xml.[gz],other.xml.[gz],primary.xml.[gz]和repomd.xml(md 意思是 metadata),其中最主要的是repomd.xml文件,原因是我们用光盘或ISO文件制作本地源时常看到下面类似的错误:
 
 * c5-media:
file:///media/CentOS/repodata/repomd.xml: [Errno 5] OSError: [Errno 2] 没有那个文件或目录: '/media/CentOS/repodata/repomd.xml'

Trying other mirror.
file:///media/cdrecorder/
repodata/repomd.xml: [Errno 5] OSError: [Errno 2] 没有那个文件或目录: '/media/cdrecorder/repodata/repomd.xml'
Trying other mirror.
file:///media/cdrom/
repodata/repomd.xml: [Errno 5] OSError: [Errno 2] 没有那个文件或目录: '/media/cdrom/repodata/repomd.xml'
Trying other mirror.
Error: Cannot retrieve repository metadata (repomd.xml) for repository: c5-media. Please verify its path and try again
 
以上的错误提是说找不到repodata目录或文件,而错误的原因通常有三个:一是路径问题;二是没有生成repodate目录;三是*.repo配置文件冲突(这个需要特意注意)。
从CentOS 5(或rhel5)以后,系统光盘或ISO文件里大都已帮我们生成了repodata目录(但不排除没有),而5.0以前的版本则没有,需要我们用createrepo生成,此命令会根据rpm包的依赖关系,生成对应的repodata目录(软件仓库),就此目录,很重要的一个目录,名字也是固定的,里面就是保存有这四个文件:filelists.xml.[gz],other.xml.[gz],primary.xml.[gz]和repomd.xml.[gz](通常还会有comps.xml文件,下面会提到)。对于以上的错误例子,从c5-media可知系统是5.0以上的,系统光盘是自带有repodata目录,所以很明显是路径或*.repo文件的问题,但不排除没有repodata目录这种情况,具体有没有,打开光盘看下就知道了呗,如果确实没有,那就就生成了呗,下面会说到。
现在来看下/etc/yum.repos.d/CentOS-Media.repo配置文件的内容:
[c5-media]
name=CentOS-$releasever – Media
#name 就是 name了,其格式代表了“操作系统名和释出版本”- “base”是表明此段寻找的是base包信息。
baseurl=file:///media/CentOS/
file:///media/cdrom/
file:///media/cdrecorder/
#“baseurl”代表yum在互联网上所查找的链接地址。这里需要解释一下
#“$basearch”代表了系统的构架格式如“i386”和“repodata”存放repomd.xml文件的文件夹位置。
#“repomd.xml”作用,提供了“更新.xml.gz”的下载信息和SHA校验值。
#这里“repomd.xml”里包括了3个文件 “other.xml.gz””filelists.xml.gz””primary.xml.gz”
#作用很明显了,“其他更新包列表”“更新文件集中列表”“主要更新包列表”
gpgcheck=1
#gpgcheck 校验,你需要在配置文件里注明GPG-RPM-KEY的位置。
enabled=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-beta
#GPG-RPM-KEY的位置
 
从baseurl指定查找位置和出错消息:
可看出,yum会试图从baseurl指定的目录下查找repodata目录,其实质是想寻找repomd.xml文件,既然repodata目录都找不着,何来repomd.xml文件呢?所以就报错,显示“找不到目录和文件”,解决办法很简单,对于5.0以上的版本,光盘或ISO文件的根目录下就有repodate目录了,如下图所示
 所以将光盘的挂载路径设置正确就可以,注意:如果是系统自动挂载光盘,那通常会自动挂载在/media目录下,那路径当然就不正确了。同时你也可以将CentOS目录整个复制出来,用creatarepo生生软件仓库即可。
针对/etc/yum.repos.d/CentOS-Media.repo的内容,可将光盘挂在下面任一目录下
mkdir –v /media/{CentOS, cdrom, cdrecorder}
mount –t iso9660 /dev/cdrom /media/CentOS
mount –t iso9660 /dev/cdrom /media/ cdrom
mount –t iso9660 /dev/cdrom /media/ cdrecorder (随便选一项就行,不要全挂)
这样yum就能搜索到repodata目录了,上图中CentOS目录保存的是rpm文件包,repodata目录里的文件就是记录CentOS里所有包的依赖关系,文件位置等相关信息。如果觉得baseurl指定的位置不爽,也可以改为其地方,只要在baseurl指定的目录下对能找到repodata目录即可。同时,生成repodata目录后,只要装rpm包的目录位置不变(如上例中的CentOS目录),repodata就可以放到任何地方。对于指定其它协议的baseurl,如http:// ftp://,其实质也是在baseurl指定的位置查找repodata目录,例如:
Baseurl=http://centos.ustc.edu.cn/centos/5/os/i386/
其目录下就有repodata目录;
Baseurl=http://livna-dl.reloumirrors.net/fedora/4/i386/目录下也有:
以上两个repodata目录,一个放在“装rpm包目录”同等级的目录中,而令一个则放在装rpm包的同目录中,这说明可在放任意位置生成repodata,baseurl指向的就是repodata目录位置,而每当添加新的源,用yum进行更新或安装软件时,都会先将repodata目录中的文下载下来,进行分析,便可知道软件包的详细信息和依赖关系,最后进行软件安装和更新。理解这一点非常重要,所以本人特意多次指出,“一个有效的baseurl的特征是:baseurl所指位置存在名repodata目录,此目录下又存在名为repomd.xml文件”理解了之后,便可以随心所欲,自行下载软件包,然后制作自已的本地源了,对于yum localinstall 命令,据说能自行解决包的依赖问题,但其实质是用了现有软件仓库来解决包依赖关系,所以没有仓库,用此命令也没用。
      对于没有5.0之前版本,由于没有repodata目录,所以虽要要用createrepo来命令生成,以下是CentOS 4.4 的ISO文件目录树:
注意此处的CentOS目录装的不是纯rpm文件了,而是包含两个子目录base和RPMS,所有的rpm包装在RPMS目录里,而base装的是什么东西呢?如下图所示:
这些文件同样也保存了RPMS中所有rpm包的依赖关系等重要信息,但它们主要在操作系统安装系时用到,如果用户想定制自已的操作系统安装盘,或者发行版本,就需要生成这些文件,详情可参考http://www.ibm.com/developerworks/cn/linux/l-custm/index.html
注意红色插头所指文件,此文文件主要记录分组情况,建立yum仓库时,需要先重建该文件,但也可以不用,它由三部分组成:组列表,组层次结构,RPM包。个人理解,此文件用于对rpm包按功能类型进行分组,设置组中默认安装的软件和解决依赖关系,例如在安装操作系统的过程中,当选择定制(custom)安装时,就会看到如下图所示的软件包组,这就是由此文件所实现,yum group* 等相关命令会从”group”xml元数据中读取数据,命令createrepo -g /path/to/mygroups.xml /srv/my/repo的作用就是在创建软件仓库时,将组文件mygroups.xml包含进软件仓库
 
       假如路径设置对了,repodata目录也有了,但还是不行,此时的出错消息不再是上面所示那样,那很可能是/etc/yum.repos.d/中配置文件问题或者因为你没有连网,在实践过程中,俺在没有连网的情况下,yum时会报错,因为它只是尝试下载网络上的/repodata/repomd.xml文件,没连网,何来文件呢?所以报错,此时它也没有去查找本地的其它源了,解决办法是:
一是连网,二是让/etc/yum.repos.d/目录中只剩下本地源的配置文件,三是用命令
yum --disablerepo=*  --enablerepo={本地源ID,如 c5-media} install  {soft_names} –nogpgcheck
也许在本地搭建ftp或http源,问题应该能解决的,但没有具体实践过,所以没有发言权。
 
      最后介绍一下用得上的命令和选项:
1.      createrepo --update:
有时候你的软件仓库中含有很多的软件包,虽然只是其中的一小部分有所改动但是你却不必为每个软件包重新产生元数据,这样做明显太浪费时间了。
这就是 re --update 选项诞生的原因。你像之前一样运行 createrepo 命令但是添加了--update 选项.
例如:
createrepo --update /srv/my/repo
现在 createrepo 只更新那些在上次产生元数据之后被改变,添加或者删除 u 了的项目。
 
2.verifytree 
如果你刚刚做了一个 repo 并且你想要验证在你的 repo 中的所有东西都是正确且可以完成其功能的话,你可以运行 erifytree 命令来检查所有的 repodata 和软件包。
示例:
$ verifytree /home/skvidal/tmp/empty-repoverifytree /home/skvidal/tmp/empty-repo/
Checking repodata:
verifying repomd.xml with yum
verifying filelists checksum
verifying primary checksum
verifying primary_db checksum
verifying other_db checksum
verifying other checksum
verifying filelists_db checksum
Checking groups (comps.xml):
verifying comps.xml with yum

comps file missing or unparseable


(二)举例
接下来以具体例子来说明如何制作本地源,以下例子都修改自网上资料,忘了记录出处,敬请原谅。
1) 先以rhel-5-server-i386-dvd.iso为例,制作之前先来看下rhel5映像文件的目录结构,
 
主要有Cluster,ClusterStorage,Server和VT目录,目录里头除了含用rpm包文件外,还分别含有一个repodata目录,这相当于对包进行了分组管理,所以在写baseurl路径时,都要将它们的路径分写上,不过,平时用的软件包都在Server目录中,其它目录中的软件包很少用到。注意:repodata目录中,除了含有那四个基本文件外,还将相应的comps.xml组文件加了进去。
下面是具体的设置过程:
1. 设置 iso 文件的自动挂载并安装 createrepo
mkdir /media/rhel
mount -o loop rhel-5-server-i386-dvd.iso /media/rhel
#如果是光盘,则mount –t iso9660 /dev/cdrom /media/rhel
vi /etc/fstab
/dev/cdrom /media/rhel iso9660 ro 0 0 #可设为开机自动挂载,看你需要啦!
mount –a #重新挂载所有
rpm -ivh /media/rhel/Server/createrepo-0.4.11-3.el5.noarch.rpm #repodata生成工具这个肯定要装

2. 配置 repo
cd /etc/ yum .repos.d
mv rhel-debuginfo.repo rhel-debuginfo.repo~
vi rhel-media.repo
1.         [Cluster]
2.         name=Red Hat Enterprise Linux $releasever - $basearch - Cluster
3.         baseurl=file:///media/rhel/Cluster  # Cluster目录下存在repodata目录enabled=1
4.          gpgcheck=1   ##1为激活gpg检测,0为否
5.         gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release
6.          ##对应的rpm包的验证文件,若设置gpgcheck=0,则可以不用这一项
7.         [ClusterStorage]
8.         name=Red Hat Enterprise Linux $releasever - $basearch - ClusterStorage
9.          baseurl=file:///media/rhel/ClusterStorage #同上
10.     enabled=1
11.     gpgcheck=1
12.     gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release
13.      
14.     [Server]
15.     name=Red Hat Enterprise Linux $releasever - $basearch - Server
16.     baseurl=file:///media/rhel/Server
17.     enabled=1
18.     gpgcheck=1
19.     gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release
20.      
21.     [VT]
22.     name=Red Hat Enterprise Linux $releasever - $basearch - VT
23.     baseurl=file:///media/rhel/VT
24.     enabled=1
25.     gpgcheck=1
26.     gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release
3. 创建所需目录设置到这里个人认为可以完成了,但具体没有实践过
mkdir -p /var/rhel/{Cluster,ClusterStorage,Server,VT}

4. createrepo:
生成repodata软件信息仓库
createrepo -o /var/rhel/Cluster -g /media/rhel/Cluster/repodata/comps-rhel5- cluster.xml /media/rhel/Cluster   # -o选项为设置repodata目录的输出位置,没有的话就在当前目录中输出;-g选项指定查找组文件的位置;最后的路径表示rpm包目录的位置,并且只要在所查找的路径下含有此目录即可,程序会自动向下查找的了。
createrepo -o /var/rhel/ClusterStorage -g/media/rhel/ClusterStorage/repodata/comps-rhel5-cluster-st.xml/media/rhel/ClusterStorage
createrepo -o /var/rhel/Server -g /media/rhel/Server/repodata/comps-rhel5-server-core.xml /media/rhel/Server
createrepo -o /var/rhel/VT -g /media/rhel/VT/repodata/comps-rhel5-vt.xml /media/rhel/VT

5. 避免无谓的“下载”

mount --bind /var/rhel/Cluster/repodata /media/rhel/Cluster/repodata
mount --bind /var/rhel/ClusterStorage/repodata /media/rhel/ClusterStorage/repodata
mount --bind /var/rhel/Server/repodata /media/rhel/Server/repodata
mount --bind /var/rhel/VT/repodata /media/rhel/VT/repodata
#可加入 /etc/rc.local 开机自动绑定。
#命令mount –-bind olddir newdir
—bind选项的作用是,让普通目录像设备一样挂到任一目录上,所以上述命令的作用是将olddir目录挂载到newdir目录,或者可以看成是olddir目录映射到newdir目录,对目录增删文件,实质都是在 newdir目录中进行。若想将挂载项写到fstab中,但如果开启了SElinux,开机不会挂载成功,但可用mount –a挂载。对于示例中所说“避免无谓的’下载’”,我也搞不清所谓的“下载是什么意思”,据我了解每当用yum安装软件时,都会将repodata目录中的内容下载下来,保存在一个缓存中,其路径为/var/cache/yum/[源名称目录]/,而示例所示路径与系统默认路径不同,如有谁知道这个“下载”是指啥意思?记得告诉我。也许这里的目的纯粹是为了将新建的repodata仓库用上罢了,因为如果直接用光盘repodata目录下的文件,可以会出错,导至不成功,重新生成repodata是最好最保险最好的做法。
6. 清除缓存
yum clean all


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值