aptコマンド:Ubuntu・Debianでのパッケージのインストール、更新、削除
aptはUbuntuとDebianのパッケージ管理ツールです。sudo apt update はパッケージリストを更新し、sudo apt upgrade は更新を適用し、sudo apt install 名前 はパッケージをインストールします。sudo apt remove は削除し、purge は設定ファイルも含めて削除します。apt autoremove は不要な依存関係を整理します。検索には apt search と apt show を使い、壊れた依存関係は sudo apt --fix-broken install で修復します。
aptは、UbuntuやDebian、およびそれらの派生ディストリビューション(Linux Mint、Pop!_OSなど)の標準的なパッケージマネージャーです。リポジトリからプログラムをダウンロードし、依存関係を自動的に解決し、システム全体を1つのコマンドで更新します。以下では、日常の作業で必要になるaptコマンドを作業ごとに整理し、よくあるエラーとその解決方法を紹介します。
aptの仕組み
パッケージは、プログラム、メタデータ、依存関係の一覧を含む .deb アーカイブです。リポジトリはパッケージを置いているサーバーで、そのアドレスは /etc/apt/sources.list と /etc/apt/sources.list.d/ ディレクトリに記載されています。aptは利用可能なパッケージの一覧をローカルに保存しており、インストール時にはその一覧と照らし合わせます。そのため、一覧は定期的に更新する必要があります。
aptの内部では、低レベルの dpkg を呼び出しています。dpkg はパッケージの展開と登録を行いますが、依存関係の解決はできません。apt-get と apt-cache は、同じ機能を持つ古いインターフェースです。出力が安定しているため、スクリプトに向いています。apt は人が使うための新しいラッパーで、進捗バーや色があり、コマンドも短くなっています。
変更を伴うコマンドのほとんどは管理者権限が必要なので、sudo を付けて実行します。検索や情報の表示は、sudoなしでも行えます。
早見表:主要なaptコマンド
| コマンド | 動作 |
|---|---|
sudo apt update | リポジトリからパッケージリストを更新 |
sudo apt upgrade | パッケージを削除せずに更新を適用 |
sudo apt full-upgrade | 必要に応じてパッケージの削除や置き換えを伴って更新 |
sudo apt install パッケージ | 依存関係を含めてパッケージをインストール |
sudo apt reinstall パッケージ | パッケージを再インストール |
sudo apt remove パッケージ | パッケージを削除し、設定ファイルは残す |
sudo apt purge パッケージ | パッケージをシステムの設定ファイルごと削除 |
sudo apt autoremove | 不要になった依存パッケージを削除 |
apt search 単語 | 名前と説明からパッケージを検索 |
apt show パッケージ | 説明、バージョン、依存関係、サイズを表示 |
apt list --installed | インストール済みのパッケージを一覧表示 |
apt list --upgradable | 更新可能なパッケージを表示 |
apt policy パッケージ | インストール済みのバージョン、利用可能なバージョン、ソースを表示 |
sudo apt clean | ダウンロード済みの.debのキャッシュを削除 |
sudo apt --fix-broken install | 壊れた依存関係を修復 |
apt updateとapt upgrade:システムの更新方法
この2つは別の操作で、混同されがちです。apt update は何もインストールしません。最新のパッケージリストをダウンロードするだけです。apt upgrade は、そのリストに基づいて、インストール済みのプログラムの新しいバージョンを適用します。
$ sudo apt update
Hit:1 http://archive.ubuntu.com/ubuntu noble InRelease
Get:2 http://security.ubuntu.com/ubuntu noble-security InRelease [126 kB]
...
12 packages can be upgraded. Run 'apt list --upgradable' to see them.
$ apt list --upgradable
$ sudo apt upgrade
サーバーでよく使われるのは、1行で確認なしに実行する方法です。
sudo apt update && sudo apt upgrade -y
upgradeとfull-upgradeの違い
apt upgrade は新しい依存関係をインストールすることはありますが、既にインストールされたパッケージを削除することは決してありません。更新のためにパッケージの削除が必要な場合(カーネルやライブラリのバージョンが変わるときなど)、そのパッケージは「保留」されます。出力に The following packages have been kept back という行が表示されます。apt full-upgrade(apt-get dist-upgrade と同じ)は削除を許可し、更新を最後まで完了させます。実行前に、aptが何を削除しようとしているかを必ず読んでください。
1つのパッケージだけを更新する
sudo apt install --only-upgrade nginx
パッケージがインストールされていない場合、--only-upgrade を付けたコマンドはそれをインストールしません。うっかりインストールされるのを防げます。
apt install:パッケージのインストール
sudo apt install nginx # 1つのパッケージ
sudo apt install git curl htop # 複数をまとめて
sudo apt install -y docker.io # Y/nの確認なし
sudo apt install nginx=1.24.0-2ubuntu7 # 特定のバージョン
sudo apt install --no-install-recommends ffmpeg # 推奨パッケージを除く
sudo apt install ./google-chrome-stable_current_amd64.deb # ローカルの.deb
インストール時には、aptが追加されるパッケージと必要な容量を表示し、確認を求めます。-y を付けると自動的に「はい」と答えます。スクリプトやDockerfileでは便利ですが、対話的に作業するときは一覧を読んでから進めるほうが安全です。
既定では、aptは必須の依存関係(Depends)だけでなく、推奨パッケージ(Recommends)もインストールします。サーバーやコンテナでは --no-install-recommends を使うと、容量を大きく減らせます。
.debファイルのインストール:aptかdpkg -iか
ダウンロードした .deb は apt install ./ファイル.deb でインストールするのが推奨です。パスには必ず ./ を付けるか、フルパスを指定してください。そうしないと、aptはリポジトリ内で同じ名前のパッケージを探してしまいます。dpkg -i と違い、aptは不足している依存関係を自動でダウンロードします。すでに dpkg でインストールしてしまい、依存関係のエラーが出た場合は、sudo apt --fix-broken install で修復できます。
sudo dpkg -i package.deb
sudo apt --fix-broken install
apt remove、purge、autoremove:パッケージの削除
| コマンド | プログラム | /etc の設定ファイル | 依存関係 |
|---|---|---|---|
apt remove | 削除される | 残る | 残る |
apt purge | 削除される | 削除される | 残る |
apt autoremove | — | — | 不要なものが削除される |
sudo apt remove nginx
sudo apt purge nginx # 削除+設定ファイル
sudo apt autoremove # 依存関係の残り
sudo apt autoremove --purge # 依存関係の残りを設定ファイルごと削除
プログラムを後で再び使う可能性があり、設定を残しておきたい場合は remove を使います。すべてをまっさらな状態から再インストールしたい場合は purge を使います。注意すべき点として、ユーザーのホームディレクトリにあるファイル(例:~/.config)は、どのコマンドでも削除されません。
パッケージは削除されたが設定ファイルが残っているものを探すには、ステータスが rc のものを確認します。
dpkg -l | grep '^rc'
パッケージの検索と情報の確認
apt search postgresql # 名前と説明から検索
apt search --names-only '^php8' # 名前だけで、正規表現を使って検索
apt show htop # バージョン、サイズ、依存関係、説明
apt policy docker.io # 利用可能なバージョンとその取得元
apt list --installed | grep python3
apt-cache depends curl # このパッケージが依存しているもの
apt-cache rdepends libssl3 # このパッケージに依存しているもの
ファイルがどのパッケージに属するか
$ dpkg -S /usr/bin/curl
curl: /usr/bin/curl
$ dpkg -L curl # このパッケージがインストールしたファイル一覧
コマンドがシステムにない場合、Ubuntuはそのコマンドを実行しようとしたときに、必要なパッケージを教えてくれます(Command 'tree' not found, but can be installed with: sudo apt install tree のようなメッセージ)。インストールされていないパッケージのファイルを検索するには、apt-file を使います。sudo apt-file update を実行した後、apt-file search bin/dig のように使います。
バージョンの固定:apt-mark hold
パッケージを更新してはいけない場合があります。たとえば、本番環境のDBサーバーやカーネルのバージョンは、手動でのみ変更するよう決められていることがあります。そのような場合、パッケージを「固定」します。
sudo apt-mark hold postgresql-16
apt-mark showhold
sudo apt-mark unhold postgresql-16
もう1つ便利なのが apt-mark manual と apt-mark auto の組み合わせです。他のパッケージの依存関係としてインストールされたパッケージは「自動」とマークされ、不要になると autoremove の対象になります。manual とマークすると、そのパッケージは削除されずに残ります。
リポジトリ:追加方法と保存場所
ソースの一覧は /etc/apt/sources.list と、/etc/apt/sources.list.d/*.list のファイルに記載されています。Ubuntu 24.04やDebian 12以降では、.sources 拡張子を持つdeb822形式が増えています(例:/etc/apt/sources.list.d/ubuntu.sources)。
署名キーを使うサードパーティのリポジトリ
現在推奨される方法は、リポジトリのキーを別のファイルとして保存し、signed-by で関連付けることです。apt-key コマンドは非推奨で、新しいバージョンでは削除されています。
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(. /etc/os-release && echo $VERSION_CODENAME) stable" | sudo tee /etc/apt/sources.list.d/docker.list
sudo apt update
sudo apt install docker-ce
UbuntuのPPA
sudo add-apt-repository ppa:deadsnakes/ppa
sudo apt update
sudo add-apt-repository --remove ppa:deadsnakes/ppa
PPAはLaunchpad上の個人のリポジトリです。信頼できるものだけを追加してください。そこからのパッケージはrootの権限でインストールされます。
キャッシュとディスク容量
ダウンロードしたパッケージは /var/cache/apt/archives/ に残ります。小さなディスクやDockerイメージでは、キャッシュを削除しておくとよいでしょう。
du -sh /var/cache/apt/archives
sudo apt clean # .debのキャッシュをすべて削除
sudo apt autoclean # 古いバージョンのものだけ削除
Dockerfileでは、インストールを1つのレイヤーにまとめ、パッケージリストをすぐに削除するのが一般的です。
RUN apt-get update \
&& apt-get install -y --no-install-recommends curl ca-certificates \
&& rm -rf /var/lib/apt/lists/*
スクリプトでは apt ではなく apt-get を使います。apt はCLIの仕様が安定していないという警告が表示されるためです(WARNING: apt does not have a stable CLI interface)。インストーラーが質問をしないようにするには、DEBIAN_FRONTEND=noninteractive を指定します。
aptのよくあるエラーと解決方法
Could not get lock /var/lib/dpkg/lock-frontend
別のプロセスがすでにパッケージを操作しています。別のターミナルでaptを実行している、「ソフトウェア」アプリを開いている、あるいは自動更新の unattended-upgrades が動いている場合があります。数分待ってから、どのプロセスがロックを握っているかを確認してください。
ps aux | grep -E 'apt|dpkg'
プロセスが動いている間にロックファイルを手で削除しないでください。中断されたインストールによって、システムの整合性が損なわれることがあります。プロセスが本当に停止しているか終了された場合は、その後で sudo dpkg --configure -a を実行してください。
Unable to locate package
aptがパッケージを見つけられませんでした。よくある原因は、新しく入れたシステムで sudo apt update を実行していないこと、パッケージ名のタイプミス、またはパッケージが無効化されたコンポーネント(Ubuntuの universe)にあることです。コンポーネントは sudo add-apt-repository universe で有効にできます。
Unmet dependencies / held broken packages
依存関係が一致していません。多くの場合、.debを手動でインストールした後や、異なるバージョンのディストリビューションのリポジトリを混在させた後に起こります。
sudo apt --fix-broken install
sudo dpkg --configure -a
apt policy 問題のあるパッケージ
dpkg was interrupted
インストールが中断されました(ターミナルを閉じた、停電したなど)。メッセージに解決方法が書かれています。sudo dpkg --configure -a を実行してください。
apt update 時の NO_PUBKEY
サードパーティのリポジトリの署名キーがないか、古くなっています。プロジェクトの公式サイトから最新のキーをダウンロードして /etc/apt/keyrings/ に保存し、上のDockerの例のように signed-by で指定してください。
自動セキュリティ更新
Ubuntu Serverでは、セキュリティ更新を自動で適用する unattended-upgrades パッケージが既定でインストールされています。確認と有効化は次のとおりです。
sudo apt install unattended-upgrades
sudo dpkg-reconfigure -plow unattended-upgrades
cat /var/log/unattended-upgrades/unattended-upgrades.log
更新後に再起動が必要かどうかは、/var/run/reboot-required ファイルで分かります。このファイルが存在する場合、カーネルや主要なライブラリが更新されています。
まとめ
基本的なaptコマンドは、短いサイクルにまとめられます。何か作業する前に update を実行し、インストールには install、更新には upgrade、削除には remove か purge、後片付けには autoremove を使います。バージョンの確認には apt policy と apt-mark hold、トラブルの修復には --fix-broken install と dpkg --configure -a を使います。スクリプトでは apt-get を使ってください。パッケージ管理は、Linuxコースで実践的に解説しています。
よくある質問
aptとapt-getの違いは何ですか?
どちらも同じパッケージ管理システムへのインターフェースです。aptはターミナルでの作業に便利です(進捗表示、色、短いコマンド)。apt-getは出力が安定しているため、スクリプトやDockerfileに推奨されます。
インストールの前に毎回 apt update を実行する必要がありますか?
リストが長い間更新されていない場合は実行するのが望ましいです。そうしないと、aptがパッケージを見つけられなかったり、ミラーにもうないバージョンをダウンロードしようとして404エラーになったりします。
aptのインストールと削除の履歴はどこで確認できますか?
履歴は /var/log/apt/history.log に記録されます(古い記録はアーカイブの history.log.N.gz にあります)。詳細なdpkgのログは /var/log/dpkg.log にあります。
パッケージを以前のバージョンに戻すにはどうすればよいですか?
apt policy パッケージ で利用可能なバージョンを確認し、sudo apt install パッケージ=バージョン で目的のバージョンをインストールします。その後 apt-mark hold で固定すると、次の更新で新しいバージョンに戻りません。
aptはCentOSやFedoraでも使えますか?
いいえ。これらはrpm形式を使い、dnfやyumという別のツールを使います。aptはDebian、Ubuntu、およびそれらの派生ディストリビューションでのみ動作します。