您的位置:首页 > 运维架构 > Linux

配置本地Yum源

2016-01-11 22:59 411 查看
CentOS配置本地Yum源

发表于 7 December 2015 | 分类于 运维 | 暂无评论

现场环境没有网络,有些软件安装简直太痛苦,和maven的依赖链一样,最终耗时耗力不一定能安装好,此时制作本地yum只读光盘就是一个好主意,此文主要介绍如何配置本地yum。

建立本地源目录

mkdir /mnt/cdrom

挂载CentOS光盘

mount /dev/cdrom /mnt/cdrom

备份repo

进入/etc/yum.repos.d目录,可以看到四个文件分别为CentOS-Base.repo、 CentOS-Media.repo 、CentOS-Vault.repo、CentOS-Vault.repo.repo,将其中三个改名或者移走留下CentOS-Media.repo

1

2

3

4

5

cd /etc/yum.repos.d

mv CentOS-Base.repo CentOS-Base.repo.bak

mv CentOS-Vault.repo CentOS-Vault.repo.bak

mv CentOS-Vault.repo CentOS-Vault.repo.bak

cp CentOS-Media.repo CentOS-Vault.Media.bak

编辑CentOS-Media.repo

编辑CentOS-Media.repo:vi CentOS-Media.repo

将以下内容

1

2

3

4

5

6

7

8

[c6-media]

name=CentOS-$releasever - Media

baseurl=file:///media/CentOS/

file:///media/cdrom/

file:///media/cdrecorder/

gpgcheck=1

enabled=0

gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6

修改为

1

2

3

4

5

6

7

8

[c6-media]

name=CentOS-$releasever - Media

baseurl=file:///mnt/cdrom/ #这里为本地源路径

file:///media/cdrom/

file:///media/cdrecorder/

gpgcheck=1

enabled=1 ##开启本地源

gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6

修改好保存并退出

清yum缓存

yum clean

备注

如需要将yum源改为网络,还原/etc/yum.repos.d目录下的四个文件即可!

CentOS 7 创建本地YUM源

时间:2014-12-25 02:32来源:乌托邦2号 作者:乌托邦2号 举报 点击:7034次

本文中的“本地YUM源”包括三种类型:一是直接使用CentOS光盘作为本地yum源,优点是简单便捷,缺点是光盘软件包可能不完整(centos 7 Everything 总共才6.57G);二是同步CentOS官方源到本地(相当于创建了一个公共镜像),优点是最靠谱,缺点是占空间费流量;三是创建完全自定义的本地源,优点是灵活性最大,缺点是只是作为其他源的补充。

一、使用CentOS光盘作为本地yum源

(1) 实体机上直接放入光盘

(2) VMware Workstation 虚拟机:虚拟机-->可移动设备-->CD/DVD-->连接

[html] view plaincopy在CODE上查看代码片派生到我的代码片

mkdir /mnt/cdrom #创建目录

mount /dev/cdrom /mnt/cdrom #挂载

umount /mnt/cdrom #卸载

若不想每次都要放光盘,那就复制光盘文件到本地硬盘吧

[html] view plaincopy在CODE上查看代码片派生到我的代码片

cp -avf /mnt/cdrom /yum # -a:该选项保留链接、文件属性,并递归地复制目录

2、创建repo文件

[html] view plaincopy在CODE上查看代码片派生到我的代码片

cat >>/etc/yum.repos.d/CentOS-Local.repo<<-EOF

[Local]

name=Local Yum

baseurl=file:///yum/

gpgcheck=1

gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

enabled=1

问:为什么连createrepo软件都不用安装?

createrepo 的作用是创建索引文件的(位于repodata文件夹),光盘中连GPG-KEY都有了。

二、如何为CentOS创建公共镜像

详细说明见官方中文文档:
http://wiki.centos.org/zh/HowTos/CreatePublicMirrors
提供一个SHELL脚本,然后cron自动运行~~
http://wangyan.org/blog/centos-local-yum-repo.html
脚本稍作修改,换成中科大的镜像源。可用镜像列表见:http://www.centos.org/download/mirrors/

[html] view plaincopy在CODE上查看代码片派生到我的代码片

localpath="/mirrors/CentOS"

mirror="mirrors.hustunique.com::centos"

rsync="rsync -avzH --delete"

verlist="7"

baselist="centosplus extras fasttrack os updates"

archlist="x86_64"

for ver in $verlist

do

for base in $baselist

do

for arch in $archlist

do

remote=$mirror/$ver/$base/$arch/

mkdir -pv $localpath/$ver/$base/$arch/

$rsync $remote $localpath/$ver/$base/$arch/

done

done

done

