LabHub

RHEL 계열 관리 · 로컬 저장소 구축 · 이론

createrepo_c 와 repodata

LabHub 에서 이어서 보기

한 줄 요약

createrepo_c 는 rpm 디렉터리를 훑어 repodata/ 를 만든다. 그 안의 repomd.xml 이 다른 메타데이터 파일들을 가리키는 목차다.

왜 이게 필요했나

디렉터리에 RPM 파일을 복사하는 것만으로 dnf 저장소가 되지는 않는다. dnf는 매번
모든 패키지를 열어 보지 않고 repodata의 버전·의존성·파일 목록을 조회한다. 따라서
패키지를 추가하고도 메타데이터를 갱신하지 않으면 서버 파일과 클라이언트가 보는
목록이 달라진다. 이 차이를 알면 캐시·권한 문제와 저장소 생성 누락을 구분할 수 있다.

어떻게 동작하나

dnf install -y createrepo_ccreaterepo_c /srv/repo/labhubls -1 /srv/repo/labhub/repodata/# repomd.xml# <checksum>-primary.xml.gz# <checksum>-filelists.xml.gz# <checksum>-other.xml.gz

| 파일 | 내용 |
| --- | --- |
| repomd.xml | 목차. 각 메타데이터의 위치·체크섬·시각 |
| primary | 이름, 버전, 의존성, 요약 |
| filelists | 패키지가 담은 모든 파일 목록 |
| other | changelog |

dnf provides '*/nginx.conf' 같은 파일 기반 검색이 되는 이유가 filelists 다.

파일 이름 앞의 체크섬 접두는 --unique-md-filenames(기본값)의 결과다. 중간 프록시나 CDN 이 오래된 사본을 돌려주는 사고를 막는다. 파일 이름이 내용에 따라 바뀌므로 캐시가 헷갈릴 수 없다.

주요 옵션

| 옵션 | 문서상 동작 |
| --- | --- |
| --update | "파일 크기와 mtime 기준으로 변경되지 않은 rpm 의 기존 메타데이터를 재사용" |
| --workers N | rpm 을 읽을 워커 수 |
| -g, --groupfile | comps 그룹 파일 포함 |
| -s, --checksum | repomd 와 패키지 체크섬 종류. 기본 sha256 |
| --compress-type | bz2, gz, zck, zstd, xz |
| -i, --pkglist | 포함할 패키지 목록 파일 |
| --retain-old-md N | 옛 repodata 보존 개수 |
| -x, --excludes | 제외 패턴 |

-d/--database(sqlite 생성)는 deprecated 다. 오래된 절차서에서 이 옵션을 보면 지워도 된다.

--pkglist 를 매니페스트와 연결하는 것이 좋은 관행이다. 반입 매니페스트를 그대로 pkglist 로 쓰면 목록과 실제 저장소가 어긋나는 사고를 구조적으로 막는다.

갱신

패키지를 추가한 뒤에는 반드시 메타데이터를 다시 만든다.

createrepo_c --update /srv/repo/labhubdnf clean expire-cachednf repolist

--update 를 빼먹는 것이 폐쇄망 최다 신고의 원인 1위다. 파일은 눈에 보이는데 dnf 는 모른다.

repo 파일과 검증

[labhub-local]name=LabHub local (snapshot 2026-08-20)baseurl=file:///srv/repo/labhubenabled=1gpgcheck=0metadata_expire=-1

동작 확인 3종.

dnf repolist -vdnf repoclosure --repo=labhub-localdnf install --assumeno <패키지>

dnf repoclosure저장소 안에서 해결되지 않는 의존성을 가진 패키지를 나열한다. 반입 전 게이트로 쓰기에 가장 좋은 도구다.

createrepo_c /srv/bundle/rpmsdnf repoclosure --repofrompath=bundle,/srv/bundle/rpms --repo=bundle

--repofrompath.repo 파일을 만들지 않고 임시로 저장소를 지정한다. 검증 스크립트에서 유용하다.

오래된 패키지 정리

dnf repomanage --old --keep 2 /srv/repo/labhubdnf repomanage --old --keep 2 /srv/repo/labhub | xargs -r rm -vcreaterepo_c --update /srv/repo/labhub

몇 개를 남길지가 곧 롤백 가능 범위다. 반입 주기가 월 1회이고 3개를 남기면 약 3개월치 롤백이 가능하다.

현장에서 만나는 모습

저장소 표시 이름에 스냅샷 날짜. name=... (snapshot 2026-08-20) 처럼 적어 두면 6개월 뒤 dnf repolist -v 한 줄로 시점을 특정할 수 있다.

다음 실습에서 할 것

rpm 을 모아 createrepo_c 로 저장소를 만들고, .repo 파일을 작성하고, 그 저장소만 활성화해 설치하고, 패키지를 추가한 뒤 --update 로 갱신한다.