RHEL のリポジトリのローカルミラーを作成

NW 構成などが原因で、RHEL のリポジトリに接続できるホストが限られていて yum コマンドが出来ないホストが存在する場合がある。
そのような場合、接続可能なホスト上に RHEL のリポジトリのミラーを作成し、接続不可能なホストはミラーを参照することで yum コマンドを実行できるようになる。

# 前提条件
接続可能なホストをホスト1、接続不可能なホストをホスト2とする。
ホスト1については、RHEL7 で Red Hat Subscription Manager によるシステム登録、サブスクライブが完了し yum ができる状態となっていることとする。

また、本手順では RHEL7 の通常のリポジトリとなる「rhel-7-server-rpms」のミラーを作成する。
同一ホストで異なる OS のリポジトリのミラーは作成できないので RHEL6 のリポジトリのミラーを作成する場合は別途ホストを用意すること。


# 1.パッケージのインストール (ホスト1の作業)
```shell-session
$ yum install yum-utils createrepo httpd
```
# 2.リポジトリのコピー (ホスト1の作業)
```shell-session
$ reposync --downloadcomps --download-metadata --newest-only -a x86_64 -r rhel-7-server-rpms -d -p /var/repos/

No Presto metadata available for rhel-7-server-rpms
(1/5285): 389-ds-base-libs-1.3.7.5-21.el7_5.x86_64.rpm                                      | 696 kB  00:00:01
(2/5285): 389-ds-base-1.3.7.5-21.el7_5.x86_64.rpm                                           | 1.7 MB  00:00:02
::
(5284/5285): zziplib-0.13.62-5.el7.x86_64.rpm                                               |  81 kB  00:00:00
(5285/5285): zsh-5.0.2-28.el7.x86_64.rpm                                                    | 2.4 MB  00:00:04
You have new mail in /var/spool/mail/root
$ 
※--newest-only オプションで各パッケージの最新 ver のみコピー
```
# 3.メタデータの作成のコピー (ホスト1の作業)
```shell-session
$ createrepo -s sha256 --checkts --update --workers=2 -g /var/repos/rhel-7-server-rpms/comps.xml /var/repos/rhel-7-server-rpms
Could not find valid repo at: /var/repos/rhel-7-server-rpms
Spawning worker 0 with 2643 pkgs
Spawning worker 1 with 2642 pkgs
Workers Finished
Saving Primary metadata
Saving file lists metadata
Saving other metadata
Generating sqlite DBs
Sqlite DBs complete
$ 
$ modifyrepo /var/repos/rhel-7-server-rpms/productid /var/repos/rhel-7-server-rpms/repodata/
Wrote: /var/repos/rhel-7-server-rpms/repodata/productid.gz
           type = productid
       location = repodata/…-productid.gz
       checksum = …
      timestamp = …
  open-checksum = …
Wrote: /var/repos/rhel-7-server-rpms/repodata/repomd.xml
$ 
$ cd /var/repos/rhel-7-server-rpms
$ gunzip -c $(ls -t *updateinfo.xml.gz) > updateinfo.xml
$ modifyrepo /var/repos/rhel-7-server-rpms/updateinfo.xml /var/repos/rhel-7-server-rpms/repodata/
Wrote: /var/repos/rhel-7-server-rpms/repodata/updateinfo.xml.gz
           type = updateinfo
       location = repodata/…-updateinfo.xml.gz
       checksum = …
      timestamp = …
  open-checksum = …
Wrote: /var/repos/rhel-7-server-rpms/repodata/repomd.xml
```

# 4.HTTP の設定 (ホスト1の作業)
```shell-session
$ vi /etc/httpd/conf.d/repos.conf
```
```shell-session
<Directory /var/repos>
  Options Indexes FollowSymLinks
  AllowOverride None
  <IfModule mod_authz_core.c>
    Require all granted
  </IfModule>
  <IfModule !mod_authz_core.c>
    Order allow,deny
    Allow from all
  </IfModule>
</Directory>
Alias /repos /var/repos
```
```shell-session
$ systemctl restart httpd
```

# 5.クライアントの yum 設定 (ホスト2の作業)
```shell-session
$ vi /etc/yum.repos.d/test.repo
```
```shell-session
[local-myrepository]
name=My repository
baseurl=http://<ホスト1の IP アドレス>/repos/rhel-7-server-rpms
gpgcheck=0
enabled=1
```

# 参考情報
How to synchronize repository on system registered to CDN via subscription-manager
https://access.redhat.com/articles/1355053

How to create a local mirror of the latest update for Red Hat Enterprise Linux 5, 6, 7 without using Satellite server?
https://access.redhat.com/solutions/23016

How to create a local repository for updates
https://access.redhat.com/solutions/9892