三、创建完全自定义的本地源

把平时收藏的一些RPM软件包放在一个目录里,就变成一个自定义源了,可以用YUM来管理,灵活性相当大。

官方教程:How to setup your own package repository

1、创建本地yum仓库

[html] view plaincopy在CODE上查看代码片派生到我的代码片

mkdir -p /yum/local #可以有N级目录

cp ... #复制RPM包到上述目录

2、创建repo文件

[html] view plaincopy在CODE上查看代码片派生到我的代码片

cat >>/etc/yum.repos.d/CentOS-Local.repo<<-EOF

[Local]

name=Local Yum

baseurl=file:///yum/

gpgcheck=1

gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

enabled=1

3、安装createrepo

[html] view plaincopy在CODE上查看代码片派生到我的代码片

yum install createrepo #使用yum安装createrepo

rpm -ivh http://mirror.centos.org/centos/7/os/x86_64/Packages/createrepo-0.9.9-23.el7.noarch.rpm
4、创建索引

[html] view plaincopy在CODE上查看代码片派生到我的代码片

createrepo /yum

yum makecache #更新缓存

四、添加yum源

[html] view plaincopy

[1] Add RPMforge Repository for yum because that has many useful packages.

[root@dlp ~]#

wget http://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.3-1.el6.rf.x86_64.rpm
[root@dlp ~]#

rpm -Uvh rpmforge-release-0.5.3-1.el6.rf.x86_64.rpm

Preparing… ###################################### [100%] 1:rpmforge-release ###################################### [100%]

[root@dlp ~]#

sed -i -e "s/enabled = 1/enabled = 0/g" /etc/yum.repos.d/rpmforge.repo

[2] Add repository EPEL that is provided from Fedora project.

[root@dlp ~]#

wget http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
[root@dlp ~]#

rpm -Uvh epel-release-6-8.noarch.rpm

Preparing… ###################################### [100%] 1:epel-release ###################################### [100%]

[root@dlp ~]#

sed -i -e "s/enabled=1/enabled=0/g" /etc/yum.repos.d/epel.repo

五、参考
http://m.oschina.net/blog/88071 http://jingyan.baidu.com/article/e9fb46e1aed8207521f7662c.html http://blog.chinaunix.net/uid-28283843-id-3930474.html http://www.ibm.com/developerworks/cn/linux/l-lpic1-v3-102-5/
六、其他补充

1.使用YUM查找软件包

命令:yum search

2.列出所有可安装的软件包

命令:yum list

3.列出所有可更新的软件包

命令:yum list updates

4.列出所有已安装的软件包

命令:yum list installed

5.列出所有已安装但不在 Yum Repository 內的软件包

命令:yum list extras

6.列出所指定的软件包

命令:yum list 7.使用YUM获取软件包信息

命令:yum info 8.列出所有软件包的信息

命令:yum info

9.列出所有可更新的软件包信息

命令:yum info updates

10.列出所有已安裝的软件包信息

命令:yum info installed

11.列出所有已安裝但不在 Yum Reposito
4000
ry 內的软件包信息

命令:yum info extras

12.列出软件包提供哪些文件

命令:yum provides

5.清除YUM缓存

yum 会把下载的软件包和header存储在cache中,而不会自动删除。如果我们觉得它们占用了磁盘空间,可以使用yum clean指令进行清除,更精确的用法是yum clean headers清除header,yum clean packages清除下载的rpm包,yum clean all 清除所有

1.清除缓存目录(/var/cache/yum)下的软件包

命令:yum clean packages

2.清除缓存目录(/var/cache/yum)下的 headers

命令:yum clean headers

3.清除缓存目录(/var/cache/yum)下旧的 headers

命令:yum clean oldheaders

4.清除缓存目录(/var/cache/yum)下的软件包及旧的headers

命令:yum clean, yum clean all (= yum clean packages; yum clean oldheaders)

(一)相关讲解

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指定查找位置和出错消息:

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目录了,如下所示

CentOS/

images/

isoLinux/

repodata/

.discinfo

.treeinfo

所以将光盘的挂载路径设置正确就可以,注意:如果是系统自动挂载光盘,那通常会自动挂载在/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/

RELEASE-NOTES-ro

RELEASE-NOTES-ro.html

RPM-GPG-KEY-CentOS-5

RPM-GPG-KEY-beta

images/

isolinux/

repodata/

其目录下就有repodata目录;

Name

Parent Directory/

RPMS.lvn/

SRPMS.lvn/

SRPMS.lvn-testing/

debug/

repodata/

SDL_sound-1.0.1-0.lvn.1.4.i386.rpm

