LabHub
배우기 러닝패스 코스

Air-Gapped GPU Driver Installation

Untangling the Dependency Graph

LabHub 에서 이어서 보기

한국어 원문으로 표시합니다.

목표

반입했다고 가정한 패키지 묶음에서 의존성 그래프를 풀고, 번들 안에서 해결되지 않는 의존을 찾아내고, 설치 순서를 산출합니다.

왜 중요한가

폐쇄망에서 가장 비싼 실수는 "반입했는데 의존성이 모자라 다시 나가는 것" 입니다. 반입 심의가 하루에 한 번이면 왕복 한 번이 하루입니다. 그래서 반입 전에 번들이 자기 안에서 닫히는지(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/poolPackages 색인과 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번 값>

참고

반입 번들 목록화

/root/gpu 디렉터리를 만들고, /opt/fixtures/gpu-airgap/src/ 아래 모든 패키지의 이름 버전 을 한 줄씩 /root/gpu/inventory.txt 에 적으세요. 14줄이어야 합니다.

각 소스 디렉터리의 DEBIAN/control 에서 Package 와 Version 을 뽑으면 됩니다.

모든 패키지 빌드

모든 소스 디렉터리를 .deb 로 빌드해 /root/gpu/pool/ 에 모으세요. .deb 파일이 14개여야 합니다.

dpkg-deb --build 를 디렉터리마다 반복합니다. 셸 반복문으로 한 번에 처리하세요.

저장소 색인 생성

/root/gpu/poolPackages 색인과 Packages.gz 를 만드세요. 색인의 Package: 항목이 14개여야 합니다.

앞 코스에서 쓴 방법과 같습니다. Package 항목 개수가 빌드한 패키지 수와 같아야 합니다.

의존성 엣지 목록

각 패키지의 의존 관계를 <패키지> <의존대상> 형식으로 한 줄씩 /root/gpu/edges.txt 에 적으세요. 버전 조건은 빼고 이름만 씁니다. 최소 15줄이어야 합니다.

Depends 필드를 쉼표로 나누고 버전 조건 괄호를 떼면 의존 대상 이름만 남습니다.

닫히지 않는 의존 찾기

번들 안에서 해결되지 않는 의존의 이름만 /root/gpu/missing.txt 에 적으세요. (번들 안에 그 이름의 패키지가 없고, 번들 안 어떤 패키지도 그것을 Provides 하지 않는 것)

엣지의 대상 중 번들 안에 없고 Provides 로도 만족되지 않는 이름을 찾으세요. 시스템에 이미 설치된 것은 제외합니다.

설치 순서 산출

nvidia-driver-550 을 설치하기 위해 필요한 패키지 전부를 의존이 먼저 오도록 정렬해 /root/gpu/install-order.txt 에 한 줄에 하나씩 적으세요. 11줄이어야 합니다.

의존이 먼저 와야 합니다. 위상 정렬을 손으로 하거나 스크립트로 하세요.

가상 패키지 추적

가상 패키지 libcuda1 을 제공하는 패키지 이름을 한 줄로 /root/gpu/provides.txt 에 적으세요.

control 파일의 Provides 필드를 보면 어느 패키지가 그 이름을 제공하는지 나옵니다.

의존성 분석 보고서

/root/gpu/report.txt 를 다음 5줄로 만드세요. BUNDLE=14 / EDGES=<4번 파일의 줄 수> / MISSING=<5번 파일의 줄 수> / ORDER=11 / LIBCUDA1_BY=<7번 값>

앞 단계 결과의 개수와 이름을 모으면 됩니다.