These are rough notes from whatever I was working on, interested in or thinking about at the time. They vary greatly in quality and length, but prove useful to me, and hopefully to you too!
Installing rpms offline using a local yum repository
If you have a CentOS 7 machine that does not have internet access, resolving dependencies when installing rpms can be tricky. Rather manually trying to resolve all dependencies (e.g.
rpm -Uvh blah.rpm blah-dependency-1.rpm ...etc), it is much simpler and more maintainable to create a local yum repository. Then, with only a couple of extra command line options, you can use yum to install dependencies from your local repository and let it resolve all the dependencies for you (e.g.
yum --disablerepo=\* --enablerepo=offline-myrepo install blah). This page documents how to achieve that.
First from a CentOS 7 machine with internet access we create the local repository, and install all the packages we need into the local repository.
Then we copy the local repository across to the CentOS 7 machine which does not have internet access, and install the packages we need from that local repository into the machine.
Local repository requirements
From the online machine, install these requirements which are needed for creating local repository:
$ yum install yum-plugin-downloadonly yum-utils createrepo
Additional repositories (optional)
Not all necessary packages are available on the default repositories.
Add the EPEL repository (Extra Packages for Enterprise Linux) to give access to many more pacakges:
$ sudo yum install epel-release
EPEL does not always have the latest versions. For example, currently the latest version of nginx it has is v1.12.2, whereas v1.14.0 is the current latest stable version of nginx. To ensure we can get v1.14.0, we add the nginx repository:
$ vi /etc/yum.repos.d/nginx.repo [nginx] name=nginx repo baseurl=http://nginx.org/packages/centos/$releasever/$basearch/ gpgcheck=0 enabled=1
Now we can see which versions of nginx are available to us, and verify that v1.14.0 is present:
$ yum --showduplicates list nginx | expand Loaded plugins: fastestmirror Loading mirror speeds from cached hostfile * base: mirror.econdc.com * epel: mirror.veriteknik.net.tr * extras: mozart.ee.ic.ac.uk * updates: mirror.clustered.net Available Packages nginx.x86_64 1:1.8.0-1.el7.ngx nginx nginx.x86_64 1:1.8.1-1.el7.ngx nginx nginx.x86_64 1:1.10.0-1.el7.ngx nginx nginx.x86_64 1:1.10.1-1.el7.ngx nginx nginx.x86_64 1:1.10.2-1.el7.ngx nginx nginx.x86_64 1:1.10.3-1.el7.ngx nginx nginx.x86_64 1:1.12.0-1.el7.ngx nginx nginx.x86_64 1:1.12.1-1.el7.ngx nginx nginx.x86_64 1:1.12.2-1.el7_4.ngx nginx nginx.x86_64 1:1.12.2-2.el7 epel nginx.x86_64 1:1.14.0-1.el7_4.ngx nginx
To install NodeJS, add the following repository:
$ rpm -Uvh https://rpm.nodesource.com/pub_4.x/el/7/x86_64/nodesource-release-el7-1.noarch.rpm
Add IUS repository for Python 3.6:
$ yum install https://centos7.iuscommunity.org/ius-release.rpm
Create local repository folders
We will call our repository
myrepo. You can, of course, use another name:
$ mkdir /var/tmp/myrepo $ mkdir /var/tmp/myrepo-installroot
Install to local repository
Most packages can be installed into our local yum repository from the upstream yum repositories.
Install all required packages to our local
$ yum install --downloadonly --installroot=/var/tmp/myrepo-installroot --releasever=7 --downloaddir=/var/tmp/myrepo nginx-1.14.0-1.el7_4.ngx bzip2 fontconfig gcc gcc-c++ git nodejs python36u python36u-devel python36u-pip rabbitmq-server
Some rpms are not avaialble in yum. For example MySQL rpms must be downloaded from the MySQL website.
Manually copy these in to
mysql-community-client-5.7.12-1.el7.x86_64.rpm mysql-community-devel-5.7.12-1.el7.x86_64.rpm mysql-community-common-5.7.12-1.el7.x86_64.rpm mysql-community-libs-5.7.12-1.el7.x86_64.rpm mysql-community-libs-compat-5.7.12-1.el7.x86_64.rpm mysql-community-server-5.7.12-1.el7.x86_64.rpm
Finalise the repository
Generate the metadata to turn the folder of rpms into a yum repository:
$ createrepo --database /var/tmp/myrepo
Clean up (optional)
This folder is no longer necessary:
$ rm -rf /var/tmp/myrepo-installroot
Install from repository offline
Now on the offline machine, copy the repository over (
/var/tmp/myrepo) and then add the following file to enable the repository:
$ vi /etc/yum.repos.d/offline-myrepo.repo [offline-myrepo] name=CentOS-$releasever - My Repository baseurl=file:///var/tmp/myrepo enabled=0 gpgcheck=1 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
We can now install dependencies from our offline yum repository, e.g. nodejs:
$ yum --disablerepo=\* --enablerepo=offline-myrepo install nodejs
For nginx I found that it failed on the GPG check (which is presumably why the nginx documentation instructed us to set
nginx.repo earlier), but we can use the
--nogpgcheck option to disable that on an individual basis:
$ yum --disablerepo=\* --enablerepo=offline-myrepo install nginx --nogpgcheck
There you have it! No more manually specifying all rependencies on the offline machine, simply rely upon yum.
Modifying the repository
If you need to modify the local repository, you will need to run
createrepo, but also need to run
clean metadata on the offline machine. For example:
$ yum --disablerepo=\* --enablerepo=offline-myrepo clean metadata
clean command is necessary because yum caches the repository metadata. If you modify your offline repository (e.g. add a new rpm and then run
createrepo) yum will be unable to find it until you run the