SDL_sound-devel-1.0.1-0.lvn.1.4.i386.rpm

a52dec-0.7.4-0.lvn.7.4.i386.rpm

a52dec-devel-0.7.4-0.lvn.7.4.i386.rpm

以上两个repodata目录,一个放在“装rpm包目录”同等级的目录中,而令一个则放在装rpm包的同目录中,这说明可在放任意位置生成repodata,baseurl指向的就是repodata目录位置,而每当添加新的源,用yum进行更新或安装软件时,都会先将repodata目录中的文下载下来,进行分析,便可知道软件包的详细信息和依赖关系,最后进行软件安装和更新。理解这一点非常重要,所以本人特意多次指出,“一个有效的baseurl的特征是:baseurl所指位置存在名repodata目录,此目录下又存在名为repomd.xml文件”理解了之后,便可以随心所欲,自行下载软件包,然后制作自已的本地源了,对于yum
localinstall 命令,据说能自行解决包的依赖问题,但其实质是用了现有软件仓库来解决包依赖关系,所以没有仓库,用此命令也没用。

..

CentOS/

images/

isolinux/

NOTES/

SRPMS/

.discinfo

centosdocs-man.css

GPL

RELEASE-NOTES-en

RELEASE-NOTES-en.html

RPM-GPG-KEY

RPM-GPG-KEY-centos4

RPM-GPG-KEY-CentOS-4

yumgroups.xml

注意此处的CentOS目录装的不是纯rpm文件了,而是包含两个子目录base和RPMS,所有的rpm包装在RPMS目录里,而base装的是什么东西呢?如下图所示:

..

comps.rpm

comps.xml

hdlist

hdlist4

hdstg2.img

netstg2.img

product.img

stage2.img

这些文件同样也保存了RPMS中所有rpm包的依赖关系等重要信息,但它们主要在操作系统安装系时用到,如果用户想定制自已的操作系统安装盘,或者发行版本,就需要生成这些文件,详情可参考http://www.ibm.com/developerworks/cn/linux/l-custm/index.html

假如路径设置对了,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/

images/

isolinux/

Server/

VT/

.discinfo

.treeinfo

主要有Cluster,ClusterStorage,Server和VT目录,目录里头除了含用rpm包文件外,还分别含有一个repodata目录,这相当于对包进行了分组管理,所以在写baseurl路径时,都要将它们的路径分写上,不过,平时用的软件包都在Server目录中,其它目录中的软件包很少用到。注意:repodata目录中,除了含有那四个基本文件外,还将相应的comps.xml组文件加了进去。

2)制作本地源,用createrepo生成repodata目录,以光驱为源

为了避免从网络下载软件包可能发生的软件包不完整、下载速度慢、网络故障等问题,我们强烈建议您使用本地的 DVD/CD iso 来创建 yum 仓库,这样在安装的时候速度快,而且可以保证所有软件包都能顺利安装。

如果您有局域网内的 yum 仓库,可以直接使用它,就不需要按照以下的步骤重复创建了。

下面的操作都是在您安装好 RHEL/CentOS 系统后进行的。

1.先从光盘或已有的 YUM 仓库安装 createrepo 工具:

Shell 命令:

# rpm -ivh createrepo-x.y.z.rpm

createrepo 命令用于生成 yum 仓库所必须的一些信息,这些信息都存放在 repodata/ 目录底下,您打开看看就会明白它做了些什么事情。

2.使用 ISO 文件制作 yum 仓库

2.1 DVD ISO

2.1.1如果你使用的是 DVD 光盘,可以直接挂载光盘,然后制作 yum 仓库:

Shell 命令:

# mkdir /mnt/dvd/

# mount /dev/cdrom /mnt/dvd/

# cd /mnt

# createrepo .

2.1.2如果您使用的是官方的 DVD ISO,则需要将它复制到系统上,挂载后制作 yum 仓库:

Shell 命令:

# mkdir /mnt/dvd/

# mount -o loop /root/rhel5.1-dvd.iso /mnt/dvd

# cd /mnt

# createrepo .

2.2 CD ISO

2.2.1如果您使用的是多个 CD iso 文件,需要先复制到系统上,挂载后制作 yum 仓库。

有几个 ISO 就创建几个目录,并将对应的 ISO 挂载上去:

Shell 命令:

# mkdir -p /mnt/{1,2,3,4,5,6}

# mount -o loop rhel5.1-disc1.iso /mnt/1

# mount -o loop rhel5.1-disc2.iso /mnt/2

# mount -o loop rhel5.1-disc3.iso /mnt/3

# mount -o loop rhel5.1-disc4.iso /mnt/4

# mount -o loop rhel5.1-disc5.iso /mnt/5

