[转载]CentOS 7 创建本地YUM源

时间:2024-01-13 09:55:14

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

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

(1) 实体机上直接放入光盘
(2) VMware Workstation 虚拟机:虚拟机-->可移动设备-->CD/DVD-->连接

  1. mkdir /mnt/cdrom #创建目录
  2. mount /dev/cdrom /mnt/cdrom #挂载
  3. umount /mnt/cdrom #卸载

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

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

2、创建repo文件

  1. cat >>/etc/yum.repos.d/CentOS-Local.repo<<-EOF
  2. [Local]
  3. name=Local Yum
  4. baseurl=file:///yum/
  5. gpgcheck=1
  6. gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
  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/

  1. localpath="/mirrors/CentOS"
  2. mirror="mirrors.hustunique.com::centos"
  3. rsync="rsync -avzH --delete"
  4. verlist="7"
  5. baselist="centosplus extras fasttrack os updates"
  6. archlist="x86_64"
  7. for ver in $verlist
  8. do
  9. for base in $baselist
  10. do
  11. for arch in $archlist
  12. do
  13. remote=$mirror/$ver/$base/$arch/
  14. mkdir -pv $localpath/$ver/$base/$arch/
  15. $rsync $remote $localpath/$ver/$base/$arch/
  16. done
  17. done
  18. done

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

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

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

1、创建本地yum仓库

  1. mkdir -p /yum/local #可以有N级目录
  2. cp ... #复制RPM包到上述目录

2、创建repo文件

  1. cat >>/etc/yum.repos.d/CentOS-Local.repo<<-EOF
  2. [Local]
  3. name=Local Yum
  4. baseurl=file:///yum/
  5. gpgcheck=1
  6. gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
  7. enabled=1

3、安装createrepo

  1. yum install createrepo #使用yum安装createrepo
  2. rpm -ivh http://mirror.centos.org/centos/7/os/x86_64/Packages/createrepo-0.9.9-23.el7.noarch.rpm

4、创建索引

  1. createrepo /yum
  2. yum makecache #更新缓存

四、添加yum源

  1. [1] Add RPMforge Repository for yum because that has many useful packages.
  2. [root@dlp ~]#
  3. wget http://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.3-1.el6.rf.x86_64.rpm
  4. [root@dlp ~]#
  5. rpm -Uvh rpmforge-release-0.5.3-1.el6.rf.x86_64.rpm
  6. Preparing… ###################################### [100%] 1:rpmforge-release ###################################### [100%]
  7. [root@dlp ~]#
  8. sed -i -e "s/enabled = 1/enabled = 0/g" /etc/yum.repos.d/rpmforge.repo
  9. [2] Add repository EPEL that is provided from Fedora project.
  10. [root@dlp ~]#
  11. wget http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
  12. [root@dlp ~]#
  13. rpm -Uvh epel-release-6-8.noarch.rpm
  14. Preparing… ###################################### [100%] 1:epel-release ###################################### [100%]
  15. [root@dlp ~]#
  16. 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 Repository 內的软件包信息
命令: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 等