自分のリポジトリを作る
目標
インターネットなしで動作するaptリポジトリを最初から作り、そこからパッケージをインストールします。リポジトリが実は「ディレクトリ + インデックスファイル」であることを、手で確認します。
なぜ重要なのか
エアギャップ環境でも社内標準イメージでもCIキャッシュでも、結局必要なのは統制できるリポジトリです。aptがリポジトリから読むものは、PackagesインデックスとReleaseメタデータだけなので、その2つを作ればfile:///のパスも完全なリポジトリになります。この構造を知ると、「パッケージを入れたのに見えない」の原因が、インデックスの再生成漏れなのかクライアントのキャッシュなのかが、すぐに切り分けられます。実務のリポジトリでは、ここにGPG署名を加えますが、このラボは構造に集中するために、信頼オプションで代用します。
ステップ
/root/repoディレクトリを作成し、/opt/fixtures/pkg/labhub-toolと/opt/fixtures/pkg/labhub-extraをそれぞれ.debにビルドして、/root/repoの中に入れてください。/root/repo/Packagesインデックスを作成してください。2つのパッケージのPackage:エントリがすべて含まれている必要があります。/root/repo/Packages.gzの圧縮版を作成してください。/root/repo/Releaseファイルを作成してください。Origin、Label、Suite、Codename、Architectures、Componentsの6つのキーがそれぞれ1行ずつある必要があり、Architecturesの値にはallが含まれている必要があります。/etc/apt/sources.list.d/labhub-local.listにこのリポジトリを登録してください。パスは/root/repoで、flat形式です。- インデックスを更新し、
apt-cache policy labhub-extraの出力を/root/repo-check/policy.txtに保存してください。 labhub-extraをaptでインストールしてください。依存関係により、labhub-toolも一緒にインストールされる必要があります。/root/repo-check/origin.txtを2行で作成してください。labhub-tool=<설치된 버전>/labhub-extra=<설치된 버전>(プレースホルダーはインストールされたバージョンです)
参考
dpkg-scanpackages /root/repo /dev/null > /root/repo/Packagesの形でインデックスを作ります。パスの書き方によってFilename:の値が変わるので、apt-get updateのあとのエラーメッセージをよく読んでください。- sources.listの1行の形式は
deb [옵션] <URI> <suite> [component...]で、flatリポジトリはsuiteの位置に./を書きます(プレースホルダーはオプションです)。 - よくある間違い1: インデックスを作ったあとで
apt-get updateをしないために、ずっと「見つかりません」が出る場合です。 - よくある間違い2: 署名がないために、
NO_PUBKEY/not signedエラーが出る場合です。このラボでは、信頼オプションで回避します。
パッケージプールの準備
/root/repoディレクトリを作成し、/opt/fixtures/pkg/labhub-toolと/opt/fixtures/pkg/labhub-extraをそれぞれ.debにビルドして、/root/repoの中に入れてください。
フィクスチャ2つをそれぞれビルドして、同じディレクトリに集めてください。ファイル名は自由ですが、拡張子は.debである必要があります。
Packagesインデックスの作成
/root/repo/Packagesインデックスを作成してください。2つのパッケージのPackage:エントリがすべて含まれている必要があります。
dpkg-scanpackagesは、最初の引数にスキャンするディレクトリを、2番目の引数にoverrideファイルを受け取ります。overrideがなければ/dev/nullを渡します。
インデックスの圧縮版の作成
/root/repo/Packages.gzの圧縮版を作成してください。
aptはPackages.gzを先に探します。元のファイルも一緒に残しておくと、デバッグが楽です。
Releaseファイルの作成
/root/repo/Releaseファイルを作成してください。Origin、Label、Suite、Codename、Architectures、Componentsの6つのキーがそれぞれ1行ずつある必要があり、Architecturesの値にはallが含まれている必要があります。
Origin、Label、Suite、Codename、Architectures、Componentsの6つのキーが1行ずつ入ります。値は自由に決めてよいですが、Architecturesにはallが含まれている必要があります。
リポジトリの登録
/etc/apt/sources.list.d/labhub-local.listにこのリポジトリを登録してください。パスは/root/repoで、flat形式です。
flatリポジトリは、パスの後ろに./を付けます。署名がないので、信頼オプションが必要です。
インデックスの更新と確認
インデックスを更新し、apt-cache policy labhub-extraの出力を/root/repo-check/policy.txtに保存してください。
apt-get updateのあと、apt-cache policyで、候補がどのリポジトリから来たかを見ます。出力にリポジトリのパスが表示されている必要があります。
ここで一度つまずきます。Could not open file ... (13: Permission denied)が出たら、権限の問題です。aptは、ダウンロードする部分だけを_aptという非特権ユーザーに落として実行しますが(APT::Sandbox::User)、/rootは700なので、そのユーザーは中に入れません。リポジトリが/rootの下にあるので、通過権限だけを開ければよいのです。chmod o+x /rootを実行します。一覧を見る権限(r)は、依然として閉じたままです。
サンドボックスを無効にする方法(-o APT::Sandbox::User=root)もありますが、それは問題を覆い隠すやり方です。実務でリポジトリを/srvや/var/wwwに置く理由が、まさにこれです。
自分のリポジトリからインストール
labhub-extraをaptでインストールしてください。依存関係により、labhub-toolも一緒にインストールされる必要があります。
依存関係のある側をインストールすると、aptが残りを自動で取ってきます。dpkg -iとは違うところです。
出どころの確認レポート
/root/repo-check/origin.txtを2行で作成してください。
labhub-tool=<설치된 버전> / labhub-extra=<설치된 버전>(プレースホルダーはインストールされたバージョンです)
apt-cache policyのバージョン表にリポジトリのパスが出ます。両方のパッケージがローカルリポジトリから来たことを確認してください。