System/Linux

[Linux] Local Repository 만들기

Yoonsoo Park 2024. 10. 16. 14:26

1. Repository가 뭐야? Local Repository는 왜 필요해?

 Repositoryrpm 기반의 Linux 소프트웨어 패키지들이 저장된 저장소이다. Repository는 일반적으로 외부의 서버에 존재하기 때문에 /etc/yum.repos.d 디렉토리에 저장된 정보를 기반으로 원격으로 rpm 패키지를 가져오게 된다. Linux를 사용하다 보면 rpm 명령어를 이용해 소프트웨어 패키지를 설치하는 경우도 있지만,  rpm 명령어를 사용할 경우, 의존성 문제를 직접 해결해야 하기 때문에, 네트워크가 된다면 dnf(yum)을 사용해 패키지를 설치하는 경우가 훨씬 편리하다는 것을 알 수 있다. 

 

 그렇다면 사내 폐쇄망 같은 상황에서는 그냥 rpm으로 할 수 밖에 없는 것일까? 패키지를 다운 받아야 하는 상황에서만 살짝 네트워크를 연결하면 안 될까 하는 생각을 하는 사람도 있겠지만, 이는 내부망의 보안을 매우 취약하게 만드는 행위이다. 이러한 상황에서 dnf(yum)을 사용할 수 있게 만들어주는 방법이 내부에 repository를 구축하는 것이다. 따라서 local repository를 구축하는 이유는 편리성과 보안성 때문이라고 볼 수 있다.

< /etc/yum.repos.d >

 

2. Local Repository 구축 방법

**Rocky Linux 9.4를 기반으로 한 포스팅입니다

 

1) Rocky Linux iso dvd 파일 마운트

VM을 사용한다면, 기본적으로 OS를 설치하기 위한 iso 파일을 가지고 있을 것이다(없다면 다운 받도록 하자).

마운트 포인트(디렉토리)를 생성한 뒤, iso 파일을 마운트 한다.

mkdir /mnt/rockyiso
mount /dev/sr0 /mnt/rockyiso

 

2) local repository로 사용할 디렉토리를 생성하고, 다운 받은 iso 파일을 복사해 준다 

