dpkgで一層下を見る
目標
dpkgでシステムを照会し、自分で.debをビルドしてインストールまで行います。aptなしでパッケージを扱ってみると、aptが何を肩代わりしてくれていたのかが明確になります。
なぜ重要なのか
dpkgはリポジトリを知りません。与えられたファイルを展開し(unpack)、依存が満たされれば仕上げ(configure)をするだけです。そのためdpkg -iは、依存関係を自動では取ってこず、iU状態で止まります。この分業を知ると、エアギャップ環境でなぜ「インストール順序」が重要なのか、apt-get -f installが何を直すのかがすべて説明できます。そしてdpkg -Sでファイルの出どころを確認する習慣は、見知らぬサーバーで最初に使う武器です。
ステップ
/root/dpkgディレクトリを作成し、現在のインストール完了(ii)状態のパッケージの数だけを、数字1行で/root/dpkg/count.txtに書いてください。coreutilsパッケージがインストールしたファイルのうち、/usr/bin/の下にあるものだけを選んで、/root/dpkg/coreutils-bin.txtに保存してください。/usr/bin/lsを所有するパッケージ名だけを、1行で/root/dpkg/owner.txtに書いてください。dpkg-queryで、bashパッケージの이름 버전 아키텍처を空白区切りの1行にして、/root/dpkg/bash-fields.txtに保存してください(プレースホルダーは名前・バージョン・アーキテクチャです)。/opt/fixtures/pkg/labhub-toolディレクトリを.debにビルドして、/root/dpkg/labhub-tool_1.2.0-labhub1_all.debとして保存してください。- ビルドしたパッケージの制御情報を
/root/dpkg/deb-info.txtに、ファイル一覧を/root/dpkg/deb-contents.txtに保存してください。 - そのパッケージをインストールし、
labhub-toolコマンドを実行した結果を/root/dpkg/run.txtに保存してください。 /root/dpkg/report.txtを、次の4行で作成してください。PACKAGE=labhub-tool/VERSION=<설치된 버전>/FILES=<이 패키지가 깐 실제 파일 개수(디렉터리 제외)>/OWNER_OF_LS=<3번에서 찾은 패키지 이름>(プレースホルダーは順に、インストールされたバージョン、ディレクトリを除いてこのパッケージが入れた実際のファイル数、ステップ3で見つけたパッケージ名です)
参考
dpkg-deb --build <디렉터리> <출력파일>でビルドします(プレースホルダーはディレクトリと出力ファイルです)。dpkg -L <패키지> | while read p; do [ -f "$p" ] && echo "$p"; done | wc -lなら、ディレクトリを除いたファイル数が出ます(プレースホルダーはパッケージ名です)。- よくある間違い1: ステップ1で
dpkg -l | wc -lをそのまま使うと、ヘッダーまで数えてしまい、5行が加算されます。 - よくある間違い2: ステップ5で、ビルド対象のディレクトリの中に入って
dpkg-deb --build .を実行すると、相対パスのせいで混乱します。絶対パスで指定してください。
作業ディレクトリとインストール一覧
/root/dpkgディレクトリを作成し、現在のインストール完了(ii)状態のパッケージの数だけを、数字1行で/root/dpkg/count.txtに書いてください。
dpkg -lの出力で、実際のパッケージの行は状態表示(iiなど)で始まります。ヘッダーの5行はパッケージではありません。
パッケージが入れたファイルの一覧
coreutilsパッケージがインストールしたファイルのうち、/usr/bin/の下にあるものだけを選んで、/root/dpkg/coreutils-bin.txtに保存してください。
dpkg -Lはディレクトリも一緒に出力します。実行ファイルだけが必要なら、パスで絞り込む必要があります。
このファイルは誰が入れたか
/usr/bin/lsを所有するパッケージ名だけを、1行で/root/dpkg/owner.txtに書いてください。
dpkg -Sは「パッケージ: パス」の形式で答えます。必要なのはコロンの前の部分です。
必要なフィールドだけを取り出す
dpkg-queryで、bashパッケージの이름 버전 아키텍처を空白区切りの1行にして、/root/dpkg/bash-fields.txtに保存してください(プレースホルダーは名前・バージョン・アーキテクチャです)。
dpkg-query -W -fのフォーマット文字列では、フィールドをドル記号と波括弧で囲みます。改行はバックスラッシュとnです。
フィクスチャで.debをビルドする
/opt/fixtures/pkg/labhub-toolディレクトリを.debにビルドして、/root/dpkg/labhub-tool_1.2.0-labhub1_all.debとして保存してください。
dpkg-deb --buildは、DEBIAN/controlが入っているディレクトリを丸ごとパッケージにします。出力ファイル名は、2番目の引数で指定できます。
ビルドしたパッケージを調べる
ビルドしたパッケージの制御情報を/root/dpkg/deb-info.txtに、ファイル一覧を/root/dpkg/deb-contents.txtに保存してください。
dpkg-debには-I(情報)と-c(内容の一覧)のオプションがあります。2つの出力は性質がまったく違います。
インストールして状態を確認
そのパッケージをインストールし、labhub-toolコマンドを実行した結果を/root/dpkg/run.txtに保存してください。
dpkg -iでインストールしたあと、dpkg -sのStatusの行を確認してください。依存関係が解決しないと、iU状態のまま残ります。
パッケージの総合レポート
/root/dpkg/report.txtを次の4行で作成してください。
PACKAGE=labhub-tool / VERSION=<설치된 버전> / FILES=<이 패키지가 깐 실제 파일 개수(디렉터리 제외)> / OWNER_OF_LS=<3번에서 찾은 패키지 이름>(プレースホルダーは順に、インストールされたバージョン、ディレクトリを除いてこのパッケージが入れた実際のファイル数、ステップ3で見つけたパッケージ名です)
前のステップで作ったファイルを再利用してください。ファイル数は、dpkg -Lの結果から実際のファイルだけを数えればよいです。