对于CentOS系列的操作系统而言,yum是一个必不可少的rpm包管理工具,它的宗旨是自动化的升级,安装/移除rpm包,收集rpm包的相关信息,检查依赖性并自动提示用户解决。 一个yum源又叫做yum仓库,既可以是http或者ftp站点,也可以是在本地。我们今天来讨论下yum源在本地的情况。
yum源安装时会有本地源和网络源,我们知道在联网的情况下的问题非常容易解决,而在离线的情况下问题就复制多了。如何在离线的情况下,也依然能够像联网一样方便、放心的使用yum呢?
下面提供几种解决方式
这几种方式的前提都是你需要知道所需rpm包的yum源地址。有些yum源并不是很主流,如果平时多留意常用的yum
源,用的时候就能信手拈来。
比如,我以安装PHP7.1
为例,我知道remirepo
源可以满足我的需求。那我首先添加网络yum
源到本地:
wget http://rpms.remirepo.net/enterprise/remi-release-7.rpm && rpm -Uvh remi-release-7.rpm
查看到/etc/yum.repos.d
,可以看到remi-php71.repo
,remi-safe.repo
等被添加到本地
我们来看看remi-php71.repo
这一个仓库,其关键信息是:
[remi-php71]
name=Remi's PHP 7.1 RPM repository for Enterprise Linux 7 - $basearch
#baseurl=http://rpms.remirepo.net/enterprise/7/php71/$basearch/
#mirrorlist=https://rpms.remirepo.net/enterprise/7/php71/httpsmirror
mirrorlist=http://rpms.remirepo.net/enterprise/7/php71/mirror
enabled=0
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-remi
这个remi-php71
就是我们安装PHP7.1
所需的代码仓库了,下面是其配置项。其中baseurl
指定源的镜像服务器地址,mirrorlist
指定一个镜像服务器的地址列表。二者的目的都是告诉你从哪里可以找到这个仓库。
接下来,我们就开始来同步到本地,执行:
reposync -r remi-php71
reposync 工具需要安装,安装方式如下:
yum install yum-utils
这条命令安装了许多工具,reposync
只是我们用到的一条。
reposync
完毕后,将remi-php71
里面的所有的rpm包复制到在目录/var/yum/php/7.1
下(目录可以自定义,但必须和repo
配置文件相同)。
然后我们执行
createrepo ./
createrepo 也需要安装,安装方式如下:
yum -y install createrepo
另外,我们添加自己的本地源配置文件,新建repo配置文件:
vim /etc/yum.repos.d/php7.1.repo
添加内容
[php7.1]
name=PHP 7.1.11
baseurl=file:///var/yum/php/7.1/
gpgcheck=0
enabled=1
注意:配置文件里面的baseurl
以file://
开始,后面的跟本地路径,这个路径必须和存放rpm包的地址一致。
做好这一切准备工作之后,我们就可以来正式安装PHP7.1
了:
yum --disablerepo=* --enablerepo=php7.1 install php php-fpm php-mysqlnd php-mcrypt php-mysqlnd php-pecl-mysql php-xml php-soap php-xmlrpc php-simplexml php-curl
这个--disablerepo=* --enablerepo=php7.1
表示我们只用到本地的仓库php7.1
,没有用到任何线上的yum
仓库。但是因为其指向的/var/yum/php/7.1/
已经有了和网络上一模一样的资源,即所有的rpm包。因此,通过这种方式安装的效果和从网络源安装的效果一模一样!
这样,你可以将/var/yum/php/7.1/
中的rpm包复制到任何你想要安装的一台机器上,遵循同样的命令便可以顺利的装上你想要的软件环境。
当然,这样“全盘复制”也有个缺点,那就是很多网络yum
源其实很大很全,包括众多的版本,而更多情况下我们只需要一个版本,因此会因为下载大量多余的rpm
包从而造成磁盘浪费。这时候,我们就应该去寻找的网络源就更应该有针对性。
这个方式可以定点安装,需要什么rpm就安装什么,将下载rpm包和安装rpm包两个操作分开。这需要yum
的 --downloaddir
参数。
RHEL6.4及之前版本,需单独安装 yum -y yum-plugin-downloadonly
,RHEL6.4后面的版本就变成自带的了。
我们通过准备操作,已经添加了源remi-safe.repo
,可以通过这个源实现安全安装PHP7
的各个版本。如果我们想安装PHP7.2,那我们应该执行
yum install php72 --disablerepo=* --enablerepo=remi-safe
现在我们不想安装了,只想获取php72
的所有依赖的rpm
,以便于我们在别处,或者在我们想安装的时候再去安装。我们只需要继续添加参数:
yum install php72
--disablerepo=*
--enablerepo=remi-safe
--downloadonly
--downloaddir=/tmp/rpm/download
通过yum install -h
可以查看--downloaddir
是指定下载rpm的存放路径,可以自定义。我们这里指定/tmp/rpm/download
。
注意,当有本地源且可以安装php72时,这条命令不会起作用,因此明确是哪个线上源,加上–disablerepo=* –enablerepo=remi-safe 这两个参数,确保rpm包能够顺利下载到本地。
默认情况下,当前版本的 yum 在成功下载和安装软件包后,会把下载的文件删掉。这样可以减少 yum 占用的磁盘空间。你可以打开缓存,这样 yum 将在缓存目录保留下载到的文件。
缓存带来的好处是毋庸置疑的:可以提高yum的性能,可以离线进行yum操作,也可以复制缓存中的rpm包以在离线的时候使用。
默认情况下,yum
在 /var/cache/yum/
目录保存临时文件,每个源都有自己的子目录。源目录中 packages/
子目录包含了缓存的软件包。例如,目录 /var/cache/yum/x86_64/7/remi-safe
包含从 remi-safe
源下载的软件包。
要配置 yum 保留已下载的文件而不是删除,设置 /etc/yum.conf
中的 keepcache 选项为 1:
[main]
cachedir=/var/cache/yum/$basearch/$releasever
keepcache=1
debuglevel=2
logfile=/var/log/yum.log
....
打开缓存后,每个 yum 操作都可能从仓库下载软件包数据。要保证缓存包含了软件包数据,在启用缓存后运行yum list 或 yum search 来下载软件包数据。
如果启用了缓存,在离线的情况下运行
yum -C install <软件包名>
你还可以将缓存/var/cache/yum/
整个地复制或者仅仅复制某一个yum源的cache到另一台离线机器上相同的目录,然后执行
yum -C update
yum -C install <软件包名>
以上三种方式的共同的前提是在联网的时候有这么一个合适的yum源,通过一定的方式复制到本地,然后在离线的情况下,或者是别的机器上实现完全一样的操作。通过这种方式增强了yum的功能,客观上也提高了其在不同环境上的适用性。
当然,我们也可以自己制作rpm包,解决好依赖性,放在自己的本地源,从而实现和线上源一样的功能。