RHEL 리눅스를 사용하는 경우 Red hat 레포지토리에서 원하는 패키지를 편리하게 설치하고 사용할 수 있다. 레포지토리에서 패키지를 가져오는 과정이 어떻게 이루어지는지 궁금하였고, 해당 부분을 직접 설정하여 원하는 패키지만 모아놓은 사설 레포지토리를 생성하고 해당 레포지토리를 외부에서도 사용이 가능하도록 해보고 싶었다.
또한 보안을 목적으로 외부와 단절되어 있는 서버인 경우 외부와 인터넷을 통해 통신할 수 없기 때문에 레포지토리를 사용할 수 없는 환경일 수 있는데, 이러한 상황에서도 위의 과정을 알고 있으면 도움이 될 수 있을 것이다.
(* 물론 클라우드 환경에서는 private 망에 있는 서버도 NAT 게이트웨이를 통해 인터넷 액세스가 가능하지만...)
/etc/yum.repos.d
위의 경로에 *.repo 파일이 존재하며, 해당 파일에는 아래와 같이 레포지토리에 대해 정의 되어 있다.
redhat-rhui-beta.repo.disabled
redhat-rhui-client-config.repo
redhat-rhui.repo
[rhel-9-baseos-rhui-rpms]
name=Red Hat Enterprise Linux 9 for $basearch - BaseOS from RHUI (RPMs)
mirrorlist=https://rhui.REGION.aws.ce.redhat.com/pulp/mirror/content/dist/rhel9/rhui/$releasever/$basearch/baseos/os
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release
sslverify=1
sslclientkey=/etc/pki/rhui/content-rhel9.key
sslclientcert=/etc/pki/rhui/product/content-rhel9.crt
sslcacert=/etc/pki/rhui/cdn.redhat.com-chain.crt
RPM은 리포지토리를 지원하지 않으므로 패키지를 설치하려면 전체 패키지 파일 이름과 위치가 필요합니다.RPM은 설치된 패키지의 내부 데이터베이스를 보관하며 나중에 패키지 이름을 사용하여 설치된 패키지를 관리할 수 있도록 합니다.
반면 YUM으로 패키지를 설치하려면 패키지 이름만 필요하고 패키지 위치는 필요하지 않습니다.이 도구는 /etc/yum.repos.d/ 디렉터리에서 repo 파일에 나열된 리포지토리를 검색하고 사용 가능한 최신 패키지 버전을 설치합니다.
따라서 기본적으로 Package 관리는 yum을 통해서 진행하는 것이 효율적이며 어떻게 yum을 통해 사용되는 패키지 관리 명령어는 "yum-utils" 패키지에 있기 때문에 해당 패키지를 설치해준 다음 간단하게 "yumdownloader" 명령어를 사용하여 특정 패키지를 다운로드하여 설치해보자.
$ yumdownloader vim
---
설치
---
$ rpm -ivh vim-enhanced-8.2.2637-20.el9_1.x86_64.rpm <--rpm으로 설치시 해당 패키지 이름 및 위치 즉 파일이 필요함!
or
$ yum localinstall vim-enhanced-8.2.2637-20.el9_1.x86_64.rpm
---
특정 패키지 다운로드시 --resolve 옵션을 통해 dependency 패키지를 함께 다운로드
---
$ yumdownloader --resovle gcc
---
설치
---
$ yum localinstall *.rpm
Package Arch Version Repository Size
==========================================================================
Installing:
binutils x86_64 2.35.2-24.el9 @commandline 4.6 M
binutils-gold x86_64 2.35.2-24.el9 @commandline 738 k
cpp x86_64 11.3.1-2.1.el9 @commandline 11 M
elfutils-debuginfod-client
x86_64 0.187-5.el9 @commandline 41 k
gcc x86_64 11.3.1-2.1.el9 @commandline 32 M
glibc-devel x86_64 2.34-40.el9_1.1 @commandline 47 k
glibc-headers x86_64 2.34-40.el9_1.1 @commandline 547 k
kernel-headers x86_64 5.14.0-162.23.1.el9_1 @commandline 3.5 M
libmpc x86_64 1.2.1-4.el9 @commandline 65 k
libpkgconf x86_64 1.7.3-9.el9 @commandline 38 k
libxcrypt-devel x86_64 4.4.18-3.el9 @commandline 32 k
make x86_64 1:4.3-7.el9 @commandline 542 k
pkgconf x86_64 1.7.3-9.el9 @commandline 45 k
pkgconf-m4 noarch 1.7.3-9.el9 @commandline 16 k
pkgconf-pkg-config x86_64 1.7.3-9.el9 @commandline 12 k
Transaction Summary
==========================================================================
Install 15 Packages
Total size: 53 M
Installed size: 149 M
Is this ok [y/N]:
gcc 패키지 이외에 관련된 dependency 패키지까지 모두 정상적으로 설치가 되었다.
---
1. yum install 로 패키지 설치 명령을 실행합니다.
2. /etc/yum.repos.d/ 디렉터리의 여러 설정파일들 및 CentOS-Base.repo 파일을 참고하여 인터넷상의 패키지 저장소 서버 주소를 얻습니다.
3 ~ 4. 패키지 목록을 저장소 서버로부터 얻습니다.(실제 패키지는 받지 않고 목록만 가져옴)
5. 가져온 패키지 목록을 터미널에 출력하고 설치할 것인지 여부(Y/N)를 묻습니다.
6. Y를 입력하면 패키지를 다운로드하여 자동으로 설치합니다. 만약 yum install -y 옵션을 사용했다면 여부를 묻지 않고 모든 과정을 자동으로 진행합니다.
(* 출처 : https://dololak.tistory.com/332)
외부에 존재하는 레포지토리 전체를 "reposync" 명령어를 통해 로컬에 다운로드 한다.
reposync하는 시점에 해당 레포지토리에 release된 패키지들은 다운로드한다.
$ mkdir testrepo
$ cd testrepo
$ reposync -r rhel-9-baseos-rhui-rpms
$ tree | more
[root@ip-172-31-7-80 testrepo]# tree | more
.
└── rhel-9-baseos-rhui-rpms
└── Packages
├── a
│ ├── accel-config-3.4.2-2.el9.i686.rpm
│ ├── accel-config-3.4.2-2.el9.x86_64.rpm
│ ├── accel-config-3.4.6.3-1.el9.i686.rpm
│ ├── accel-config-3.4.6.3-1.el9.x86_64.rpm
│ ├── accel-config-libs-3.4.2-2.el9.i686.rpm
│ ├── accel-config-libs-3.4.2-2.el9.x86_64.rpm
│ ├── accel-config-libs-3.4.6.3-1.el9.i686.rpm
│ ├── accel-config-libs-3.4.6.3-1.el9.x86_64.rpm
│ ├── acl-2.3.1-3.el9.x86_64.rpm
│ ├── acpica-tools-20210604-3.el9.x86_64.rpm
이렇게 다운로드가 완료된 패키지들은 Packages 라는 디렉터리 안에 저장이 되어 있다.
reposync을 통해 다운로드한 패키지들을 rpm / localinstall 명령어를 사용하여 설치는 가능하지만 패키지 관리자인 yum을 이용해서 dependency까지 설치할 수는 없는 상태이다. (* 단순히 레포지토리에 있는 패키지들만 가져온 상태라고 생각하면 된다.) 때문에 해당 패키지들에 대해서 "repodata"를 생성해야지 사설 레포지토리 로 사용이 가능하다. repodata를 생성하기 위해서는 명령어 createrepo를 사용해야하며, 이를 위해 아래 명령어를 통해 해당 패키지를 설치해준다.
$ yum install createrepo -y
이후 아래의 경로로 이동하여 레포지토리의 패키지 파일이 존재하는 경로 즉, repodata를 생성할 위치로 이동 후 아래와 같이 createrepo를 이용하여 작업을 수행해준다.
$ [root@ip-172-31-7-80 rhel-9-baseos-rhui-rpms]# pwd
/root/testrepo/rhel-9-baseos-rhui-rpms
$ [root@ip-172-31-7-80 rhel-9-baseos-rhui-rpms]# ls
Packages
$ [root@ip-172-31-7-80 rhel-9-baseos-rhui-rpms]# createrepo .
Directory walk started
Directory walk done - 2926 packages
Temporary output repo path: ./.repodata/
Preparing sqlite DBs
Pool started (with 5 workers)
Pool finished
$ [root@ip-172-31-7-80 rhel-9-baseos-rhui-rpms]# ls
Packages repodata
아래와 같이 /etc/yum.repos.d 경로 밑에 repo 파일을 생성합니다.
[root@ip-172-31-7-80 yum.repos.d]# cat test.repo
[private-testrepo]
name="TEST rhui base - testropo"
baseurl=file:////root/testrepo/rhel-9-baseos-rhui-rpms
gpgcheck=0
enable=1
그리고 나서 repolist 명령어를 통해 레포지토리가 정상적으로 사용가능한지 확인합니다.
[root@ip-172-31-7-80 yum.repos.d]# yum repolist
repo id repo name
private-testrepo TEST rhui base - testropo
내가 만든 사설 레포지토리를 다른 클라이언트에서 사용하고 싶다면 해당 레포지토리를 간단하게 httpd을 사용해 다른 클라이언트에서 이를 사용할 수 있도록 해주면 된다.
$yum install httpd
$cd /var/www/html
$mkdir repo <---repo폴더 생성
$cp Packages /var/www/html/repo
$Createrepo . <- /var/www/html 경로에서 다시 repodata를 만들어준다.
http://인스턴스공인IP/repo 로 접속 - (e.g. http://3.34.43.6/repo/)
# cat test.repo
[private-testrepo]
name="TEST rhui base - testropo"
baseurl=http://3.34.43.6/repo
gpgcheck=0
enable=1
$yum list & yum repolist 으로 확인 repo id repo name
private-testrepo TEST rhui base - testropo
이상으로 평소 관심 있었던 리눅스의 레포지토리와 패키지가 어떻게 관리 되는지 정리해보았다. 인터넷이 연결되지 않은 환경에서 cd등을 통해 특정 레포지토리만 다운로드받아 해당 레포지토리 또는 필요한 패키지만 수동으로 설치할 때 위의 방법을 알고 있으면 도움이 될 수 있을 것 같다.
글을 작성하면서 느낀부분이지만, 단순한 것이라도 이렇게 확실하게 하나씩 짚고 넘어가는 부분이 많은 도움이 된다는 것을 새삼 느끼었다. 또한 글을 작성하고 단발성으로 끝나는 것이 아니라 계속해서 관심을 갖고 업데이트 및 수정을 해주는 작업을 통해 내가 알고있는게 온전히 내것으로 만들려는 노력을 해보아야 겠다.