Air-Gapped GPU Driver Installation
Untangling the Dependency Graph
한국어 원문으로 표시합니다.
목표
반입했다고 가정한 패키지 묶음에서 의존성 그래프를 풀고, 번들 안에서 해결되지 않는 의존을 찾아내고, 설치 순서를 산출합니다.
왜 중요한가
폐쇄망에서 가장 비싼 실수는 "반입했는데 의존성이 모자라 다시 나가는 것" 입니다. 반입 심의가 하루에 한 번이면 왕복 한 번이 하루입니다. 그래서 반입 전에 번들이 자기 안에서 닫히는지(closure) 확인해야 합니다. 그리고 Provides 관계를 모르면 "libcuda1 이 저장소에 없다" 며 존재하지 않는 패키지를 찾아 헤매게 됩니다.
/opt/fixtures/gpu-airgap/src/ 에는 1차 반입분 소스 트리가 들어 있습니다. 실제 NVIDIA 소프트웨어는 아니지만 의존성 그래프의 모양은 실제와 같습니다.
단계
/root/gpu디렉터리를 만들고,/opt/fixtures/gpu-airgap/src/아래 모든 패키지의이름 버전을 한 줄씩/root/gpu/inventory.txt에 적으세요. 14줄이어야 합니다.- 모든 소스 디렉터리를
.deb로 빌드해/root/gpu/pool/에 모으세요..deb파일이 14개여야 합니다. /root/gpu/pool에Packages색인과Packages.gz를 만드세요. 색인의Package:항목이 14개여야 합니다.- 각 패키지의 의존 관계를
<패키지> <의존대상>형식으로 한 줄씩/root/gpu/edges.txt에 적으세요. 버전 조건은 빼고 이름만 씁니다. 최소 15줄이어야 합니다. - 번들 안에서 해결되지 않는 의존의 이름만
/root/gpu/missing.txt에 적으세요. (번들 안에 그 이름의 패키지가 없고, 번들 안 어떤 패키지도 그것을Provides하지 않는 것) nvidia-driver-550을 설치하기 위해 필요한 패키지 전부를 의존이 먼저 오도록 정렬해/root/gpu/install-order.txt에 한 줄에 하나씩 적으세요. 11줄이어야 합니다.- 가상 패키지
libcuda1을 제공하는 패키지 이름을 한 줄로/root/gpu/provides.txt에 적으세요. /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번에서 알파벳 순으로 정렬하는 경우. 의존 관계 순서여야 합니다.
반입 번들 목록화
/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/pool 에 Packages 색인과 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번 값>
앞 단계 결과의 개수와 이름을 모으면 됩니다.