创建 yum 仓库:

Shell 命令:

# cd /mnt/

# createrepo .

3.定义 yum 仓库

创建 yum 仓库的定义文件:/etc/yum.repos.d/dvdiso.repo,然后加入以下内容:

Shell 命令:

[DVDISO]

name=DVD ISO

baseurl=file:///mnt/

enabled=1

gpgcheck=0

4.测试 yum 仓库

强烈建议执行 ‘yum clean all’ 命令,将所有 yum metadata 等信息清空,再重新获取最新的仓库信息:

Shell 命令:

# yum clean all

# yum list

如果在 ‘yum list’ 命令的输出中能够看到刚才制作的仓库里的软件包的名字,那就是 OK 了。再试着安装一个软件包看是否成功:

Shell 命令:

# yum install cyrus-sasl.i386

如果是 x86_64 平台,则将后面的 i386 改为 x86_64:

Shell 命令:

# yum install cyrus-sasl.x86_64

如果安装成功,表示 yum 仓库和 RPM 包都没问题。

3)ftp搭建yum服务器

一、准备工作

  1,启动REDHAT Linux ,并放入安装光盘

  2,挂载光驱 mount /dev/cdrom /mnt

  3,安装FTP服务.如果你只是自己本机使用YUM源可以省略掉这一步

  cd /mnt/Server

  rpm -ivh vsftpd*

  chkconfig vsftpd on

  service vsftpd start

  4,安装createrepo软件包

  rpm –ivh createrepo*

  5,拷贝系统盘中的文件本系统中

  cp -R /mnt/Server /var/ftp/pub

  二,搭建YUM

  1.生成依赖性关系

 Createrepo -g /var/ftp/pub/Server/repodata/comps-rhel5-server-core.xml /var/ftp/pub/Server/

  这个地方要注意,comps-rhel5-server-core.xml一定不能手动生成,默认安装光盘上已经有了

  2.做完上面的步骤后会有一个错误提示,“Could not remove old metadata dir: .olddata“说目录有问题。不用管他,把那个目录删除掉

  rm –rf /var/ftp/pub/Server/.olddata

  3.把步骤1再做一遍

  createrepo -g /var/ftp/pub/Server/repodata/comps-rhel5-server-core.xml /var/ftp/pub/Server/

  4.cd /etc/yum.repos.d

  vim yum.repo (新建一个仓库文件,名字可以随便起,在文件中写如下内容)

  [base]

  name=base

  baseurl=ftp://192.168.0.6/pub/Server #192.168.0.6是你的YUM源地址

  enabled=1 #是否开启源

  gpgcheck=1 #是否验证,可不要

  gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release #验证的密钥,可不要

4)RHEL5.1用光盘做yum源

RHEL5.4可以直接使用光盘作yum源,而RHEL5.1不能直接用光盘中的源,否则会出现urlopen error unknown url type: media,需要改造一番,注意这里提供的方法不用拷贝光盘中的大量文件.

1.将光盘镜像挂载到/media/RHEL/目录下

[root@Blinux Desktop]#mkdir /media/RHEL

[root@Blinux Desktop]#mount /root/rhel5.1.iso /media/RHEL -o loop

2.生成库文件

[root@Blinux Desktop]#mkdir /media/yum/

[root@Blinux Desktop]#rpm -ivh /media/RHEL/Server/createrepo-0.4.4-2.fc6.noarch.rpm

[root@Blinux Desktop]createrepo -o /media/yum/ -g /media/RHEL/Server/repodata/comps-rhel5-server-core.xml /media/RHEL/Server/

[root@Blinux Desktop]mount --bind /media/yum/repodate/ /media/RHEL/Server/repodate/

3.生成依赖关系

[root@Blinux Desktop]# vim /etc/yum.repos.d/rhel-debuginfo.repo

修改为类似

[rhel]

name=Red

baseurl=file:///media/RHEL/Server/

enabled=1

gpgcheck=0

gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release

[root@Blinux Desktop]# yum clean all;yum makecache

RHEL5.1下的本地YUM源就这样OK了,注意,这里并没有拷贝大量的文件,而是挂载.

附加:

1、yum 的配置文件(/etc/yum.conf), repo 文件(/etc/yum.repos.d)详解
http://www.centos.org/docs/5/html/5.1/Deployment_Guide/c1-yum.html
2、yum 特殊参数

--installroot=root 指定安装软件时的根目录

--enablerepo=repoidglob 暂时启用某个下载源

--disablerepo=repoidglob 暂时停用某个下载源

--exclude=package 排除某个软件包

--noplugins 暂时停用所有插件

