aptでパッケージを扱う
目標
aptで検索・インストール・削除を行い、holdとpinでバージョンを固定するところまで身につけます。このラボが終わると、apt-cache policyの出力だけを見て、「なぜこのバージョンが選ばれたのか」を説明できるようになります。
なぜ重要なのか
aptはリポジトリにリアルタイムで問い合わせません。/var/lib/apt/lists/にキャッシュされたインデックスだけを見て判断し、同じパッケージが複数のリポジトリにあるときは、優先度で選びます。この仕組みを知ると、「リポジトリにはあるのに見えない」(インデックスが古い)と「社内ミラーを入れたのに公式から取得している」(優先度が同じ)が、一度に説明できます。このラボ環境にはインターネットがなく、/opt/localrepoのオフラインリポジトリだけがあるので、すべてのインストールはそのリポジトリから行われます。
ステップ
/root/pkgディレクトリを作成し、apt-cache policyの全出力を/root/pkg/policy.txtに保存してください。treeというパッケージを検索して、結果を/root/pkg/search-tree.txtに保存してください。結果の中に、名前がちょうどtreeの行がある必要があります。treeのインストール候補バージョンだけを、1行で/root/pkg/tree-version.txtに書いてください。(例:2.1.1-2ubuntu3)treeとncduの2つのパッケージをインストールしてください。cowsayをインストールし、その依存関係のうちDependsの行だけを選んで、/root/pkg/cowsay-depends.txtに保存してください。htopをインストールしたあと、アップグレードの対象から除外(hold)し、その事実を/root/pkg/hold.txtに保存してください。/etc/apt/preferences.d/labhub.prefを作成し、htopパッケージの優先度を1001に固定してください。Package、Pin、Pin-Priorityの3行がすべてある必要があります。/root/pkg/report.txtを作成してください。先ほどインストールしたtree、ncdu、htop、cowsayの4つのパッケージについて、이름 버전の形式で1行ずつ書き、最後の行にHOLD=<hold 걸린 패키지 이름>を書いてください(プレースホルダーは名前とバージョン、およびholdがかかったパッケージ名です)。
参考
apt-cache policy <패키지>のCandidate:の行がインストール候補です(プレースホルダーはパッケージ名です)。dpkg-query -W -f='${Package} ${Version}\n' <패키지>で、名前とバージョンを1行で取り出せます(プレースホルダーはパッケージ名です)。- よくある間違い1: ステップ3で
Installed:の値を書いてしまう場合です。まだインストール前なら(none)です。 - よくある間違い2: ステップ7で
Pin: version 3.*のように、前のキーワードを書き忘れる場合です。Pin:の値は、version、release、originのどれかで始まる必要があります。
作業ディレクトリとリポジトリの確認
/root/pkgディレクトリを作成し、apt-cache policyの全出力を/root/pkg/policy.txtに保存してください。
apt-cache policyを引数なしで実行すると、現在設定されているリポジトリと優先度がすべて表示されます。その出力をファイルに保存してください。
パッケージの検索
treeというパッケージを検索して、結果を/root/pkg/search-tree.txtに保存してください。結果の中に、名前がちょうどtreeの行がある必要があります。
apt-cache searchは、名前と説明から検索します。結果のうち、名前がちょうどtreeの行がある必要があります。
インストール候補バージョンの確認
treeのインストール候補バージョンだけを、1行で/root/pkg/tree-version.txtに書いてください。(例: 2.1.1-2ubuntu3)
apt-cache policy <パッケージ名>のCandidateの行にある値です。バージョン文字列だけを1行で書いてください。
パッケージのインストール
treeとncduの2つのパッケージをインストールしてください。
インストール後、dpkg -sで状態を確認してみてください。Statusの行が「install ok installed」になっていれば、本当にインストールされています。
依存関係の一覧を取り出す
cowsayをインストールし、その依存関係のうちDependsの行だけを選んで、/root/pkg/cowsay-depends.txtに保存してください。
先にインストールしておかないと、後のステップのレポートが埋まりません。apt-cache dependsは、Dependsのほかに、RecommendsやSuggestsも一緒に表示するので、Dependsの行だけを残してください。
アップグレードから除外する
htopをインストールしたあと、アップグレードの対象から除外(hold)し、その事実を/root/pkg/hold.txtに保存してください。
apt-markには、hold / unhold / showholdのサブコマンドがあります。印が付いたかどうかの確認までしてください。
ピンファイルで優先度を指定
/etc/apt/preferences.d/labhub.prefを作成し、htopパッケージの優先度を1001に固定してください。Package、Pin、Pin-Priorityの3行がすべてある必要があります。
ピンファイルは、Package / Pin / Pin-Priorityの3行が1セットです。Pinは、version、release、originのどれかで始まります。
インストール状態のレポート
/root/pkg/report.txtを作成してください。先ほどインストールしたtree、ncdu、htop、cowsayの4つのパッケージについて、이름 버전の形式で1行ずつ書き、最後の行にHOLD=<hold 걸린 패키지 이름>を書いてください(プレースホルダーは名前とバージョン、およびholdがかかったパッケージ名です)。
dpkg-queryの-W -fオプションを使うと、欲しいフィールドだけを欲しい形式で取り出せます。holdの一覧は、apt-markにあります。