はじめに
Ubuntu のソフトウェアは通常、パッケージとして提供されます。リポジトリにはパッケージファイルと、名前、バージョン、依存関係、ダウンロード先を示すメタデータが公開されています。apt はリポジトリを操作し、依存関係を解決します。dpkg は、より低いレベルで、インストール済みの .deb パッケージデータベースを管理します。
この実験では、メタデータを更新し、インストール前にパッケージを検索し、インストール済みパッケージを検査して削除し、決められたローカル .deb をインストールします。すべての変更には破棄可能な練習用パッケージを使用し、ターミナルの履歴ではなくパッケージの状態から結果を確認できます。
パッケージの状態とソースを確認する
このステップでは、リポジトリの設定、利用可能なメタデータ、インストール済みパッケージの状態を区別します。
有効になっているソース定義を確認します。最近の Ubuntu イメージでは、.list ファイルまたは .sources ファイルが使用される場合があります。次の読み取り専用パイプラインは両方の場所を検索します。grep -R は再帰的に検索し、-h はソースファイル名を非表示にし、-s は存在しないファイルに関するメッセージを抑制し、-E はグループ化されたパターンを有効にします。head は一致した行の表示を 12 行に制限します。
grep -RhsE '^(deb |Types:|URIs:|Suites:)' /etc/apt/sources.list /etc/apt/sources.list.d 2>/dev/null | head -n 12
Bash がインストールされているか、dpkg に確認します。-W はパッケージレコードを選択し、-f は表示形式を指定します。${Package}、${Version}、${db:Status-Status} は dpkg のフィールドです。形式指定がシングルクォート内にあるため、これらはシェル変数ではありません。
dpkg-query -W -f='package=${Package} version=${Version} status=${db:Status-Status}\n' bash
dpkg-query はローカルのインストール済み状態を読み取ります。一方、apt-cache policy は、インストール済みのバージョンと、設定済みのリポジトリから認識されているバージョンを比較します。
apt-cache policy bash
インストール済み状態を安定した形式で保存します。
mkdir -p /home/labex/project/package-lab
dpkg-query -W -f='${Package} ${db:Status-Status}\n' bash > /home/labex/project/package-lab/bash-state.txt
cat /home/labex/project/package-lab/bash-state.txt
リポジトリのメタデータを更新する
このステップでは、パッケージインデックスを更新し、apt update によって何が変わるかを確認します。
次のコマンドを実行します。
sudo apt update
このコマンドは、最新のリポジトリメタデータをダウンロードします。インストール済みのすべてのパッケージを新しいバージョンに更新するわけではありません。インストール済みパッケージをアップグレードする操作は、別のコマンドである apt upgrade で行います。
メタデータのキャッシュディレクトリを確認します。
ls -ld /var/lib/apt/lists
find /var/lib/apt/lists -maxdepth 1 -type f | head
通常のメタデータファイルがいくつ存在するかを記録します。
find /var/lib/apt/lists -maxdepth 1 -type f | wc -l | tr -d ' ' > /home/labex/project/package-lab/index-file-count.txt
cat /home/labex/project/package-lab/index-file-count.txt
リポジトリパッケージを検索、検査、インストールする
このステップでは、パッケージをインストールする前に調査します。
ツリー表示ユーティリティのパッケージ名と説明を検索します。
apt search '^tree$'
パッケージのメタデータを読み取ります。
apt show tree
依存関係を処理しながらインストールします。sudo は必要な管理者権限を提供し、-y は、すでに内容を確認したこのインストール要求に対して自動的に yes と回答します。
sudo apt install -y tree
パッケージの状態とコマンドの検索結果を確認してから、コマンドを使用します。
dpkg-query -W -f='${Package} ${Version} ${db:Status-Status}\n' tree | tee /home/labex/project/package-lab/tree-installed.txt
command -v tree
tree -L 1 /home/labex/project/package-lab
パッケージによって提供されるパスを一覧表示します。
dpkg -L tree | head
パッケージを削除して結果を確認する
このステップでは、練習用のリポジトリパッケージを削除し、関連するクリーンアップ操作の違いを確認します。
tree を削除します。
sudo apt remove -y tree
remove はパッケージがインストールしたプログラムを削除しますが、パッケージの設定を残す場合があります。purge はパッケージが所有する設定も削除します。autoremove は、自動的にインストールされ、現在は不要になった依存パッケージを削除します。実際のホストで実行する前に、削除候補を確認してください。
システムを変更せずに、依存関係のクリーンアップで何が行われるかをプレビューします。--dry-run オプションを使うと計算だけが実行され、何も削除されません。
sudo apt autoremove --dry-run | tee /home/labex/project/package-lab/autoremove-preview.txt
共有ホストや本番ホストでは、--dry-run なしで apt autoremove を実行する前に、必ず提案された操作を確認してください。
現在の Bash セッションには、コマンドの古いパスが記憶されている場合があります。コマンドの場所のキャッシュを消去し、コマンドがなくなったことを確認して、パッケージデータベースの状態を記録します。
hash -r
command -v tree || echo "tree command is unavailable"
dpkg-query -W -f='${db:Status-Status}\n' tree 2>/dev/null || echo "not-installed" | tee /home/labex/project/package-lab/tree-removed.txt
dpkg が残存レコードを保持しているかどうかにかかわらず、安定したマーカーを作成します。
if dpkg-query -W -f='${db:Status-Status}' tree 2>/dev/null | grep -qx installed; then echo "still-installed"; else echo "not-installed"; fi > /home/labex/project/package-lab/tree-removed.txt
cat /home/labex/project/package-lab/tree-removed.txt
ローカル Deb パッケージを検査してインストールする
このステップでは、用意された .deb を検査し、apt 経由でインストールし、そのコマンドを実行してから、適切に削除します。
ワークスペースに移動し、インストールせずにパッケージのメタデータと内容を確認します。
cd /home/labex/project/package-lab
dpkg-deb -I labex-greeter_1.0_all.deb
dpkg-deb -c labex-greeter_1.0_all.deb
./ プレフィックスにより、apt はこれをリポジトリのパッケージ名ではなくローカルファイルとして扱います。
sudo apt install -y ./labex-greeter_1.0_all.deb
パッケージを照会して実行します。
dpkg-query -W -f='${Package} ${Version} ${db:Status-Status}\n' labex-greeter
labex-greeter | tee local-package-output.txt
テスト後にパッケージを削除し、内容物のコマンドがなくなったことを確認します。
sudo apt remove -y labex-greeter
if command -v labex-greeter >/dev/null; then echo "still-installed"; else echo "local-package-removed"; fi > local-package-state.txt
cat local-package-state.txt
まとめ
リポジトリのメタデータとインストール済み状態を区別し、apt のインデックスを更新しました。また、インストール前にパッケージを調査し、内容物のファイルとコマンドの検索結果を確認し、リポジトリパッケージを削除しました。さらに、検査済みのローカル .deb のライフサイクルを最後まで実行しました。