--disableplugin=plugin 暂时停用指定的插件

3、案例1:禁用某个源

为什么要禁掉源?

“注:假如你正考虑使用第三方软件库,你应该认真地思考如何防止来自这些软件库的「更新」不经意地取替了 CentOS 的核心部份。其中一个方法就缺省它们为停用的,有必要时才启用它们“,http://wiki.centos.org/zh/AdditionalResources/Repositories?action=show&redirect=zh%2FRepositories

编辑 /etc/yum.repos.d/example.repo

enabled=0

或者

yum --disablerepo=some-repository install some-package

yum --enablerepo=some-disabled-repository install some-package

YUM Remove Repo (Repository) – YUM Disable Repo (Repository), http://www.if-not-true-then-false.com/2010/yum-remove-repo-repository-yum-disable-repo-repository/
4、CentOS 使用的软件库
http://wiki.centos.org/zh/AdditionalResources/Repositories?action=show&redirect=zh%2FRepositories
知名的第三方软件库:RPMforge、ELRepo、ATrpms、EPEL、及 RPMfusion 等

如果你是一个 Linux 新手,刚安装完一个崭新的 RHEL 5u4 系统,在默认配置下使用了几天,感觉不错。这时你想用 gcc 编一个程序,发现默认配置里并没有安装这个包。你找到安装光盘,小心翼翼地挂载上,并找到了 gcc-4.1.2-46.el5.i386.rpm 。尝试着用 rpm -ivh gcc-4.1.2-46.el5.i386.rpm 进行安装。系统告之缺少 glibc-devel 和 libgomp,当你试着安装 glibc-devel,系统又提示缺少
glibc-headers。继续下去,又发现缺少 kernel-headers。先前网上关于 RPM 依赖关系如何复杂的传言终于得到了印证。你很苦恼,心想如果当初选择了完全安装该有多好!同时也懊悔为了结省那不值钱的几 GB 空间而给自己今天带来了如此多的麻烦。最终,你按照依赖提示,递归似的完成了 gcc 的安装。你很庆幸的完成了这个任务。其实只是因为这个安装任务的依赖关系还不够复杂到把你吓退罢了。

如果你是一位忠实的 Fefora Linux 用户。有一天下午,你想为一台刚装完的 Fedora12 安装上 GNOME 桌面。依赖性并不是你所担心的,因为你知道 yum 可以解决这个问题。但是在键入 yum install 过后,发现自己并不知道要安装上 GNOME 桌面系统需要哪些软件包,甚至从来没有听说过有一个叫 GNOME 的包可以安装。你试着查询了一下仓库中包含 GNOME 字样的包,一共有 258 个。这个列表显然不是你想要的。在咨询过 google 过后,发现 yum 有一个 grouplist
选项,看起来有点像自己想要的。通过 yum grouplist 又找到了名叫 "X Window System" 和 "GNOME Desktop Environment" 的分组,这正是你想要的。但是在键入 yum groupinstall "X Window System" 过后,提示信息说 299 个包需要下载安装,一共 60M。看着下载进度条上的速度,只有 27KB/s,这样下完这 60M 需要将近一个小时。接下来还要安装一个不知道多大的 "GNOME Desktop Environment"。这意味着老板交待的事可能要明天才能开始,而且仅仅是开始,万一下载安装没有顺利完成
...... 你一边抱怨着公司的网络为什么久久不扩容,一边也懊恼为什么当初没有进行完全系统安装。

但是,“完全安装”真的是最好的方法吗?面对这种已经没有“完全安装”的情况,我们有什么更好的办法吗?

回页首

关于 RPM 包依赖的思考

RPM 的依赖性是个很让人头疼的问题。每次系统安装完成过后,想再装一个软件包,敲下回车之前,都会心惊胆战,生怕跳出个依赖性错误。而在一个依赖性错误的背后,可能还牵连着更多的依赖性。这个问题让很多 Linux 用户望而生畏。

RPM 包的依赖关系说起来是简单的因为它所谓的依赖关系仅仅是一个个简单的如“要安装 A,需要提前准备好 a1, a2, a3”这样的条件。我们在安装前可以通过一个简单的 rpm 命令来查询一个包的依赖关系。

# rpm -q --requires -p wireshark-1.2.2-1.fc12.i686.rpm

/sbin/ldconfig

config(wireshark) = 1.2.2-1.fc12

libc.so.6

...

libcom_err.so.2

...

libpcap.so.1

...

libsmi.so.2

...

python(abi) = 2.6

...

