LabHub
배우기 러닝패스 코스

閉域網へのGPUドライバ搬入と導入

依存グラフを解く

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번 값>

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