很多情况下,服务器都是没有公网访问权限的,这给我们安装软件包带来了很多的不便。刚安装的系统缺少很多软件包,只能下载Tarball或者RPM包上传到服务器上安装,解决依赖问题过于麻烦,浪费时间。

以常见的CenOS为例,默认情况下使用YUM管理软件包依赖于在线仓库,在离线环境中此方法失效,我们有以下几种方式解决问题,依据情况酌情选择最合适的方式。

  1. 挂载安装镜像
    适用于安装CentOS自带的一些包,和在线源的base源包完全一致。
  2. 建立本地YUM源
    适用于安装CentOS自带源中的包。除了base外的例如extras、updates、epel。
  3. 下载离线RPM包
    适用于安装一些不常见的YUM源的包,例如Docker的源,只提供Docker软件包,就没有必要单独建立本地源,只需要将需要的包下载下来进行安装即可。

接下来依次对这三种方式进行讲解。

一、挂载安装镜像

CentOS安装镜像内有一个Packages目录,里面包含大量的RPM包,可以以此来创建本地yum仓库。

1、首先下载完整版CentOS镜像

我们安装的时候,大部分都是选择最小化安装。但是为了获取比较齐全的包,此时就需要下载完整的镜像,有DVD版本和Everything版本,一般来说,DVD版本就够用了,Everything版本更加齐全。

我这里就以Everything版本为例,CentOS-7-x86_64-Everything-2009.iso,整个镜像接近10G!

2、将镜像上传到主机

这里自由发挥,用喜欢的工具上传到主机上。笔者上传到了/home/CentOS-7-x86_64-Everything-2009.iso

3、挂载镜像

使用mount挂载iso镜像。

mkdir /mnt/vcdrom
mount /home/CentOS-7-x86_64-Everything-2009.iso /mnt/vcdrom
4、拷贝出需要的包

进入挂载的目录,我们需要的只是Packages目录。将它拷贝出来。

cp -av /mnt/vcdrom/Packages /media/local-repos
5、通过rpm创建yum仓库

首先在Packages里找到createrepo-*这个包,通过rpm安装。createrepo需要两个依赖包,提前安装。

rpm -ivh deltarpm-3.6-3.el7.x86_64.rpm
rpm -ivh python-deltarpm-3.6-3.el7.x86_64.rpm
rpm -ivh createrepo-0.9.9-28.el7.noarch.rpm

使用createrepo创建仓库。

createrepo -v /media/local-repos/Packages
5、编辑yum配置文件

yum默认使用网络源,需要将其禁用。

mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak
mv /etc/yum.repos.d/CentOS-Debuginfo.repo /etc/yum.repos.d/CentOS-Debuginfo.repo.bak
mv /etc/yum.repos.d/CentOS-Vault.repo /etc/yum.repos.d/CentOS-Vault.repo.bak

配置本地源/etc/yum.repos.d/CentOS-Media.repo

[c7-media]  #仓库名称,不能用特殊符号
name=CentOS-$releasever - Media  #仓库描述
baseurl=file:///media/local-repos/Packages/  #指定仓库的路径,可以有多个,这里我们只有一个,将另外两个删掉
        #file:///media/cdrom/
        #file:///media/cdrecorder/
gpgcheck=0  #禁用检验软件包的数字签名
enabled=1  #启用仓库
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

更新yum缓存。

yum clean all
yum makecache

尝试使用yum安装软件试试吧。

二、建立本地YUM源

远程的yum源可以用ftp或者http,两种方法我都会介绍一下。

首先安装ftp,这里使用vsftp,首先需要安装vsftpd并且启动服务。

yum install vsftpd
systemctl start vsftpd
systemctl enable vsftpd

尝试访问,默认匿名可访问。vsftp默认的目录为/var/ftp,我们直接在这个目录下进行离线源的存储就好了,省去改配置文件的麻烦。

mkdir -p /var/ftp/centos/7

安装repository工具。

yum install yum-utils createrepo

查看源列表,我这里已经提前换成的163的源。其实什么源无所谓,默认源速度可以的话,直接用默认源就好。

yum repolist

同步源到本地,repoid可以指定多个。

reposync -n --repoid=extras --repoid=updates --repoid=base -p /var/ftp/centos/7

同步完成之后创建索引。

createrepo -po /var/ftp/centos/7/base/ /var/ftp/centos/7/base/
createrepo -po /var/ftp/centos/7/updates/ /var/ftp/centos/7/updates/
createrepo -po /var/ftp/centos/7/extras/ /var/ftp/centos/7/extras/

下载对应的key文件。

cd /var/ftp/centos
wget http://mirrors.163.com/centos/RPM-GPG-KEY-CentOS-7

在其他离线主机上修改配置文件

[base]
name=CentOS-$releasever - Base
baseurl=ftp://192.168.88.2/centos/7/base/
gpgcheck=1
gpgkey=ftp://192.168.88.2/centos/RPM-GPG-KEY-CentOS-7

[updates]
name=CentOS-$releasever - Updates
baseurl=ftp://192.168.88.2/centos/7/updates/
gpgcheck=1
gpgkey=ftp://192.168.88.2/centos/RPM-GPG-KEY-CentOS-7

[extras]
name=CentOS-$releasever - Extras
baseurl=ftp://192.168.88.2/centos/7/extras/
gpgcheck=1
gpgkey=ftp://192.168.88.2/centos/RPM-GPG-KEY-CentOS-7

避免每次手动更新,我们创建一个定时任务脚本update_yum_repo.sh,用于同步。

echo 开始同步
reposync -n --repoid=extras --repoid=updates --repoid=base -p /var/ftp/centos/7

#更新元数据
createrepo --update /var/ftp/centos/7/base/
createrepo --update /var/ftp/centos/7/updates/
createrepo --update /var/ftp/centos/7/extras/

加入crontab任务。crontab -e

0 2 * * * sh /root/update_yum_repo.sh

三、下载离线RPM包

几个前提:

  • 需要一台可以访问公网的机器,和最终安装软件的内网机器版本一致。
  • 在可访问公网的机器上安装yum-utils
  • 用于下载rpm包的机器最好是纯净的系统,避免依赖包下载不到

主要使用的是yumdownloaer这个命令。

例如你需要安装vim,可以通过下面的命令将vim以及其依赖包全部下载到当前目录。

yumdownloader vim --resolve

也可以指定下载的目录。

yumdownloader vim --resolve --destdir=/home/vim

之后将所有的文件拷贝到目标机器上,使用下面的命令安装。

rpm -Uvh /home/vim/*.rpm

之前说的前提中,最后一点需要注意,如果用于下载的机器上已经安装了vim,你会发现只会下载vim一个包,并没有相关依赖包,原因在于--resolve这个参数在解决依赖的时候,根据本机的环境来解析的,由于已经安装了vim,所以存在需要安装的依赖包。这将导致目标机器安装的时候会提示缺少一些依赖。

最后修改:2023 年 08 月 02 日
如果觉得我的文章对你有用,请随意赞赏