RPM 的依赖性同时又是繁琐的,因为它的依赖关系里只包含了 A 需要 a1, a2 和 a3 的信息,并没有包含 a1, a2 和 a3 是由哪个包来提供。对于如 python 这样直接给出依赖包名,我们可以轻松地找到 python-xxx.rpm;对于如 libpcap.so.1 这样熟悉的库,我们知道它对应 libpcap-xxx.rpm;对于一部分不熟悉的,如 libsmi.so.2 这样的依赖库,我们也可以找到恰好与该库同名的 libsmi-xxx.rpm。但是对于 libglib-2.0.so.0
这样的库,你会很容易“猜”出它是来自于 glib2 软件包的吗?正是因为这样的喋喋不休,以及对应依赖包的含糊性,使得用户对 RPM 的依赖性产生了一定的畏惧心理。

那么怎么确定一个库由哪个包提供呢?对于已安装的包,可以用通过下面的方式来查询:

# rpm -q --whatprovides libpcap.so.1

libpcap-1.0.0-4.20090922gite154e2.fc12.i686

但是对于在安装过程中存在依赖的库,显示这种方法是不可行的。在一台独立的系统里,这个答案甚至是无解的。某个库包含在哪里,只能遍历安装包,在每个包查询“我提供了哪些东西”的才能找到。

下面是通过安装盘中找 libglib-2.0.so.0 由哪个包提供的例子,用时 21 秒,着实不短。如果用这种方法查找 libz.so.1,需要数分钟才能完成。

# mount /dev/hdc /mnt/cdrom

mount: block device /dev/hdc is write-protected, mounting read-only

# cd /mnt/cdrom/Server

# time for i in `ls -1`;

do

if rpm -q --provides -p $i | grep -q libglib-2.0.so.0

then

echo $i

break

fi

done

glib2-2.22.2-2.fc12.i686.rpm

real 0m21.804s

user 0m3.946s

sys 0m14.396s

yum 对 RPM 包的处理是一个典型的“空间换时间”过程。通过对源中所有 RPM 包的预处理,生成所有安装包关于包含文件,依赖,冲突等信息的索引,并且以 sqlite 格式存放在 /var/cache/yum 对应目录下面。

基于 yum 索引查找 libglib-2.0.so.0 由哪个包提供的例子如下:

# time echo "select packages.name from packages inner join provides

#on packages.pkgKey = provides.pkgKey where provides.name = 'libglib-2.0.so.0';" |

#sqlite3 /var/cache/yum/i386/12/dvd/primary.sqlite glib2

real 0m0.008s

user 0m0.003s

sys 0m0.005s

同样的查询,用索引数据来处理,只需要约 1/100 秒。数十兆的空间,换来的是成百上千倍时间效率的提升。

多年来,RPM 关于依赖性的原理并没有大的变化,只是经由这么一包装,让大家觉得依赖性逐渐不再是一个大的问题了。

回页首

用安装 DVD 建立本地 yum 源

既然 yum 已经很好的解决了 RPM 包的依赖问题,本文要解决的就是速度问题。本地光驱的访问速度甚至快过 100M 局域网,而且在最近一些发行版安装盘中,已经预置好 repo 信息,并存放在名为 repodata 的目录中。可以说安装盘本身就是一个现成的 yum 源。在 RHEL5 中,预置了多个 repo,分别存放在 <CDROOT>/Server/repodata,<CDROOT>/Cluster/repodata 等目录中;在 Fedora12 中,存放在 <CDROOT>/repodata 中。在
RHEL4 等一些旧发行版中,没有预置 repo 信息。在这种情况下,需要手工建立 repo 信息供 yum 使用。关于手工建立 repo 的信息,请参考下一节“利用安装 CD 建立本地 yum 源中”关于 createrepo 部分的示例。

首先,把光盘放入光驱,挂载光盘。

# mount /dev/hdc /media/cdrom

mount: block device /dev/hdc is write-protected, mounting read-only

如果在本地有安装盘镜像,也通过 loop 方式挂载到相应目录。

# mount -o loop rhel-server-5.4-i386-dvd.iso /media/cdrom

然后,编辑 yum 源配置文件,添加一个本地 yum 源。这里是一张 RHEL5u4 的 DVD 安装盘,它的 repo 对应 <CDROOT>/Server。

# cat > /etc/yum.repos.d/dvd.repo <<END

[dvd]

name=install dvd

baseurl=file:///media/cdrom/Server

enabled=1

gpgcheck=0

END

对于 Fedora,系统安装后有默认远程 yum 源存在,建议在补装 RPM 包之前通过在 *.repo 文件中设置 "enabled=0" 临时禁用这些远程 yum 源。这样会迫使 yum 只使用本地光盘作为安装源,从来避免因外部下载带来时间的浪费。关于这部分的操作,请参考 doris_install_gnome_on_fc12.txt 中的相关部分。

