今天在使用本地源时,出现了以下错误:
首先检查下配置文件是否有问题:
<code> [root@localhost yum.repos.d]# cat local.repo [local] name=local baseurl=http://222.24.51.147/ftp/EPEL enabled=1 gpgcheck=0 cost=500 #定义开销,默认每个yum源的cost是1000,定义开销越低,优先级则越高 </code>
之前配置过好多次了,检查了下路径没有问题,再看看源的路径下有没有此文件,真的没有此文件,于是搜了下这个repomd.xml到底是什么东西。
网上说找不到repodata目录或文件导致错误的原因通常有三个:一是路径问题;二是没有生成repodate目录;三是*.repo配置文件冲突(这个需要特意注意)。
既然路径没有问题,也没有repodate目录,然后再看看repo配置文件有没有冲突。
显然没有冲突,于是继续寻找原因,终于发现问题所在了,从CentOS 5(或rhel5)以后,系统光盘或ISO文件里大都已帮我们生成了repodata目录(但不排除没有),这个就是yum源的Meta数据,而5.0以前的版本则没有,需要我们用createrepo生成,此命令会根据rpm包的依赖关系,生成对应的repodata目录(软件仓库),就此目录,很重要的一个目录,名字也是固定的,里面就是保存repomd.xml文件的。repodata作为软件的仓库,其目录下有四个必要文件:filelists.xml.[gz],other.xml.[gz],primary.xml.[gz]和repomd.xml(md 意思是 metadata),其中最主要的是repomd.xml文件。
yum配置文件中baseurl指向的就是repodata目录位置,每当添加新的源,用yum进行更新或安装软件时,都会先将repodata目录中的文下载下来,进行分析,便可知道软件包的详细信息和依赖关系,最后进行软件安装和更新。理解这一点非常重要,所以一个有效的baseurl的特征是:baseurl所指位置存在名repodata目录,此目录下又存在名为repomd.xml文件,理解了之后,然后制作自已的本地源了。
由于没有repodata目录,所以就要用createrepo来命令生成:
<code> [root@localhost yum.repos.d]# yum install createrepo -y #安装createrepo包 [root@sta ftp]# createrepo /usr/html/ftp/EPEL #创建repodata目录 Spawning worker 0 with 2440 pkgs Workers Finished Gathering worker results Saving Primary metadata Saving file lists metadata Saving other metadata Generating sqlite DBs Sqlite DBs complete </code>
[root@sta EPEL]# ls repodata/ #repomd.xml文件已创建 50e1094c18aea4fdf360b59e1f1a249a3069f30656d94ce90c81339627d5ad0d-other.xml.gz a8e469389d3a343ef56b02aecd50ff1e921f260828153c0b46f4fb91b9449cf5-filelists.xml.gz aa62664ba42760d45aba07deb13d6a2b030bf25af306b2b5d0b58b7a1ff347fa-primary.xml.gz d78e14c717d7e80d857e23f01af6a7aa0cd973e3e26e837211b8e5be14d0337c-filelists.sqlite.bz2 e700facca4d76a01d21967d6659c8fe0b621c27cc437b80ff5d267b9326ba1f4-primary.sqlite.bz2 f26c427e3a818fba3a0f5eaf4b2ce2424c6532a567dce0921111571648dabe61-other.sqlite.bz2 repomd.xml [root@localhost yum.repos.d]# yum repolist #重新加载下repolist Loaded plugins: fastestmirror, refresh-packagekit, security Loading mirror speeds from cached hostfile * base: mirrors.btte.net * extras: mirrors.nwsuaf.edu.cn * updates: ftp.sjtu.edu.cn local | 3.0 kB 00:00 local/primary_db | 104 MB 00:12 repo id repo name status base CentOS-6 - Base 6,575 centos-virt-xen CentOS-6 - xen 70 extras CentOS-6 - Extras 48 local local 239,911 ----->已加载到local updates CentOS-6 - Updates 954 repolist: 247,558
当然也有可能有创建失败的情况,为我网站的ftp创建repodata目录时,结果就创建失败了。
[root@localhost ftp]# createrepo /usr/html/ftp Spawning worker 0 with 14276 pkgs Spawning worker 1 with 14276 pkgs Spawning worker 2 with 14275 pkgs Spawning worker 3 with 14275 pkgs Worker 2: Error: Could not open local rpm file: /usr/html/ftp/rpm包_个人常用/nginx/rtmp/libxvidcore-devel-1.3.3-1.14.i586.rpm: RPM Error opening Package Workers Finished Failed to process 1 package(s).
<code> createrepo --update: </code>
有时候你的软件仓库中含有很多的软件包,虽然只是其中的一小部分有所改动但是你却不必为每个软件包重新产生元数据,这样做明显太浪费时间了。
这就是 –update 选项诞生的原因。你像之前一样运行 createrepo 命令但是添加了–update 选项.
例如:
<code> [root@localhost yum.repos.d]# createrepo --update /usr/html/ftp </code>
现在 createrepo 只更新那些在上次产生元数据之后被改变,添加或者删除 u 了的项目。