폐쇄망 GPU 드라이버 반입 설치 · NVIDIA 드라이버 패키지 의존성 해석 · 실습
의존성 그래프 풀기
목표
반입했다고 가정한 패키지 묶음에서 의존성 그래프를 풀고, 번들 안에서 해결되지 않는 의존을 찾아내고, 설치 순서를 산출합니다.
왜 중요한가
폐쇄망에서 가장 비싼 실수는 "반입했는데 의존성이 모자라 다시 나가는 것" 입니다. 반입 심의가 하루에 한 번이면 왕복 한 번이 하루입니다. 그래서 반입 전에 번들이 자기 안에서 닫히는지(closure) 확인해야 합니다. 그리고 Provides 관계를 모르면 "libcuda1 이 저장소에 없다" 며 존재하지 않는 패키지를 찾아 헤매게 됩니다.
/opt/fixtures/gpu-airgap/src/ 에는 1차 반입분 소스 트리가 들어 있습니다. 실제 NVIDIA 소프트웨어는 아니지만 의존성 그래프의 모양은 실제와 같습니다.
단계
1. /root/gpu 디렉터리를 만들고, /opt/fixtures/gpu-airgap/src/ 아래 모든 패키지의 이름 버전 을 한 줄씩 /root/gpu/inventory.txt 에 적으세요. 14줄이어야 합니다.
2. 모든 소스 디렉터리를 .deb 로 빌드해 /root/gpu/pool/ 에 모으세요. .deb 파일이 14개여야 합니다.
3. /root/gpu/pool 에 Packages 색인과 Packages.gz 를 만드세요. 색인의 Package: 항목이 14개여야 합니다.
4. 각 패키지의 의존 관계를 <패키지> <의존대상> 형식으로 한 줄씩 /root/gpu/edges.txt 에 적으세요. 버전 조건은 빼고 이름만 씁니다. 최소 15줄이어야 합니다.
5. 번들 안에서 해결되지 않는 의존의 이름만 /root/gpu/missing.txt 에 적으세요. (번들 안에 그 이름의 패키지가 없고, 번들 안 어떤 패키지도 그것을 Provides 하지 않는 것)
6. nvidia-driver-550 을 설치하기 위해 필요한 패키지 전부를 의존이 먼저 오도록 정렬해 /root/gpu/install-order.txt 에 한 줄에 하나씩 적으세요. 11줄이어야 합니다.
7. 가상 패키지 libcuda1 을 제공하는 패키지 이름을 한 줄로 /root/gpu/provides.txt 에 적으세요.
8. /root/gpu/report.txt 를 다음 5줄로 만드세요.BUNDLE=14 / EDGES=<4번 파일의 줄 수> / MISSING=<5번 파일의 줄 수> / ORDER=11 / LIBCUDA1_BY=<7번 값>
참고
- 빌드는
for d in /opt/fixtures/gpu-airgap/src/*/; do dpkg-deb --build "$d" /root/gpu/pool/ ; done형태로 반복합니다. - control 필드 읽기는
dpkg-deb -f <deb> Depends또는 소스 트리의DEBIAN/control을 직접 읽으면 됩니다. - Depends 문자열은
pkg-a (= 1.0), pkg-b (>= 2.0)형태입니다. 쉼표로 나누고 괄호를 제거하세요. - 6번의 11개는
nvidia-driver-550자신과 그 전이 의존 전부입니다. 툴킷 쪽은 포함되지 않습니다. - 흔한 실수 1: 5번에서
libc6처럼 시스템에 이미 설치된 것을 넣는 경우. 이 번들의 패키지들은 시스템 패키지에 의존하지 않도록 만들어져 있습니다. - 흔한 실수 2: 6번에서 알파벳 순으로 정렬하는 경우. 의존 관계 순서여야 합니다.
단계 8개
- 반입 번들 목록화
- 모든 패키지 빌드
- 저장소 색인 생성
- 의존성 엣지 목록
- 닫히지 않는 의존 찾기
- 설치 순서 산출
- 가상 패키지 추적
- 의존성 분석 보고서