Linux でのソフトウェアインストール

LinuxBeginner
オンラインで実践に進む

はじめに

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 のライフサイクルを最後まで実行しました。