依存グラフを解く
目標
持ち込んだと仮定したパッケージのまとまりから、依存関係グラフを解いて、バンドルの中で解決されない依存を見つけ出し、インストール順序を導出します。
なぜ重要なのか
エアギャップ環境で最もコストの高いミスは、「持ち込んだのに、依存関係が足りなくて、もう一度出ていくこと」です。持ち込み審査が1日に1回なら、往復1回が1日です。そのため、持ち込みの前に、バンドルが自分の中で閉じているか(closure)を確認する必要があります。そして、Providesの関係を知らないと、「libcuda1がリポジトリにない」として、存在しないパッケージを探し回ることになります。
/opt/fixtures/gpu-airgap/src/には、1次持ち込み分のソースツリーが入っています。実際のNVIDIAのソフトウェアではありませんが、依存関係グラフの形は、実際と同じです。
ステップ
/root/gpuディレクトリを作成して、/opt/fixtures/gpu-airgap/src/の下のすべてのパッケージの이름 버전を(プレースホルダーは名前とバージョンです)1行ずつ、/root/gpu/inventory.txtに書いてください。14行である必要があります。- すべてのソースディレクトリを
.debとしてビルドして、/root/gpu/pool/に集めてください。.debファイルが14個である必要があります。 /root/gpu/poolに、PackagesインデックスとPackages.gzを作成してください。インデックスのPackage:項目が14個である必要があります。- 各パッケージの依存関係を、
<패키지> <의존대상>の形式で(プレースホルダーはパッケージと依存先です)1行ずつ、/root/gpu/edges.txtに書いてください。バージョン条件は除いて、名前だけを書きます。最低15行である必要があります。 - バンドルの中で解決されない依存の名前だけを、
/root/gpu/missing.txtに書いてください。(バンドルの中にその名前のパッケージがなく、バンドルの中のどのパッケージも、それをProvidesしていないもの) nvidia-driver-550をインストールするために必要なパッケージのすべてを、依存が先に来るように並べて、/root/gpu/install-order.txtに、1行に1つずつ書いてください。11行である必要があります。- 仮想パッケージ
libcuda1を提供するパッケージ名を、1行で/root/gpu/provides.txtに書いてください。 /root/gpu/report.txtを、次の5行で作成してください。BUNDLE=14/EDGES=<4번 파일의 줄 수>/MISSING=<5번 파일의 줄 수>/ORDER=11/LIBCUDA1_BY=<7번 값>(プレースホルダーは、順に、ステップ4のファイルの行数、ステップ5のファイルの行数、ステップ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/の下のすべてのパッケージの이름 버전を(プレースホルダーは名前とバージョンです)1行ずつ、/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項目の数が、ビルドしたパッケージの数と同じである必要があります。
依存関係のエッジ一覧
各パッケージの依存関係を、<패키지> <의존대상>の形式で(プレースホルダーはパッケージと依存先です)1行ずつ、/root/gpu/edges.txtに書いてください。バージョン条件は除いて、名前だけを書きます。最低15行である必要があります。
Dependsフィールドをカンマで分けて、バージョン条件の括弧を取れば、依存先の名前だけが残ります。
閉じていない依存を見つける
バンドルの中で解決されない依存の名前だけを、/root/gpu/missing.txtに書いてください。(バンドルの中にその名前のパッケージがなく、バンドルの中のどのパッケージも、それをProvidesしていないもの)
エッジの依存先のうち、バンドルの中になく、Providesでも満たされない名前を探してください。システムにすでにインストールされているものは除きます。
インストール順序を導出する
nvidia-driver-550をインストールするために必要なパッケージのすべてを、依存が先に来るように並べて、/root/gpu/install-order.txtに、1行に1つずつ書いてください。11行である必要があります。
依存が先に来る必要があります。トポロジカルソートを、手でするか、スクリプトでしてください。
仮想パッケージを追跡する
仮想パッケージlibcuda1を提供するパッケージ名を、1行で/root/gpu/provides.txtに書いてください。
controlファイルのProvidesフィールドを見れば、どのパッケージがその名前を提供するかが出てきます。
依存関係の分析レポートを作成する
/root/gpu/report.txtを、次の5行で作成してください。
BUNDLE=14 / EDGES=<4번 파일의 줄 수> / MISSING=<5번 파일의 줄 수> / ORDER=11 / LIBCUDA1_BY=<7번 값>(プレースホルダーは、順に、ステップ4のファイルの行数、ステップ5のファイルの行数、ステップ7の値です)
前のステップの結果の、数と名前を集めれば済みます。