🚀 요약
SUMMARY
폐쇄망 GPU 노드에 NVIDIA 드라이버를 오프라인으로 깔며 두 가지를 정리했다. RHEL 계열에선
nvidia-driver만으로는 부족하고cuda-drivers메타패키지까지 설치한 뒤 재부팅해야 GPU가 잡혔다. 그리고 드라이버 커널 모듈을 빌드하려면 실행 중인 커널에 맞는kernel-devel·kernel-headers가 필요한데, 폐쇄망에선 커널 버전마다 이 패키지를 미러에 갖추는 게 골칫거리다. 다만 precompiled 모듈 경로 덕에 헤더 없이도 되는 경우가 많았다.
관건은 드라이버 rpm 하나가 아니라, 커널에 맞는 모듈이 실제로 올라오느냐였다.
1. RHEL: cuda-drivers까지 + 재부팅
처음엔 nvidia-driver만 설치했는데 GPU가 안 잡혔다. cuda-drivers 메타패키지까지 설치하고 재부팅하니 그제야 nvidia-smi가 카드를 인식했다. cuda-drivers가 드라이버 본체·커널 모듈·유저스페이스 라이브러리 의존을 함께 끌어와 정합을 맞춰주기 때문으로 보인다. 재부팅이 필요한 건 새 커널 모듈을 적재하고 기존(nouveau 등) 모듈을 걷어내야 하기 때문이다.
오프라인이라 이 패키지들과 그 의존성을 전부 로컬 저장소(미러)에 미리 받아두고 dnf가 그 저장소만 보게 해서 설치했다.
2. kernel-devel / kernel-headers 문제
NVIDIA 커널 모듈을 DKMS로 빌드하려면 실행 중인 커널에 정확히 맞는 kernel-devel·kernel-headers가 있어야 한다. 폐쇄망에서 이게 성가시다. 노드마다 커널 버전이 조금씩 다르거나 업데이트되면, 그 버전에 딱 맞는 헤더 패키지를 미러에 갖춰둬야 하는데, 버전이 어긋나면 빌드가 실패한다.
그런데 실제로는 헤더 없이도 여태 예외 없이 설치가 됐다. 이유를 정리하면, RHEL 계열엔 NVIDIA가 precompiled(미리 빌드된) 커널 모듈 스트림을 제공해서, 실행 커널에 맞는 precompiled 모듈이 저장소에 있으면 DKMS 소스 빌드를 안 거치고 그 모듈을 그냥 설치한다. 이 경로를 타면 kernel-devel이 필요 없다. 반대로 precompiled가 그 커널에 없으면 DKMS로 떨어지고, 그때 헤더가 없으면 막힌다.
그래서 실무 방침은 이렇게 잡았다.
- 노드 커널 버전을 고정·통일해 두면, 그 커널용 precompiled 모듈(또는 헤더)만 미러에 갖추면 된다. 버전이 제각각이면 관리 대상이 폭발한다.
- 안전하게는 드라이버 + 대응 커널의 precompiled 모듈(없으면 kernel-devel/headers)을 세트로 미러에 넣는다.
3. Ubuntu
Ubuntu 계열은 접근이 조금 다르다. 로컬 apt 저장소(또는 .deb)로 드라이버 패키지를 넣고, 마찬가지로 DKMS가 커널 모듈을 빌드하므로 실행 커널에 맞는 linux-headers-$(uname -r)가 필요하다. .run 인스톨러로 직접 설치하는 방법도 있지만, 패키지 관리 밖으로 나가 추적이 어려워지므로 폐쇄망에선 로컬 저장소 방식을 선호했다. 여기서도 관건은 동일하다 — 실행 커널에 맞는 헤더를 오프라인에 갖췄는가.