回页首

用安装 CD 建立本地 yum 源

对于 RHEL4 或者其它相对旧的发行版,或者仅有安装 CD 的情况下,还可以通过类似的方式补装 RPM 包吗?答案是肯定的,不过需要一个多余的步骤,即手工创建 repo 数据。

下面的示例,通过把 RHEL4u6 的 5CD 中的 RPMS 混合到一个目录中,然后用 createrepo 命令建立 repo 数据。

首先混装 CD:

[root@localhost root]# mkdir -p /mnt/dvd

# insert CD1

[root@localhost root]# mount /dev/hdc /media/cdrom/

[root@localhost root]# cp -prf /media/cdrom/Server /mnt/dvd/RPMS

[root@localhost root]# umount /media/cdrom

# insert CD2

...

# insert CD3

...

# insert CD4

...

# insert CD5

[root@localhost root]# mount /dev/hdc /media/cdrom/

[root@localhost root]# cp -prf /media/cdrom/Server /mnt/dvd/RPMS

[root@localhost root]# umount /media/cdrom

# remove unused files

[root@localhost root]# find /mnt/dvd/RPMS -name TRANS.TBL -exec rm -f {} \;

然后通过 createrepo 命令创建 yum 源数据。这正是“空间换时间”的预处理过程,视 RPM 数据的多少,大约需要几分钟。"-d" 参数表示在生成 xml 索引的同时生成 sqlite 格式的索引。完成过后,这两种索引文件均以压缩格式存放于 repodata 目录中,供 yum 查询所用。

[root@localhost root]# cd /mnt/dvd

[root@localhost dvd]# createrepo -d .

1/2399 - RPMS/plymouth-theme-charge-0.8.0-0.2009.29.09.18.fc12.i686.rpm

2/2399 - RPMS/aspell-0.60.6-7.fc12.i686.rpm

3/2399 - RPMS/xml-common-0.6.3-30.fc12.noarch.rpm

......

2397/2399 - RPMS/mythes-en-3.0-5.fc12.noarch.rpm

2398/2399 - RPMS/hunspell-mi-0.20080630-3.fc12.noarch.rpm

2399/2399 - RPMS/hicolor-icon-theme-0.11-1.fc12.noarch.rpm

Saving Primary metadata

Saving file lists metadata

Saving other metadata

Generating sqlite DBs

Sqlite DBs complete

[root@localhost dvd]# ls -l repodata/

total 10004

-rw-r--r--. 1 root root 2974902 2009-12-06 09:48 filelists.sqlite.bz2

-rw-r--r--. 1 root root 2618445 2009-12-06 09:48 filelists.xml.gz

-rw-r--r--. 1 root root 912087 2009-12-06 09:48 other.sqlite.bz2

-rw-r--r--. 1 root root 951651 2009-12-06 09:48 other.xml.gz

-rw-r--r--. 1 root root 1809806 2009-12-06 09:48 primary.sqlite.bz2

-rw-r--r--. 1 root root 958302 2009-12-06 09:48 primary.xml.gz

-rw-r--r--. 1 root root 2726 2009-12-06 09:48 repomd.xml

最后,编辑 yum 源配置文件,添加一个本地 yum 源。注意对应的目录,这次是 /mnt/dvd,因为 repodata 是在此路径下创建的。

[root@localhost dvd]# cat > /etc/yum.repos.d/dvd.repo <<END

[dvd]

name=install dvd

baseurl=file:///mnt/dvd

enabled=1

gpgcheck=0

END

对于 RHEL4 一类不带 repodata 的安装 DVD,去掉混装 RPM 的一步,直接用 createrepo 命令建立源数据即可。

回页首

补装单个软件包

完成本地源配置过后,接下来就可以用 yum 进行 RPM 包的补装了。首先,查看刚刚配置好的 yum 源。

# yum list

Loaded plugins: rhnplugin, security

This system is not registered with RHN.

RHN support will be disabled.

dvd | 1.3 kB 00:00

dvd/primary | 732 kB 00:00

