TT Lab
はじめる
学ぶ 学習パス コース

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

依存グラフを解く

TT Labで続きを見る

目標

持ち込んだと仮定したパッケージのまとまりから、依存関係グラフを解いて、バンドルの中で解決されない依存を見つけ出し、インストール順序を導出します。

なぜ重要なのか

エアギャップ環境で最もコストの高いミスは、「持ち込んだのに、依存関係が足りなくて、もう一度出ていくこと」です。持ち込み審査が1日に1回なら、往復1回が1日です。そのため、持ち込みの前に、バンドルが自分の中で閉じているか(closure)を確認する必要があります。そして、Providesの関係を知らないと、「libcuda1がリポジトリにない」として、存在しないパッケージを探し回ることになります。

/opt/fixtures/gpu-airgap/src/には、1次持ち込み分のソースツリーが入っています。実際のNVIDIAのソフトウェアではありませんが、依存関係グラフの形は、実際と同じです。

ステップ

  1. /root/gpuディレクトリを作成して、/opt/fixtures/gpu-airgap/src/の下のすべてのパッケージの이름 버전を(プレースホルダーは名前とバージョンです)1行ずつ、/root/gpu/inventory.txtに書いてください。14行である必要があります。
  2. すべてのソースディレクトリを.debとしてビルドして、/root/gpu/pool/に集めてください。.debファイルが14個である必要があります。
  3. /root/gpu/poolに、PackagesインデックスとPackages.gzを作成してください。インデックスのPackage:項目が14個である必要があります。
  4. 各パッケージの依存関係を、<패키지> <의존대상>の形式で(プレースホルダーはパッケージと依存先です)1行ずつ、/root/gpu/edges.txtに書いてください。バージョン条件は除いて、名前だけを書きます。最低15行である必要があります。
  5. バンドルの中で解決されない依存の名前だけを、/root/gpu/missing.txtに書いてください。(バンドルの中にその名前のパッケージがなく、バンドルの中のどのパッケージも、それをProvidesしていないもの)
  6. nvidia-driver-550をインストールするために必要なパッケージのすべてを、依存が先に来るように並べて、/root/gpu/install-order.txtに、1行に1つずつ書いてください。11行である必要があります。
  7. 仮想パッケージlibcuda1を提供するパッケージ名を、1行で/root/gpu/provides.txtに書いてください。
  8. /root/gpu/report.txtを、次の5行で作成してください。 BUNDLE=14 / EDGES=<4번 파일의 줄 수> / MISSING=<5번 파일의 줄 수> / ORDER=11 / LIBCUDA1_BY=<7번 값>(プレースホルダーは、順に、ステップ4のファイルの行数、ステップ5のファイルの行数、ステップ7の値です)

参考

持ち込みバンドルを一覧にする

/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の値です)

前のステップの結果の、数と名前を集めれば済みます。