인터넷이 되는 서버에서 RPM 을 모아 폐쇄망으로 들고 들어갔는데, 설치 단계에서 의존성이 풀리지 않는다.
문제: package nfs-utils-1:2.5.4-34.el9.x86_64 from LocalRepo_BaseOS requires libnfsidmap,
but none of the providers can be installed
- package sssd-common-2.9.6-4.el9.x86_64 from @System requires
(sssd-nfs-idmap = 2.9.6-4.el9 if libnfsidmap), but none of the providers can be installed
- nothing provides libgssapi_krb5.so.2 needed by libnfsidmap-1:2.5.4-34.el9.i686
- nothing provides libldap.so.2 needed by libnfsidmap-1:2.5.4-34.el9.i686
- nothing provides libc.so.6(GLIBC_2.34) needed by libnfsidmap-1:2.5.4-34.el9.i686
메시지의 마지막 줄들이 전부 i686 을 가리킨다고 해서 32 비트 패키지가 원인인 것은 아니다. 순서는 이렇다.
x86_64 후보를 찾는다
-> 저장소에 x86_64 libnfsidmap 이 없다
-> 차선으로 i686 후보를 본다
-> i686 의존성(glibc, krb5, openldap)도 저장소에 없다
-> i686 쪽 실패 메시지만 잔뜩 출력된다
즉 필요한 아키텍처의 패키지가 저장소에 아예 없는 것이 원인이고, exclude=*.i686 을 넣어도 증상은 그대로다. 메시지에서 눈여겨볼 줄은 맨 위의 requires libnfsidmap, but none of the providers can be installed 쪽이다.
첫 줄 다음에 나오는 이 형태는 RPM 의 조건부(부울) 의존성이다.
(sssd-nfs-idmap = 2.9.6-4.el9 if libnfsidmap)
"시스템에 libnfsidmap 이 들어오면 sssd-nfs-idmap 도 같은 버전으로 있어야 한다" 는 뜻이다. libnfsidmap 만 받아 오면 sssd-nfs-idmap 때문에 다시 막히므로 짝이 되는 패키지를 함께 받아야 한다. 이미 설치된 sssd-common 버전과 정확히 같은 버전이어야 한다.
온라인 RHEL 서버(서브스크립션이 살아 있는 쪽)에서 의존성을 풀어 내려받는다.
dnf download --resolve --alldeps --arch=x86_64 \
--destdir=/var/tmp/local-repo \
nfs-utils libnfsidmap sssd-nfs-idmap
--resolve 는 아직 설치되지 않은 의존성을, --alldeps 는 이미 설치된 것까지 포함해 내려받는다. 반출용 저장소를 만들 때는 대상 서버에 무엇이 깔려 있을지 모르므로 --alldeps 쪽이 안전하다.
32 비트를 섞고 싶지 않으면 아키텍처를 고정한다.
dnf download --resolve --alldeps --archlist=x86_64 --exclude='*.i686' ...
받은 뒤 메타데이터를 다시 만든다.
createrepo_c --update /var/tmp/local-repo
반출용 저장소에 32 비트가 섞여 들어오면 대상 서버에서 계속 잡음이 난다. dnf.conf 에서 전역으로 뺀다.
[main]
exclude=*.i686
저장소 정의에도 같이 넣어 이중으로 막는다.
[LocalRepo_BaseOS]
name=Local BaseOS
baseurl=file:///var/tmp/local-repo
enabled=1
gpgcheck=0
exclude=*.i686
RHEL 의 BaseOS · AppStream RPM 은 공개 미러로 배포되지 않는다. 합법적인 경로는 둘뿐이다.
dnf download 로 받아 옮긴다.[RHEL-AppStream-ISO]
name=RHEL AppStream (ISO)
baseurl=file:///mnt/rhel/AppStream
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release
호환 배포판(Rocky · Alma) 미러에서 가져와 섞는 것은 지원 조건을 깨뜨린다.
Minimal ISO 에는 AppStream 의 일부만 들어 있다. 위 오류가 나면 먼저 Full ISO 인지 확인한다.
수십 기가를 USB 로 옮길 때 파일 크기 제한에 걸리면 나눠 압축한다.
tar czf - local-repo | split -b 15G - local-repo.tgz.part-
cat local-repo.tgz.part-* | tar xzf -
split -n <N> 은 입력 크기를 알아야 하므로 파이프에서는 쓸 수 없다. 크기 기준(-b)을 쓴다.