RHEL7: Set up a local repository for a lab.

Share this link


Downloading packages from the Internet takes time.
To be able to quickly deploy new VMs, you need a local repository.

Configuration Procedure

Install the Apache package:

# yum group install -y "Basic Web Server"

Create the directories for the CentOS distribution and the updates:

# cd /var/www/html
# mkdir -p conf repo/CentOS/7
# cd repo/CentOS/7
# mkdir -p centosplus/x86_64 extras/x86_64 os/x86_64 updates/x86_64

In the software requirements, it was specified to download the DVD version or the Everything version of the CentOS 7 distribution. It is now time to use it.

Mount the previously downloaded iso and copy it into the right place:

# mount -o loop CentOS-7.0-1406-x86_64-DVD.iso /mnt
# cd /mnt
# tar cvf - . | (cd /var/www/html/repo/CentOS/7/os/x86_64; tar xvf -)
# cd /; umount /mnt

In order to prepare the centosplus, extras and updates repositories, install the createrepo package:

# yum install createrepo

Prepare the centosplus, extras and updates repositories:

# cd /var/www/html/repo/CentOS/7/centosplus/x86_64; createrepo .
# cd ../../extras/x86_64; createrepo .
# cd ../../updates/x86_64; createrepo .

Go into the directory where the repository configuration is:

# cd /etc/yum.repos.d

Create the local.repo file and paste the following lines:

name=master - Base

name=master - Updates

name=master - Extras

name=master - CentosPlus

Note1: A yum update command will update the system with what the local Apache server’s got.
Note2: Don’t try to display the $releasever and $basearch variables with the echo command. They aren’t shell variables but specific values provided by yum (see this thread for more details).

Copy the local.repo file into the /var/www/html/conf directory to make it available to the new VMs:

# cp local.repo /var/www/html/conf

Assign the SELinux attributes to the files:

# restorecon -R /var/www/html

Activate the Apache server at boot and start it:

# systemctl enable httpd && systemctl start httpd

Clean up the yum configuration:

# yum clean all

Check the yum configuration:

# yum repolist all
Loaded plugins: fastestmirror, langpacks
centosplus                                            | 2.9 kB     00:00
extras                                                | 2.9 kB     00:00
os                                                    | 3.6 kB     00:00
updates                                               | 2.9 kB     00:00
(1/2): os/7/x86_64/group_gz                             | 157 kB   00:00
(2/2): os/7/x86_64/primary_db                           | 4.9 MB   00:00
Loading mirror speeds from cached hostfile
repo id                        repo name                       status
centosplus/7/x86_64            master - CentosPlus             enabled:     0
extras/7/x86_64                master - Extras                 enabled:     0
os/7/x86_64                    master - Base                   enabled: 8,465
updates/7/x86_64               master - Updates                enabled:     0
repolist: 8,465

Finally, you need an extra step to regularly update your lab local repository.
Create a Bash script called /root/rsync.sh and paste the following lines (where mirror.ovh.net/ftp.centos.org/7/ is the url of a close CentOS repository):

/usr/bin/rsync -av --delete --delete-excluded --exclude "local" --exclude "isos" --exclude "*.iso" --exclude "xen4" --exclude "*.i686.*" --exclude "i386" rsync://centos.mirrors.ovh.net/ftp.centos.org/7/ /var/www/html/repo/CentOS/7

Give the execution permissions:

# chmod u+x /root/rsync.sh

Put this script into the root crontab (# crontab -e):

00 02 * * * /root/rsync.sh

Note: The first synchronization will last a while but, after, it will be quick.

After synchronization, you will get this kind of result:

# yum repolist all
Loaded plugins: fastestmirror, langpacks
Loading mirror speeds from cached hostfile
repo id                          repo name                        status
centosplus/7/x86_64              master - CentosPlus              enabled:    70
extras/7/x86_64                  master - Extras                  enabled:    44
os/7/x86_64                      master - Base                    enabled: 8,465
updates/7/x86_64                 master - Updates                 enabled:   866
repolist: 9,445

Add a rule to the firewall (except if the local repository is the KVM host itself):

# firewall-cmd --permanent --add-service=http
# firewall-cmd --reload

Additional Resources

The DeviantEngineer website provides a tutorial to Install your own local Repo server on CentOS 7 with Nginx.

1 Star2 Stars3 Stars4 Stars5 Stars (4 votes, average: 4.00 out of 5)

Leave a Reply

Please Login to comment
5 Comment threads
17 Thread replies
Most reacted comment
Hottest comment thread
8 Comment authors
number 6SamLisenetthetronCory Brown Recent comment authors
newest oldest
Notify of

Depending on the disc you used to install CentOS 7, you may need to remove the currently existing repos to achieve the same output — and avoid a warning about each repo “being defined twice.”

Just do an rm /etc/yum.repos.d/* before you create your local.repo, and you should be set!


Hi, thanks for making such a great site! I have purchased the new RHEL 7 book by Michael Jang which you recomended which is being released today (8 April) – I can’t wait to receive it shortly. I have been following your lab tutorial and I have a problem with the rsync.sh command… when I type this into my terminal it gives me an error is this normal? [root@master yum.repos.d]# /usr/bin/rsync -av –delete –delete-excluded –exclude “local” –exclude “isos” –exclude “*.iso” –exclude “xen4” –exclude “*.i686.*” –exclude “i386” rsync://mirror.ovh.net/ftp.centos.org/7/ /var/www/html/repo/CentOS/7 @ERROR: Unknown module ‘ftp.centos.org’ rsync error: error starting client-server protocol (code 5)… Read more »


Should also be included in “Prepare the centosplus, extras and updates repositories:” step?


Hi I followed the guide

However I found the 7.3 has the firewall enabled. So you should add the following

firewall-cmd –add-port=80/tcp –permanent
firewall-cmd –add-port=443/tcp –permanent
firewall-cmd –reload

number 6
number 6

Hello again CertDepot, I’d like to ask if the repository is at an ip that’s in a different network, let’s say (we don’t know the subnet mask, nor its gateway or dns) and the system eth0 is but we can’t ping anything from the 10.* network, how can we make it ping/connect to that repository?
Would it need an eth-route config and sysctl parameters like ip forwarding and source routing?

RHCSA7: Task of the day

Allowed time: 10 minutes.
Boot and change the root password before the end of the boot process.

RHCE7: Task of the day

Allowed time: 10 minutes.
Set up a default secure MariaDB database called maria with a user named muser with all privileges.

Follow me on Twitter

Poll for favorite RHEL 7 book

What is your favorite RHEL 7 book to prepare RHCSA & RHCE exams?

View Results

Loading ... Loading ...

Poll for most difficult RHCSA 7 topic

What do you think is the most difficult RHCSA 7 topic?

View Results

Loading ... Loading ...

Poll for most difficult RHCE 7 topic

What do you think is the most difficult RHCE 7 topic?

View Results

Loading ... Loading ...