[Linux] CentOS8에서 웹 서버를 활용한 개인 Yum Repository 서버 구축하기

blog post 

 

이번 포스트에서는 CentOS8 에서 Yum 레포지토리를 구축하고 아파치 웹 서버를 통해 다른 장치에서도 해당 레포지토리에 접근할 수 있도록 구성해 보겠습니다.

 

 

 

1. 패키지 설치

 


우선 서버 구축에 필요한 도구들을 설치합니다.

 

[root@server ~]# yum install httpd createrepo yum-utils 

 

 

 

2. Yum 레포지토리를 위한 디렉토리 및 패키지 구성

 

 

RPM 패키지를 저장하고 관리할 레포지토리용 디렉토리를 생성합니다.

 

[root@server /]# mkdir /var/www/html/repo

 

reposync 명령은 RHEL 계열에서 사용되는 RPM 패키지를 내려받을 수 있도록 개발된 도구입니다. 이 툴을 사용하여 RHEL 계열 yum 레포지토리에서 가장 기본인 BaseOS 레포지토리를 로컬에 구축해 보겠습니다.

 

reposync를 사용하여 아래와 같이 RPM 패키지들을 전부 /var/www/html/repo/에 저장합니다. 물론 레포지토리 디렉토리 위치는 수정되어도 무관합니다.

 

[root@server html]# reposync -m --repoid=BaseOS --newest-only --download-metadata -p /var/www/html/repo/
CentOS-8 - Base                                                        3.7 kB/s | 3.8 kB     00:01    
CentOS-8 - Base                                                        5.5 MB/s |  11 MB     00:01    
저장소에 대한 comps.xml BaseOS 저장된
(1/1666): ModemManager-glib-1.10.4-1.el8.i686.rpm                      2.0 MB/s | 270 kB     00:00    
(2/1666): ModemManager-glib-1.10.4-1.el8.x86_64.rpm                    1.5 MB/s | 264 kB     00:00    
(3/1666): NetworkManager-adsl-1.20.0-5.el8_1.x86_64.rpm                1.8 MB/s | 130 kB     00:00    
(4/1666): NetworkManager-bluetooth-1.20.0-5.el8_1.x86_64.rpm           1.9 MB/s | 153 kB     00:00    

 

현재 포스트 작성 시점으로 1666개의 패키지를 내려받는 것을 볼 수 있습니다.

 

다운로드를 마치면 createrepo 명령을 사용하여 /repo 디렉토리를 yum 레포지토리로 지정합니다. (정확히는 yum 레포지토리 구성에 필요한 메타데이터 정보를 생성한다고 볼 수 있습니다)

[root@server ~]# createrepo -g comps.xml /var/www/html/repo/BaseOS/
Directory walk started
Directory walk done - 1666 packages
Temporary output repo path: /var/www/html/repo/BaseOS/.repodata/
Preparing sqlite DBs
Pool started (with 5 workers)
Pool finished

[root@server ~]#

 

 

이제 앞서 생성한 레포지토리를 실제로 yum 명령으로 사용할 수 있도록 아래와 같이 /etc/yum.repos.d/에 repo 파일을 생성합니다.

 

[root@server repo]# touch /etc/yum.repos.d/myrepo.repo

 

 

생성된 myrepo.repo 파일에 레포지토리 관련 내용을 작성합니다. 이때 baseurl에 방금 만든 /repo/var/www/html/repo/BaseOS/ 디렉토리로 지정합니다.

 

[root@server repo]# vim /etc/yum.repos.d/myrepo.repo
[myrepo]
name=Local Repository
baseurl=file:///var/www/html/repo/BaseOS/
enabled=1
gpgcheck=0

  

 이제 시스템에 등록된 yum 레포지토리 리스트를 갱신해 줍니다.

 

[root@server repo]# yum clean all
[root@server repo]# yum repolist
CentOS-8 - AppStream                                      3.8 MB/s|6.6 MB 00:01
CentOS-8 - Base                                           3.0 MB/s|5.0 MB 00:01
CentOS-8 - Extras                                         4.9 kB/s|4.9 kB 00:01
Extra Packages for Enterprise Linux Modular 8 - x86_64    10 kB/s |116 kB 00:11
Extra Packages for Enterprise Linux 8 - x86_64            181 kB/s|6.2 MB 00:35
Local Repository                                          13 MB/s | 13 kB 00:00
repo id         repo name                                                status
AppStream       CentOS-8 - AppStream                                     5,124
BaseOS          CentOS-8 - Base                                          2,126
*epel           Extra Packages for Enterprise Linux 8 - x86_64           5,219
*epel-modular   Extra Packages for Enterprise Linux Modular 8 - x86_64   0
extras          CentOS-8 - Extras                                        12
myrepo          Local Repository                                         1,664

 

정상적으로 myrepo가 레포지토리 리스트에 등록된 것을 확인할 수 있습니다.

 

 

 

 

잘 동작하는지 간단하게 테스트해 보기위해 "tmux" 설치를 시도해 보겠습니다.

 

