はじめに
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 は確認済みのインストール要求に対して自動的に「はい」と回答します。
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 のライフサイクルを最後まで実行しました。