mkdir /rockyiso/local-repo
cp -a /mnt/dvd/* /rockyiso/local-repo

 

*iso 파일의 용량이 크기 때문에 시간이 조금 소요된다.

 

3) 디렉토리가 repository로 작동할 수 있게 메타 데이터를 받아준다

createrepo /rockyiso/local-repo/

**
만약 createrepo 명령어가 없다고 뜬다면 dnf install createrepo 또는 rpm을 이용해서 패키지를 설치해줘야 한다.

 

4) 기존의 설정 파일을 백업해 두고, local repository 설정 파일 추가해 준다

먼저 기존에 존재하는 repository 파일들을 백업(정리)해준다.

mkdir repo_backup
mv *.repo ./repo_backup/

 

/etc/yum.repos.d/ 디렉토리에 local.repo 라는 설정 파일을 추가해 주고 다음과 같이 설정해 준다.

vi /etc/yum.repos.d/local.repo

-- 파일 내용 --
[LocalRepo]
name=Local Repository  // repository 이름
baseurl=file:///rockyiso/local-repo  // 패키지와 repodata가 존재하는 위치
enabled=1  // 0(비활성화), 1(활성화)
gpgcheck=0  // GPG 서명 사용 여부

**'bad id for repo'라는 오류가 뜨면, [ ] 사이의 repo id의 형식이 잘못된 것이다. repo id는 알파벳, 숫자, 일부 특수 문자(-, _, .)만 가능하다(스페이스가 있는지 꼭 확인하자).

5) local repository가 정상적으로 동작하는지 확인해 준다

dnf clean all  // yum 캐시 데이터 삭제
dnf repolist  // repository 등록 여부 확인

dnf install [다운 받을 패키지]  // 정상적으로 실행되는지 확인해본다

 

 

**centOS를 사용하는 경우

Rocky Linux와 설치 방법은 비슷하나, 다음과 같은 오류가 뜨는 경우가 있다.

this system is not registered with an entitement server. you can use 'rhc'or 'subscription-manager' ro register

 

해당 문제는 시스템이 Red Hat과 관련된 리포지토리나 서비스를 참조하려고 할 때 발생하는 문제로 두 가지 방법을 통해 해결할 수 있다. 

1) /etc/yum.repos.d/ 디렉토리에서 redhet.repo 파일을 삭제하거나, 비활성화(enable=0)해준다

2) dnf remove subscription-manager 로 subscription-manager을 제거해 준다.

 

 

3. 같은 네트워크 내의 서버들이 Local Repository를 사용 가능하게 만들어보자!

1. HTTP를 통해 패키지를 받아올 것이기 때문에 HTTP 데몬 패키지 설치 및 실행

dnf install httpd
systemctl start httpd
systemctl enable httpd

 

2. Local Repository의 경로를 바꿔준다

다른 서버에서 local repository를 이용할 수 있게 하기 위해, 웹 서비스에서 document root인 /var/www/html/ 디렉토리로 local-repo 디렉토리의 경로를 변경해준다.

mv /rockyiso/local-repo/ /var/www/html/

 

3. local repository 설정 파일을 추가/변경 해준다

<local repository>

[LocalRepo]
name=Local Repository  // repository 이름
baseurl=file:///var/www/html/local-repo  // 패키지와 repodata가 존재하는 위치
enabled=1  // 0(비활성화), 1(활성화)
gpgcheck=0  // GPG 서명 사용 여부

 

<클라이언트 서버>

/etc/yum.repos.d/ 디렉토리 안에 다음과 같이 local repository 설정 파일을 추가

mkdir ./backup_repo/
mv *.repo ./backup_repo/

vi local.repo

##파일 내용##
[LocalRepo]
name=Local Repository  // repository 이름
baseurl=http://<local repository의 IP 주소>/local-repo/  // 패키지와 repodata가 존재하는 위치
enabled=1  // 0(비활성화), 1(활성화)
gpgcheck=0  // GPG 서명 사용 여부

ex) 
baseurl=http://10.12.0.99/local-repo/

 

4. 클라이언트 서버에서 local repository가 잘 등록됐는지 확인해본다

dnf clean all
dnf repolist
dnf install <다운 받을 패키지>

 

** Failed to download metadata for repo 'localrepo': cannot download repomd.xml 과 같은 오류가 뜨는 경우가 종종 발생한다. 이때 다음 사항들을 확인해서 해결해보자

1. metadata가 잘 설치되어 있는지 확인(local repository에 확인)

ls /var/www/html/local-repo/repodata

createrepo /var/www/html/local-repo

 

2. 방화벽 또는 SELinux 확인

##방화벽 끄기##
systemctl status firewall
systemctl stop firewall 

##SELinux 끄기##
getenforce
setenforce 0

*실습을 용이하게 하기 위해 둘 다 끄지만, 실무에서는 보안을 매우 취약하게 만들기 때문에 끄는 것이 아닌, 추가적인 설정을 해주는 것이 옳다.  

 

 

 

힘들지만 오늘도 해낸 나를 위한 한 마디,

"살아야 할 이유가 있는 사람은 모든 어려움을 어떻게 해서든 견뎌낸다", 프리드리히 니체

 

"삶의 목표를 항상 견지하고, 꿋꿋이 살아가자"

'System > Linux' 카테고리의 다른 글

[Linux] HTTP  (2) 2024.10.17
[Linux] e-mail(Mail Server)  (8) 2024.10.09
[Linux] FTP  (1) 2024.10.07
[Linux] DNS part 2  (2) 2024.10.03
[Linux] DNS part 1  (0) 2024.10.01