[root@server repo]# yum install tmux
마지막 메타 데이터 만료 확인 : 0:01:39 전에 2020년 04월 09일 (목) 오후 04시 33분 12초.
Dependencies resolved.
================================================================================
 Package         Architecture      Version              Repository         Size
================================================================================
Installing:
 tmux            x86_64            2.7-1.el8            BaseOS            317 k

Transaction Summary
================================================================================
설치  1 Package

Total download size: 317 k
Installed size: 781 k
Is this ok [y/N]: 

 

보시다시피 방금 우리가 생성한 myrepo를 통해서 설치되지 않고, 여전히 BaseOS 레포지토리를 통해 받아오기를 시도하고 있는 것을 볼 수 있습니다. 왜냐하면 기존 CentOS-BaseOS 레포지토리를 통해서도 여전히 tmux를 받아올 수 있기 때문이죠.

 

따라서 잠시 기존 CentOS-Base.repo의  BaseOS 레포지토리를 비활성화 해놓고 다시 시도해 보겠습니다. 아래와 같이 enabled를 0으로 변경해 주면 됩니다.

 

[root@server repo]# vim /etc/yum.repos.d/CentOS-Base.repo

[BaseOS]
name=CentOS-$releasever - Base
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=BaseOS&infra=$infra
#baseurl=http://mirror.centos.org/$contentdir/$releasever/BaseOS/$basearch/os/
gpgcheck=1
#enabled를 0으로 변경해줍니다.
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial

 

 

다시 다운로드를 시도해보면 myrepo를 통해서 받아오기를 시도하는 것을 볼 수 있습니다.

 

[root@server yum.repos.d]# yum install tmux
마지막 메타 데이터 만료 확인 : 0:00:31 전에 2020년 04월 09일 (목) 오후 08시 22분 01초.
Dependencies resolved.
============================================================================
 Package        Architecture     Version             Repository        Size
============================================================================
Installing:
 tmux           x86_64           2.7-1.el8           myrepo           317 k

Transaction Summary
============================================================================
설치  1 Package

Total size: 317 k
Installed size: 781 k
Is this ok [y/N]: 

 

 

 

2. 웹 서버 연동

 

 

앞서 myrepo 설치 테스트까지는 아직 로컬 환경입니다. 이제 다른 리눅스 서버에서도 우리가 구축한 yum 레포지토리에 접근할 수 있도록 웹 서버를 연동해 보겠습니다.

 

앞서 이미 httpd는 설치했으므로 넘어가고, vim으로 /etc/httpd/conf/httpd.conf 를 열어보겠습니다.

 

아래와 같이 <Directory "/repo"> ... </Directory> 를 추가 후, httpd 서비스를 재시작 합니다.

 

 

[root@server ~]# vim /etc/httpd/conf/httpd.conf

...생략...

<Directory "/repo">
    Options All Indexes FollowSymLinks
    AllowOverride None
    Require all granted
</Directory>

...생략...

[root@localhost ~]# systemctl restart httpd

 

물론 위 설정은 /var/www/html/에 repo 디렉토리를 추가했다는 전제 하에 설정입니다. 따라서 레포지토리 디렉토리 구조를 다르게 하실 경우, 위의 설정도 변경되어야 합니다. http 웹 서버 설정에 대한 방법까지 설명하기 시작하면 글이 길어지고 주제에도 맞지 않으므로 자세한 설명은 생략하고 넘어가도록 하겠습니다.

 

 

 

 

3. 보안 설정
 
 

 

 

보안 설정은 외부에서 접근할 때 내부 보안 정책에 의해 차단되는 것을 방지하기 위한 부분입니다. 

 

