최근에 오프라인 환경에서 무언가를 설치해줘야했다. 트랜잭션 단위로 관리가 된다는 점 등 덕분에 개인적으로 rpm으로 설치하는 것보다 yum으로 설치하는 것을 선호하는데, yum은 일반적으로 Offline으로 작동되지 않고, apt 처럼 offline 환경을 위한 툴을 제공해주지 않는다.
"'yumdownloader'라는 것이 있지 않냐?"라고 하기에는 yumdownloader에서 '--resolve' 옵션을 줘도 해당 명령을 실행한 컴퓨터에 필요한 의존 패키지만 다운로드 받기 때문에 거기서 다운로드 받고, 다른 컴퓨터로 가서 설치를 시도하면 그 컴퓨터에는 설치되지 않은 패키지를 찾을려고 하기 때문에 상대 컴퓨터가 Offline 환경이라면 망한거다.
최근에 정말 보안이 강한 곳에 가서 시도를 했었는데, 위 문제로 인해서 추가 패키지 다운로드가 필요했다. 하지만, 개인 장비 반입이 안 되서 당장 해결은 불가능했고, 그런다고 마주했던 에러만 해결한다고 다른 에러를 마주하지 않는다는 보장도 없었다. 그래서 무식하지만, "미러 서버의 전체 데이터를 갖고가자!"라는 생각을 하게 됐다.
개인적으로는 100GB가 넘지 않을까 하는 막연한 걱정이 있었는데, 실제로 다운로드 받아보니 약 33GB더라. 그리고, 각 패키지의 최신 버전만 다운로드 받는다면 약 14GB로 절반이 줄어들었다. 다음 주에 추가 방문하기로 했는데, 일단 이렇게 해결하기로 했다.
그런데, 내가 인터넷에서 찾아봤을 때는 조금 불편한(?) 과정이 있었다. 아래와 같다.
그래서, 아래와 같이 진행해보고자 한다.
우선, fastestmirror 플러그인을 우회하기 위해 Kakao Repo의 정보를 수동으로 추가해주겠습니다. 아래 명령어를 통해 추가합니다.
sudo vi /etc/yum.repos.d/kakao.repo
아래 내용을 추가합니다.
[kakao-base]
name=kakao - Base
baseurl=http://mirror.kakao.com/centos/$releasever/os/$basearch/
gpgcheck=1
enabled=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
[kakao-updates]
name=kakao - Updates
baseurl=http://mirror.kakao.com/centos/$releasever/updates/$basearch
gpgcheck=1
enabled=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
[kakao-extras]
name=kakao - Extras
baseurl=http://mirror.kakao.com/centos/$releasever/extras/$basearch
gpgcheck=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
[kakao-centosplus]
name=kakao - Plus
baseurl=http://mirror.kakao.com/centos/$releasever/centosplus/$basearch
gpgcheck=1
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
특히, CentOS 7의 vi에서는 Insert 모드에서 붙혀넣으셔야 첫 부분이 잘리지 않습니다.
그 다음, 아래 명령어를 통해 repo list를 받아옵니다.
sudo yum repolist
그럼 repo name 부분에 kakao라고 시작하는 repo들이 보이는 것을 확인할 수 있습니다.
아래 명령어를 통해 Repository에 있는 패키지들을 다운로드합니다.
reposync -glm --repoid=kakao* --download-metadata --download_path=(절대경로)
아래 옵션을 보시고, 필요한 경우 변경하시기 바랍니다.
-g: 다운로드 후, GPG 검사가 실패한 파일을 삭제
-l: Yum Plugin 지원을 활성화
-m: comps.xml도 다운로드 합니다. (Groupinstall 명령어 지원을 위함)
-n: 각 패키지의 최신 패키지만 다운로드
-d: 다운로드한 패키지가 로컬에 저장된 패키지보다 최신 버전인 경우, 로컬에 저장되어 있던 패키지 삭제
--repoid(= -r): Repository ID (와일드 카드 지원)
--download-metadata: 모든 메타데이터 다운로드
--download_path(= -p): 파일들을 다운로드할 위치
예시 명령어를 통해 다운로드하셨다면, 디렉터리가 4개가 생성되어 있을텐데요. 아래 명령어를 통해 repodata를 만들어줍니다.
createrepo -g comps.xml (다운로드 받은 경로)/kakao-base
createrepo (다운로드 받은 경로)/kakao-updates
createrepo (다운로드 받은 경로)/kakao-extras
createrepo (다운로드 받은 경로)/kakao-centosplus
-g의 옵션의 경우 groupinstall 명령어 사용을 위해 Group Name 및 Group Package 정보가 들어있는 파일을 정의합니다. Kakao Repo 기준, Base 외의 다른 Repo에는 없기 때문에 에러가 발생하여 다른 디렉터리에서는 -g 옵션을 제외하였습니다.
이제 다운로드 받았으니 Local에 Repo가 있다고 알려줘봅시다. 아래 명령어를 통해 추가합니다.
sudo vi /etc/yum.repos.d/local.repo
아래 내용을 추가합니다.
[repoid]
name=(이름)
baseurl=file://(repo의 절대경로)
gpgcheck=0
enabled=1
다운로드 받은 Repo에 따라서 위 내용을 수정하여 추가합니다.
그 다음, 아래 명령어를 통해 repo list를 받아옵니다.
sudo yum repolist
그럼, 새롭게 정의했던 repo가 등장하게 됩니다. 만일, 다른 컴퓨터로 갖고가고자 할 경우 reposync로 다운로드 했던 경로를 압축해서 갖고 가서 repo를 추가해주면 됩니다.
이렇게 간단하게 yum repo를 sync하는 법을 다루었습니다. 만일, 사내 등에서 내부 yum 서버를 구축하고자 하는 경우 웹 서버를 구축하고, cron 등으로 주기적으로 reposync, createrepo 작업을 해주면 됩니다.
감사합니다.