(一)相关讲解
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 �C 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
指定查找位置和出错消息:
file:///media/CentOS/repodata/repomd.xml
file:///media/cdrom/repodata/repomd.xml
file:///media/cdrecorder/repodata/repomd.xml
可看出,
yum
会试图从
baseurl
指定的目录下查找
repodata
目录,其实质是想寻找
repomd.xml
文件,既然
repodata
目录都找不着,何来
repomd.xml
文件呢?所以就报错,显示“找不到目录和文件”,解决办法很简单,对于
5.0
以上的版本,光盘或
ISO
文件的根目录下就有
repodate
目录了,如下图所示
所以将光盘的挂载路径设置正确就可以,注意:如果是系统自动挂载光盘,那通常会自动挂载在
/media
目录下,那路径当然就不正确了。同时你也可以将
CentOS
目录整个复制出来,用
creatarepo
生生软件仓库即可。
针对
/etc/yum.repos.d/CentOS-Media.repo
的内容,可将
光盘挂在下面任一目录下
mkdir �Cv /media/{CentOS, cdrom, cdrecorder}
mount �Ct iso9660 /dev/cdrom /media/CentOS
mount �Ct iso9660 /dev/cdrom /media/
cdrom
mount �Ct 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} �Cnogpgcheck
也许在本地搭建
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