selinux에 의해 내부 레포지토리 접근이 차단될 수 있습니다. 가장 편한 방법은 disabled 하는 것이지만, 추천드리고 싶진 않습니다. disabled 하실 경우 아래와 같이 설정하신 후에 재부팅하셔야 합니다. (이미 disabled 되어있는 경우에는 그냥 넘어가시면 됩니다.

 

 

[root@server ~]# vim /etc/selinux/config

# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
#     enforcing - SELinux security policy is enforced.
#     permissive - SELinux prints warnings instead of enforcing.
#     disabled - No SELinux policy is loaded.
SELINUX=disabled
# SELINUXTYPE= can take one of these three values:
#     targeted - Targeted processes are protected,
#     minimum - Modification of targeted policy. Only selected processes are protected. 
#     mls - Multi Level Security protection.
SELINUXTYPE=targeted

[root@localhost ~]# shutdown -r now

 

 

만약 아래와 같이 selinux를 활성화 하신 경우, 

  

[root@server ~]# getenforce
Enforcing

 

 

 아래와 같이 repo 디렉토리 전체를 80포트가 접근할 수 있도록 적용해 줍니다.

 

[root@server ~]# chcon -Rt httpd_sys_content_t /var/www/html/repo/

 

또 아래와 같이 방화벽도 허용해 줘야 합니다. (selinux 상관없이)

 

[root@server ~]# firewall-cmd --add-service={http,https} --permanent
success
[root@server ~]# firewall-cmd --reload
success

 

웹 서버 때문에 방화벽 서비스 자체를 내리는 것은 추천드리고 싶지 않네요.

 

여기까지 정상적으로 진행되었다면 yum 레포지토리 구축은 모두 마쳤습니다.

 

 

 

 

4. 테스트

 

 

이제 외부에서 방금 구축을 완료한 레포지토리에 접근하고 정상적으로 사용할 수 있는지 확인해 보겠습니다.

 

테스트용 리눅스 pc에서 아래와 같이 yum 레포지토리 서버(192.168.0.19)에 접근할 수 있는지 확인해 봅니다.

 

[root@testpc ~]# ping 192.168.0.19
PING 192.168.0.19 (192.168.0.19) 56(84) bytes of data.
64 bytes from 192.168.0.19: icmp_seq=1 ttl=64 time=0.988 ms
64 bytes from 192.168.0.19: icmp_seq=2 ttl=64 time=0.428 ms
64 bytes from 192.168.0.19: icmp_seq=3 ttl=64 time=0.609 ms

 

다음으로 yum 레포지토리를 설정해야 하는데, 여기에서는 위에서의 로컬테스트 처럼 새로 레포 파일을 만들지 않고, 기존 CentOS-Base.repo 파일을 살짝만 바꿔서 yum 레포지토리 서버로 연결되도록 변경해 보겠습니다.

 

아래와 같이 기존 mirror, baseurl은 주석처리하고 [레포명], baseurl을 변경해 줍니다. (gpgcheck는 일단 신경쓰지 않아도 됩니다)

 

[root@testpc ~]# vim /etc/yum.repos.d/CentOS-Base.repo
[myrepo]
name=CentOS-$releasever - Base
#mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=BaseOS&infra=$infra
#baseurl=http://mirror.centos.org/$contentdir/$releasever/BaseOS/$basearch/os/
baseurl=http://192.168.0.19/repo/BaseOS
gpgcheck=1
enabled=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial

 

 

그리고 yum install로 tmux를 설치해 봅니다. 아래와 같이 myrepo로 연결하여 설치까지 정상적으로 진행되는 것을 볼 수 있습니다.

   

[root@testpc ~]# yum install tmux
Failed to set locale, defaulting to C.UTF-8
CentOS-8 - Base                                  37 MB/s | 2.2 MB     00:00    
Last metadata expiration check: 0:00:01 ago on Thu Apr  9 07:35:18 2020.
Dependencies resolved.
================================================================================
 Package         Architecture      Version              Repository         Size
================================================================================
Installing:
 tmux            x86_64            2.7-1.el8            myrepo            317 k

Transaction Summary
================================================================================
Install  1 Package

Total download size: 317 k
Installed size: 781 k
Is this ok [y/N]: y
Downloading Packages:
tmux-2.7-1.el8.x86_64.rpm                        22 MB/s | 317 kB     00:00    
--------------------------------------------------------------------------------
Total                                            19 MB/s | 317 kB     00:00     
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
  Preparing        :                                                        1/1 
  Installing       : tmux-2.7-1.el8.x86_64                                  1/1 
  Running scriptlet: tmux-2.7-1.el8.x86_64                                  1/1 
  Verifying        : tmux-2.7-1.el8.x86_64                                  1/1 

Installed:
  tmux-2.7-1.el8.x86_64                                                         

Complete!

 

 

만약 위 과정에서 레포지토리를 찾지 못하면? lynx를 통해 해당 레포지토리 페이지에 연결이 되는 상황인지 확인해 봅니다. 아래와 같이 나오면 연결에는 문제가 없는 상황입니다.

 

[root@testpc ~]# lynx http://192.168.0.19/repo/BaseOS

 

 

*참고: lynx 설치 경로가 바뀌었네요. 기존 CentOS7까지는 BaseOS를 통해서 받아왔는데, 8부터는 PowerTools라는 레포지토리를 통해서 진행되네요. 이 레포지토리는 CentOS에서 기본 설정이 비활성입니다. 따라서 아래와 같이 활성화 해줘야 합니다. (enabled=1)

 

[root@testpc ~]# vim /etc/yum.repos.d/CentOS-PowerTools.repo

[PowerTools]
name=CentOS-$releasever - PowerTools
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=PowerTools&infra=$infra
#baseurl=http://mirror.centos.org/$contentdir/$releasever/PowerTools/$basearch/os/
gpgcheck=1
enabled=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial

[root@testpc ~]# yum install lynx
Failed to set locale, defaulting to C.UTF-8
Last metadata expiration check: 0:04:55 ago on Thu Apr  9 08:49:01 2020.
Dependencies resolved.
=============================================================================
 Package               Arch        Version             Repository       Size
=============================================================================
Installing:
 lynx                  x86_64      2.8.9-2.el8         PowerTools      1.6 M
Installing dependencies:
 centos-indexhtml      noarch      8.0-0.el8           AppStream       246 k

Transaction Summary
=============================================================================
Install  2 Packages

Total download size: 1.8 M
Installed size: 6.5 M
Is this ok [y/N]: 

 

 

TAGS.

Comments