dvd: [##############################################################] 2292/2292/

Installed Packages

Deployment_Guide-en-US.noarch 5.2-11 installed

GConf2.i386 2.14.0-9.el5 installed

ImageMagick.i386 6.2.8.0-4.el5_1.1 installed

......

Available Packages

Deployment_Guide-as-IN.noarch 5.2-11 dvd

Deployment_Guide-bn-IN.noarch 5.2-11 dvd

Deployment_Guide-de-DE.noarch 5.2-11 dvd

......

zlib-devel.i386 1.2.3-3 dvd

zsh.i386 4.2.6-3.el5 dvd

zsh-html.i386 4.2.6-3.el5 dvd

然后,通过熟知的 yum install 来补装软件包。从输出信息可以看到,yum 会帮我们处理好 RPM 包的依赖关系。同时由于包都在本地,下载的时间几乎可以忽略。很快 gcc 将安装到系统中。

# yum install gcc

Loaded plugins: rhnplugin, security

This system is not registered with RHN.

RHN support will be disabled.

Setting up Install Process

Resolving Dependencies

--> Running transaction check

---> Package gcc.i386 0:4.1.2-46.el5 set to be updated

--> Processing Dependency: libgomp >= 4.1.2-46.el5 for package: gcc

--> Processing Dependency: glibc-devel >= 2.2.90-12 for package: gcc

...

--> Finished Dependency Resolution

Dependencies Resolved

================================================================================

Package Arch Version Repository Size

================================================================================

Installing:

gcc i386 4.1.2-46.el5 dvd 5.2 M

Installing for dependencies:

glibc-devel i386 2.5-42 dvd 2.0 M

...

Transaction Summary

================================================================================

Install 5 Package(s)

Update 0 Package(s)

Remove 0 Package(s)

Total download size: 8.8 M

Is this ok [y/N]: y

Downloading Packages:

--------------------------------------------------------------------------------

Total 1.2 GB/s | 8.8 MB 00:00

Running rpm_check_debug

Running Transaction Test

Finished Transaction Test

Transaction Test Succeeded

Running Transaction

Installing : kernel-headers 1/5

...

Installing : gcc 5/5

Installed:

gcc.i386 0:4.1.2-46.el5

Dependency Installed:

glibc-devel.i386 0:2.5-42 glibc-headers.i386 0:2.5-42

kernel-headers.i386 0:2.6.18-164.el5 libgomp.i386 0:4.4.0-6.el5

Complete!

回页首

补装分组软件包

分组安装在需要补装如桌面系统,开发工具的时候,显得犹为方便快捷。

首先,查看 yum 源中的分组列表。

[root@localhost root]# yum grouplist

Loaded plugins: rhnplugin, security

This system is not registered with RHN.

RHN support will be disabled.

Setting up Group Process

dvd/group

| 1.0 MB 00:00

Installed Groups:

Administration Tools

Editors

GNOME Desktop Environment

...

Available Groups:

Authoring and Publishing

DNS Name Server

Development Libraries

...

Done

然后,通过 yum groupinstall 来补装软件包。yum 会自动解析出分组所包含的 RPM 软件包,并处理好它们的依赖关系。同样,mysql-server 很快被安装到系统中。

[root@localhost root] # yum groupinstall "MySQL Database"

Loaded plugins: rhnplugin, security

This system is not registered with RHN.

RHN support will be disabled.

Setting up Group Process

Resolving Dependencies

...

--> Finished Dependency Resolution

Dependencies Resolved

================================================================================

Package Arch Version Repository Size

================================================================================

Installing:

MySQL-python i386 1.2.1-1 dvd 82 k

libdbi-dbd-mysql i386 0.8.1a-1.2.2 dvd 17 k

...

Installing for dependencies:

libdbi i386 0.8.1-2.1 dvd 35 k

libdbi-drivers i386 0.8.1a-1.2.2 dvd 14 k

...

Transaction Summary

============================================

Install 12 Package(s)

Update 0 Package(s)

Remove 0 Package(s)

Total download size: 17 M

Is this ok [y/N]: y

Downloading Packages:

---------------------------------------------------------------------------

Total 1.3 GB/s | 17 MB 00:00

Running rpm_check_debug

Running Transaction Test

Finished Transaction Test

Transaction Test Succeeded

Running Transaction

Installing : perl-DBI 1/12

Installing : mysql 2/12

...

Installing : libdbi-dbd-mysql 12/12

Installed:

MySQL-python.i386 0:1.2.1-1

libdbi-dbd-mysql.i386 0:0.8.1a-1.2.2

...

Dependency Installed:

libdbi.i386 0:0.8.1-2.1 libdbi-drivers.i386 0:0.8.1a-1.2.2

...

Complete!

回页首

在图形界面下补装软件包

在桌面环境已经具备的情况下,RPM 软件包的补装将更加便捷。你甚至不需要记住任何一个 yum 命令的参数,而且操作界面与系统初装时几乎一致。相信这正是大部分用户在想要补装软件包时想要的。

在 RHEL 5 中,通过菜单里的 "Add/Remove Software" 启动包管理器。同时,也可能在 console 下通过 "system-config-packages" 或者 "pirut" 启动它。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  linux