aptコマンドとは、Ubuntu や Debian でソフトウェア(パッケージ)の検索・インストール・更新・削除を行うパッケージ管理コマンドです。 よく並べて実行する apt update は「パッケージ一覧の情報を最新にする」だけ、apt upgrade は「その情報をもとにインストール済みのパッケージを実際に更新する」コマンドで、役割が分かれています。

この記事では、apt のコマンドを一覧にしたうえで、update・upgrade・full-upgrade・dist-upgrade で何が変わるのかを Ubuntu 24.04 で実際に実行して比較しました。apt と apt-get・apt-cache・dpkg の対応表、バージョン指定や --no-install-recommends、remove・purge・autoremove の違い、apt-mark hold、頻出エラーの再現と対処、スクリプトでは apt-get を使う理由まで、出力つきで解説します。

検証環境は次のとおりです。

項目 バージョン
OS Ubuntu 24.04.4 LTS(noble)
apt 2.8.3(amd64)
実行ユーザー root(一般ユーザーでは変更系のコマンドに sudo を付ける)

パッケージを変更するコマンドは、システム本体に影響しないよう、検証用に作った小さなパッケージ(t151- で始まる名前)とローカルのリポジトリを使って実行しています。実際のアップグレードは行わず、-s(シミュレーション)も活用しました。出力は LC_ALL=C(英語表示)で取得しています。apt のバージョンによって表示の形式は変わることがあります。

aptコマンドの早見表

変更を伴うコマンドには sudo が必要です。

やりたいこと コマンド 補足
パッケージ一覧の情報を最新にする sudo apt update パッケージ自体は変わらない
更新できるパッケージを見る apt list --upgradable update のあとに実行
インストール済みを更新する sudo apt upgrade 削除を伴う更新は保留される
削除も許可して更新する sudo apt full-upgrade apt-get では dist-upgrade
インストールする sudo apt install パッケージ名 複数指定可
確認なしでインストールする sudo apt install -y パッケージ名 スクリプト向け
バージョンを指定する sudo apt install パッケージ名=バージョン apt-cache madison で候補を確認
推奨パッケージを入れない sudo apt install --no-install-recommends パッケージ名 コンテナのイメージ作成でよく使う
1つだけ更新する sudo apt install --only-upgrade パッケージ名 未インストールなら何もしない
入れ直す sudo apt reinstall パッケージ名 apt-get では install --reinstall
削除する(設定ファイルは残す) sudo apt remove パッケージ名 状態は rc になる
設定ファイルごと削除する sudo apt purge パッケージ名 remove --purge と同じ
不要になった依存パッケージを削除する sudo apt autoremove 対象を必ず確認してから実行
名前や説明から探す apt search キーワード --names-only で名前だけ
詳細を見る apt show パッケージ名 依存関係・サイズ・説明
インストール済みの一覧 apt list --installed スクリプトでは dpkg-query -W
バージョンと取得元を見る apt policy パッケージ名 apt-cache policy と同じ
更新を止める sudo apt-mark hold パッケージ名 解除は unhold
ファイルがどのパッケージのものか dpkg -S /パス インストール済みが対象
パッケージに含まれるファイル dpkg -L パッケージ名 インストール済みが対象
ダウンロード済みのファイルを消す sudo apt clean /var/cache/apt/archives を空にする
実行せずに結果だけ見る apt-get -s コマンド --simulate、--dry-run も同じ

update・upgrade・full-upgrade の違いを1つの表にまとめると次のとおりです。

コマンド パッケージ一覧の更新 既存パッケージの更新 新しいパッケージの追加 既存パッケージの削除
apt update する しない しない しない
apt upgrade しない する する(必要な場合) しない
apt-get upgrade しない する しない しない
apt full-upgrade / apt-get dist-upgrade しない する する する(必要な場合)

本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。

(記載例)出典:株式会社RJC「aptコマンド一覧|updateとupgradeの違い・apt-getとの違い」

apt updateとapt upgradeの違い

update は「一覧の情報」を更新する

apt update は、/etc/apt/sources.list や /etc/apt/sources.list.d/ に書かれたリポジトリ(パッケージの配布元)から、パッケージ名・バージョン・依存関係の一覧をダウンロードして手元の情報を最新にするコマンドです。インストール済みのパッケージには手を加えません。

検証用のリポジトリに新しいバージョンを置いた直後、update の前後で apt list --upgradable を比べました。

$ apt list --upgradable        # update の前
Listing...
$ apt update
Get:1 file:/tmp/t151repo/repo2 ./ InRelease
Ign:1 file:/tmp/t151repo/repo2 ./ InRelease
Get:2 file:/tmp/t151repo/repo2 ./ Release
Ign:2 file:/tmp/t151repo/repo2 ./ Release
Get:3 file:/tmp/t151repo/repo2 ./ Packages [1424 B]
3 packages can be upgraded. Run 'apt list --upgradable' to see them.
$ apt list --upgradable        # update の後
Listing...
t151-app/unknown 2.0 all [upgradable from: 1.0]
t151-simple/unknown 2.0 all [upgradable from: 1.0]
t151-tool/unknown 2.0 all [upgradable from: 1.0]

update の前は「更新できるものはない」と表示され、update のあとで初めて3件が見つかりました。 リポジトリに新しいバージョンがあっても、update を実行するまで手元の apt はそれを知りません。apt install の前に apt update を実行するのは、このためです。

update の出力の各行は次の意味です。

表示 意味
Hit: 前回から変更がなかった
Get: 新しい情報をダウンロードした
Ign: そのファイルがなく、別の形式を試した
Err: 取得できなかった
N packages can be upgraded. 更新できるパッケージの数

実際のシステム(Ubuntu 24.04)では、検証時点で 171 packages can be upgraded. と表示されました。

upgrade は「パッケージ本体」を更新する

apt upgrade は、update で得た情報をもとに、インストール済みのパッケージを新しいバージョンへ更新します。検証用の3パッケージには、あえて次の条件を付けました。

パッケージ 1.0 → 2.0 の更新で必要になること
t151-simple 何も必要ない(単純な更新)
t151-app 新しいパッケージ t151-libnew の追加が必要
t151-tool インストール済みの t151-oldplugin の削除が必要

この状態で4つのコマンドをシミュレーションした結果です。

apt-get upgrade

$ apt-get -s upgrade
Calculating upgrade...
The following packages have been kept back:
  t151-app t151-tool
The following packages will be upgraded:
  t151-simple
1 upgraded, 0 newly installed, 0 to remove and 2 not upgraded.
Inst t151-simple [1.0] (2.0 localhost [all])
Conf t151-simple (2.0 localhost [all])

apt upgrade

$ apt -s upgrade
Calculating upgrade...
The following NEW packages will be installed:
  t151-libnew
The following packages have been kept back:
  t151-tool
The following packages will be upgraded:
  t151-app t151-simple
2 upgraded, 1 newly installed, 0 to remove and 1 not upgraded.

apt full-upgrade(apt-get dist-upgrade も同じ結果)

$ apt-get -s full-upgrade
Calculating upgrade...
The following packages will be REMOVED:
  t151-oldplugin
The following NEW packages will be installed:
  t151-libnew
The following packages will be upgraded:
  t151-app t151-simple t151-tool
3 upgraded, 1 newly installed, 1 to remove and 0 not upgraded.
Remv t151-oldplugin [1.0]
Inst t151-libnew (1.0 localhost [all])
Inst t151-app [1.0] (2.0 localhost [all])
Inst t151-simple [1.0] (2.0 localhost [all])
Inst t151-tool [1.0] (2.0 localhost [all])

(出力のうち、検証環境に固有の案内行は省いています。)

結果を整理します。

コマンド t151-simple(単純な更新) t151-app(追加が必要) t151-tool(削除が必要)
apt-get upgrade 更新 保留 保留
apt upgrade 更新 更新(libnew を追加) 保留
apt-get --with-new-pkgs upgrade 更新 更新(libnew を追加) 保留
apt full-upgrade 更新 更新 更新(oldplugin を削除)
apt-get dist-upgrade 更新 更新 更新(oldplugin を削除)

同じ「upgrade」でも、apt upgrade は新しいパッケージの追加を許可し、apt-get upgrade は許可しない点が違います。 apt upgrade は apt-get upgrade --with-new-pkgs と同じ動きです。そして、どちらの upgrade も既存パッケージの削除は行わず、削除が必要な更新は「kept back(保留)」として残します。

kept back と表示されたとき

The following packages have been kept back: は、そのパッケージの更新に、upgrade では許可されていない操作(追加や削除)が必要という意味です。エラーではありません。なお Ubuntu には更新を段階的に配信する仕組み(phased updates)があり、その対象になっているパッケージも更新が後回しになります(apt のバージョンによって kept back または deferred due to phasing と表示されます。この表示は今回の検証では再現していません)。

対応は、apt-get -s full-upgrade で何が必要かを確認し、削除されるものに問題がなければ sudo apt full-upgrade へ進む、またはそのパッケージだけ sudo apt install パッケージ名 で更新する、のいずれかです。

full-upgrade を実行する前に、The following packages will be REMOVED: の欄を読む習慣をつけておくと、意図しない削除に気づけます。

full-upgrade と dist-upgrade

full-upgrade は apt の、dist-upgrade は apt-get のサブコマンド名で、動きは同じです(apt-get でも full-upgrade を受け付けます)。名前に「dist」とありますが、Ubuntu 22.04 から 24.04 へのようなリリースの切り替えを行うコマンドではありません。Ubuntu のリリースを上げるには、公式ドキュメントで案内されている do-release-upgrade を使います(この記事では未実行です)。

実際に apt upgrade を実行した結果

シミュレーションではなく実行した結果も載せます(検証用パッケージのみが対象です)。

$ apt upgrade -y     # 出力は省略(2 upgraded, 1 newly installed, 0 to remove and 1 not upgraded.)
$ apt list --installed | grep t151
t151-app/unknown,now 2.0 all [installed]
t151-libnew/unknown,now 1.0 all [installed,automatic]
t151-oldplugin/unknown,now 1.0 all [installed]
t151-simple/unknown,now 2.0 all [installed]
t151-tool/unknown,now 1.0 all [installed,upgradable to: 2.0]

依存関係で追加された t151-libnew には automatic(自動インストール)の印が付いています。この印は、後述の autoremove の対象を決めるのに使われます。

-s(シミュレーション)の読み方

-s を付けると、実際には何も変更せず、行われる予定の操作だけを表示します。一般ユーザーでも実行できます。

行の先頭 意味
Inst パッケージ [現在] (新しい版 取得元) インストールまたは更新する
Conf パッケージ (版) 設定を行う
Remv パッケージ [版] 削除する
Purg パッケージ [版] 設定ファイルごと削除する

aptとapt-get・apt-cache・dpkgの違いと対応表

それぞれの役割

コマンド 役割 依存関係の解決 リポジトリからの取得
dpkg .deb ファイルを1つずつ展開・設定・削除する土台 しない しない
apt-get インストール・更新・削除 する する
apt-cache パッケージ情報の検索・表示 ― ―(手元の一覧を読む)
apt-mark 自動/手動の印、hold の管理 ― ―
apt 上の機能のうち日常でよく使うものを1つにまとめた、対話向けのコマンド する する

apt は apt-get と apt-cache の機能のうち日常でよく使うものをまとめ、人が端末で使うのに向いた既定値(進捗バーや色つき表示など)を有効にしたコマンドです。apt --help にも「apt-get や apt-cache と同じ機能を提供し、対話的な利用に向いたオプションを既定で有効にしている」という趣旨の説明があります。

対応一覧表

やりたいこと apt apt-get / apt-cache / apt-mark dpkg
一覧の更新 apt update apt-get update ―
更新(追加あり) apt upgrade apt-get upgrade --with-new-pkgs ―
更新(追加・削除あり) apt full-upgrade apt-get dist-upgrade ―
インストール apt install pkg apt-get install pkg dpkg -i ファイル.deb
ローカルの .deb を入れる apt install ./ファイル.deb apt-get install ./ファイル.deb dpkg -i ファイル.deb(依存は自分で解決)
再インストール apt reinstall pkg apt-get install --reinstall pkg ―
削除 apt remove pkg apt-get remove pkg dpkg -r pkg
設定ごと削除 apt purge pkg apt-get purge pkg dpkg -P pkg
不要な依存の削除 apt autoremove apt-get autoremove ―
キャッシュの削除 apt clean apt-get clean ―
検索 apt search 語 apt-cache search 語 ―
詳細表示 apt show pkg apt-cache show pkg dpkg -s pkg(インストール済み)
一覧 apt list --installed ― dpkg -l、dpkg-query -W
バージョンと取得元 apt policy pkg apt-cache policy pkg ―
選べるバージョン一覧 apt list -a pkg apt-cache madison pkg ―
依存関係 apt depends pkg apt-cache depends pkg ―
逆依存 apt rdepends pkg apt-cache rdepends pkg ―
更新の固定 ― apt-mark hold pkg ―
ファイル → パッケージ ― ― dpkg -S /パス
パッケージ → ファイル ― ― dpkg -L pkg
ダウンロードだけ apt download pkg apt-get download pkg ―
リポジトリ設定の編集 apt edit-sources ― ―

apt と apt-get の動きの違い

今回の検証で確認できた違いです。

項目 apt apt-get
upgrade での新規パッケージ追加 許可する 許可しない(--with-new-pkgs で許可)
update 後の案内 N packages can be upgraded. を表示 表示しない
端末以外へ出力したとき 警告文を表示する 表示しない
ロックが取れないとき 既定で最大120秒待つ すぐにエラーで終了する
一覧・検索 list、search、show を持つ apt-cache に分かれている
出力の形式 見やすさを優先して変わることがある 互換性を保つ

ロックの待ち時間は、apt-config dump で確認した設定値(Binary::apt::DPkg::Lock::Timeout "120";)です。

スクリプトではapt-getを使う理由

apt の出力をパイプやファイルへ渡すと、標準エラー出力に次の警告が表示されます。

$ apt list --installed | grep t151

WARNING: apt does not have a stable CLI interface. Use with caution in scripts.

t151-oldplugin/unknown,now 1.0 all [installed]
t151-simple/unknown,now 2.0 all [installed]
t151-tool/unknown,now 1.0 all [installed,upgradable to: 2.0]

「apt のコマンドライン表示は安定したインターフェースではないので、スクリプトでは注意して使ってください」という案内です。apt は人が読むための表示を改善し続ける方針のため、バージョンによって出力の形が変わることがあります。出力を解析するスクリプトや、Dockerfile・CI の設定では、互換性を保つ apt-get・apt-cache・dpkg-query を使うと長く安定して動きます。

場面 使うコマンド
端末で手入力する apt
シェルスクリプト・Dockerfile・CI apt-get、apt-cache
インストール済みかを機械的に調べる dpkg-query -W、dpkg -s

インストール済みパッケージを名前とバージョンだけで取り出す例です。

$ dpkg-query -W -f='${Package} ${Version}\n' 't151-*'
t151-oldplugin 1.0
t151-simple 2.0
t151-tool 1.0

スクリプトや Dockerfile でよく使われる形は次のとおりです。

#!/bin/bash
set -euo pipefail
export DEBIAN_FRONTEND=noninteractive   # 対話的な質問を出さない

apt-get update
apt-get install -y --no-install-recommends curl ca-certificates
apt-get clean
rm -rf /var/lib/apt/lists/*             # イメージを小さくしたいとき

DEBIAN_FRONTEND=noninteractive は設定の質問を出さず既定値で進める指定、-y は確認への自動応答です。ロックを待たせたいときは -o DPkg::Lock::Timeout=60 を加えます。

Dockerfile では、apt-get update と apt-get install を同じ RUN に書くのが定番です。別々の RUN にすると、update の結果だけがキャッシュされ、あとで install を変更したときに以前の一覧情報が使われて Unable to locate package につながることがあります。

インストール(apt install)の使い方

基本とよく使うオプション

sudo apt update
sudo apt install sqlite3            # 1つ
sudo apt install curl git tmux      # 複数
sudo apt install -y sqlite3         # 確認を省略
sudo apt install ./package.deb      # ローカルの .deb(依存関係も解決)
オプション 内容
-y 確認に yes と答える
-s シミュレーション
--no-install-recommends 推奨(Recommends)を入れない
--install-suggests 提案(Suggests)も入れる
--only-upgrade インストール済みの場合だけ更新する
--reinstall 同じバージョンを入れ直す
--allow-downgrades -y と併用時にダウングレードを許可する
-d / --download-only ダウンロードだけ行う
-f / --fix-broken 壊れた依存関係の修復を試みる

バージョンを指定してインストールする

まず、選べるバージョンを確認します。

$ apt-cache madison curl
      curl | 8.5.0-2ubuntu10.15 | http://archive.ubuntu.com/ubuntu noble-updates/main amd64 Packages
      curl | 8.5.0-2ubuntu10.15 | http://security.ubuntu.com/ubuntu noble-security/main amd64 Packages
      curl | 8.5.0-2ubuntu10 | http://archive.ubuntu.com/ubuntu noble/main amd64 Packages

パッケージ名=バージョン の形で指定します。検証用パッケージを 2.0 から 1.0 に戻した結果です。

$ apt-get install -y t151-simple=1.0
The following packages will be DOWNGRADED:
  t151-simple
0 upgraded, 0 newly installed, 1 downgraded, 0 to remove and 1 not upgraded.
E: Packages were downgraded and -y was used without --allow-downgrades.

$ apt-get install -y --allow-downgrades t151-simple=1.0
The following packages will be DOWNGRADED:
  t151-simple
0 upgraded, 0 newly installed, 1 downgraded, 0 to remove and 1 not upgraded.
dpkg: warning: downgrading t151-simple from 2.0 to 1.0
Unpacking t151-simple (1.0) over (2.0) ...
Setting up t151-simple (1.0) ...

-y を付けた状態でのダウングレードには --allow-downgrades が必要です。 -y を付けずに実行した場合は、確認の質問に答える形で進められます。

バージョンを指定してインストールしても、次の apt upgrade で新しいバージョンに更新されます。そのバージョンにとどめたいときは、後述の apt-mark hold を組み合わせます。

--no-install-recommends の効果

パッケージには、必須の依存(Depends)のほかに、推奨(Recommends)と提案(Suggests)があります。apt は既定で推奨パッケージもインストールします。

関係 意味 既定の動き
Depends これがないと動かない 必ず入る
Recommends ほとんどの使い方で一緒に入れるとよい 入る
Suggests あると便利 入らない

t151-withrec(Depends: t151-libnew、Recommends: t151-extra)で比べました。

$ apt-get -s install t151-withrec
The following additional packages will be installed:
  t151-extra
The following NEW packages will be installed:
  t151-extra t151-withrec
0 upgraded, 2 newly installed, 0 to remove and 2 not upgraded.

$ apt-get -s install --no-install-recommends t151-withrec
Recommended packages:
  t151-extra
The following NEW packages will be installed:
  t151-withrec
0 upgraded, 1 newly installed, 0 to remove and 2 not upgraded.

--no-install-recommends を付けると、推奨パッケージは「Recommended packages:」として名前が表示されるだけになります。実際のパッケージでも、apt-get -s install vim-gtk3 は検証環境で「19 newly installed」、--no-install-recommends を付けると「18 newly installed」でした。差の大きさはパッケージによって変わります。コンテナのイメージのように容量を抑えたい場面で役立ちます。

再インストール(reinstall)

apt reinstall パッケージ名(apt-get では install --reinstall)は、設定は変えずにパッケージのファイルを入れ直します。誤って消したファイルを元に戻したいときに使えます。検証では 0 upgraded, 0 newly installed, 1 reinstalled と表示され、Unpacking t151-app (2.0) over (2.0) ... と同じバージョンが上書きされました。

削除(remove・purge・autoremove)の違い

コマンド プログラム本体 /etc などの設定ファイル 自動で入った依存パッケージ
apt remove pkg 削除 残す 残す
apt purge pkg 削除 削除 残す
apt autoremove ― ― 不要になったものを削除
apt autoremove --purge ― ― 設定ファイルごと削除
apt remove --autoremove pkg 削除 残す 不要になるものも一緒に削除

remove は設定ファイルを残す

設定ファイル /etc/t151-simple.conf を持つパッケージで確認しました。設定を書き換えてから remove します。

$ echo color=red > /etc/t151-simple.conf
$ apt-get remove -y t151-simple
The following packages will be REMOVED:
  t151-simple
Removing t151-simple (1.0) ...
$ dpkg -l t151-simple | tail -1
rc  t151-simple    1.0          all          demo package t151-simple
$ ls -l /etc/t151-simple.conf
-rw-r--r-- 1 root root 10 Oct  2 10:27 /etc/t151-simple.conf

dpkg -l の先頭が rc になりました。r は「削除済み」、c は「設定ファイルが残っている」という意味です。 同じパッケージをもう一度インストールすると、残っている設定がそのまま使われます。

purge は設定ファイルも削除する

$ apt-get purge -y t151-simple
The following packages will be REMOVED:
  t151-simple*
Purging configuration files for t151-simple (1.0) ...
$ dpkg -l t151-simple | tail -1
dpkg-query: no packages found matching t151-simple
$ ls -l /etc/t151-simple.conf
ls: cannot access '/etc/t151-simple.conf': No such file or directory

パッケージ名の後ろの * は、purge の対象であることを示す印です。ホームディレクトリに作られた個人の設定ファイル(~/.config など)は、purge でも削除されません。

rc 状態のパッケージをまとめて確認するには次のようにします。

dpkg -l | grep '^rc'

autoremove は「自動で入り、今は不要なもの」を削除する

依存関係で自動的に入ったパッケージは、それを必要としていたパッケージを削除しても残ります。

$ apt-get remove -y t151-app t151-withrec
The following packages will be REMOVED:
  t151-app t151-withrec
Removing t151-app (2.0) ...
Removing t151-withrec (1.0) ...
$ apt-mark showauto t151-libnew
t151-libnew
$ apt-get -s autoremove
The following packages will be REMOVED:
0 upgraded, 0 newly installed, 2 to remove and 1 not upgraded.
Remv cron-daemon-common [3.0pl1-184ubuntu2]
Remv t151-libnew [1.0]

t151-libnew が削除対象になりました。ここで注目したいのは、検証用ではない cron-daemon-common も対象に入っている点です。これは以前に別のパッケージの依存として入り、今はどこからも必要とされていないと判定されたものです。

autoremove は、自分が直前に削除したパッケージの関連だけでなく、システム全体で不要と判定されたものをまとめて削除します。実行前に apt-get -s autoremove で対象を確認し、残したいものがあれば apt-mark manual パッケージ名 で「手動インストール」の印に変えておくと安心です。

自動/手動の印は apt-mark showauto・apt-mark showmanual で一覧でき、sudo apt-mark auto パッケージ名 で自動扱いに戻せます。

検索と情報表示(search・show・list・policy)

apt search:名前と説明から探す

$ apt search --names-only '^sqlite3'
Sorting...
Full Text Search...
sqlite3/noble-updates,noble-security,now 3.45.1-1ubuntu2.8 amd64 [installed]
  Command line interface for SQLite 3

sqlite3-doc/noble-updates,noble-security 3.45.1-1ubuntu2.8 all
  SQLite 3 documentation

sqlite3-tools/noble-updates,noble-security 3.45.1-1ubuntu2.8 amd64
  Command line interface for SQLite 3 (tools)

apt search は説明文も検索するため、短い語では結果が多くなります。--names-only で名前だけに絞り、^ や $ の正規表現で前方一致・後方一致にすると探しやすくなります。1行ずつの簡潔な表示がほしいときは apt-cache search --names-only '^nginx' のように apt-cache search を使うと、「名前 - 説明」の形式で表示されます。

apt show:詳細を見る

$ apt show sqlite3
Package: sqlite3
Version: 3.45.1-1ubuntu2.8
Installed-Size: 584 kB
Depends: libc6 (>= 2.34), libreadline8t64 (>= 6.0), libsqlite3-0 (= 3.45.1-1ubuntu2.8), zlib1g (>= 1:1.2.0)
Suggests: sqlite3-doc
Homepage: https://www.sqlite.org/
Download-Size: 144 kB
APT-Manual-Installed: yes
APT-Sources: http://archive.ubuntu.com/ubuntu noble-updates/main amd64 Packages
Description: Command line interface for SQLite 3

(一部の行を省略しています。)インストール前に、依存関係(Depends)とサイズ(Installed-Size)を確認できます。

apt list:一覧を見る

$ apt list --installed | head -4
Listing...
7zip/noble,now 23.01+dfsg-11 amd64 [installed]
acl/noble-updates,now 2.3.2-1build1.1 amd64 [installed]
adduser/noble,now 3.137ubuntu1 all [installed]

--installed のほか、--upgradable(更新できるもの)、-a パッケージ名(選べる全バージョン)が使えます。1行の形式は 名前/取得元 バージョン アーキテクチャ [状態] です。状態欄は次のように読みます。

状態 意味
[installed] 手動でインストールした
[installed,automatic] 依存関係で自動的に入った
[installed,local] リポジトリにないパッケージ(.deb を直接入れたなど)
[installed,upgradable to: X] X に更新できる
[residual-config] 削除済みで設定ファイルが残っている

apt policy:インストール済みと候補のバージョンを見る

$ apt-cache policy curl
curl:
  Installed: 8.5.0-2ubuntu10.15
  Candidate: 8.5.0-2ubuntu10.15
  Version table:
 *** 8.5.0-2ubuntu10.15 500
        500 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 Packages
        500 http://security.ubuntu.com/ubuntu noble-security/main amd64 Packages
        100 /var/lib/dpkg/status
     8.5.0-2ubuntu10 500
        500 http://archive.ubuntu.com/ubuntu noble/main amd64 Packages
項目 意味
Installed 現在入っているバージョン(未インストールは (none))
Candidate install や upgrade で選ばれるバージョン
*** 現在入っているバージョンの印
500 / 100 優先度。数字が大きい取得元が優先される

「install したのに思ったバージョンにならない」というときは、Candidate と取得元を確認すると理由がわかります。

依存関係は apt-cache depends パッケージ名、そのパッケージを必要としているものは apt-cache rdepends --installed パッケージ名 で調べられます。削除の影響範囲を知りたいときに使えます。

apt-mark holdでバージョンを固定する

apt-mark hold を付けたパッケージは、upgrade や full-upgrade の対象から外れます。

$ apt-mark hold t151-tool
t151-tool set on hold.
$ apt-mark showhold
t151-tool
$ apt-get -s full-upgrade
The following packages have been kept back:
  t151-tool
0 upgraded, 0 newly installed, 0 to remove and 1 not upgraded.
$ apt-mark unhold t151-tool
Canceled hold on t151-tool.

先ほどは full-upgrade で更新された t151-tool が、hold 中は保留になりました。なお、hold 中でもパッケージ名を直接指定した install は実行できます。

$ apt-get -s install t151-tool
The following packages will be REMOVED:
  t151-oldplugin
The following held packages will be changed:
  t151-tool
The following packages will be upgraded:
  t151-tool

The following held packages will be changed: と表示され、対話的に実行した場合は確認を求められます。

固定したままにすると、不具合の修正やセキュリティ更新も届かなくなります。固定した理由と解除の予定をメモに残し、定期的に apt-mark showhold で見直す運用がおすすめです。

どのパッケージのファイルか調べる(dpkg -S / -L)

dpkg -S:ファイルからパッケージを調べる

$ dpkg -S /usr/bin/nohup
coreutils: /usr/bin/nohup
$ dpkg -S /etc/t151-simple.conf
t151-simple: /etc/t151-simple.conf
$ dpkg -S /opt/t151-demo/nothing.txt
dpkg-query: no path found matching pattern /opt/t151-demo/nothing.txt

コマンドの場所がわからないときは、dpkg -S "$(command -v コマンド名)" と組み合わせます。no path found は、そのファイルがどのパッケージにも属していない(手作業で置いた、pip や npm で入れたなど)ことを表します。

dpkg -L:パッケージに含まれるファイルを調べる

$ dpkg -L t151-simple
/.
/etc
/etc/t151-simple.conf
/opt
/opt/t151-demo
/opt/t151-demo/t151-simple.txt

インストールしたのにコマンド名がわからないときは、dpkg -L パッケージ名 | grep bin/ で実行ファイルを探せます。

まだインストールしていないパッケージを対象に「このファイルはどのパッケージに入っているか」を調べるには、apt-file という別パッケージを使います(sudo apt install apt-file → sudo apt-file update → apt-file search ファイル名)。検証環境には入っておらず、この記事では未実行です。

頻出エラーの原因と対処

実際に再現したエラー文と対処です。

E: Could not get lock /var/lib/dpkg/lock-frontend

別のプロセスがロックを持っている状態で apt-get install を実行しました。

E: Could not get lock /var/lib/dpkg/lock-frontend. It is held by process 15154 (python3)
E: Unable to acquire the dpkg frontend lock (/var/lib/dpkg/lock-frontend), is another process using it?

同じ状態で apt install を実行すると、エラーにはならず待機しました。

Waiting for cache lock: Could not get lock /var/lib/dpkg/lock-frontend. It is held by process 15154 (python3)...

apt update 側のロックでは、E: Could not get lock /var/lib/apt/lists/lock. と E: Unable to lock directory /var/lib/apt/lists/ が表示されました。

原因は、ほかの apt や dpkg(自動更新、別の端末、ソフトウェアの更新画面など)が動作中であることです。 メッセージに表示された PID を確認し、終わるのを待つのが基本の対処です。

手順 コマンド
ロックを持つプロセスを確認する ps -fp 表示されたPID
自動更新かを確認する ps aux | grep -E 'apt|dpkg|unattended'
終わるまで待って実行する sudo apt-get -o DPkg::Lock::Timeout=120 install pkg

処理中の dpkg を途中で止めたり、ロックファイルを手で消したりすると、パッケージの状態が中途半端になることがあります。待っても終わらず、該当プロセスが残っていないことを確認できた場合は、sudo dpkg --configure -a で中断された設定を完了させてから再実行します。

E: Unable to locate package

$ apt-get -s install t151-nothing
E: Unable to locate package t151-nothing

手元のパッケージ一覧に、その名前が見つからないときのエラーです。

原因 対処
apt update を実行していない(新しい環境やコンテナ) sudo apt update を実行する
パッケージ名の違い apt search 語 で正しい名前を探す
配布元(universe など)が有効になっていない sudo add-apt-repository universe などで有効にする
そのリリース向けに提供されていない 公式の配布方法(専用リポジトリなど)を確認する

コンテナの公式イメージは一覧情報を持たない状態で配布されていることが多く、最初に apt-get update を実行するとこのエラーは解消します。

NO_PUBKEY(The repository is not signed)

署名つきのリポジトリを、公開鍵を登録せずに追加して apt-get update を実行しました。

Err:1 file:/tmp/t151repo/repo3 ./ InRelease
  The following signatures couldn't be verified because the public key is not available: NO_PUBKEY 97C70BCC9DD37D5B
Reading package lists...
W: GPG error: file:/tmp/t151repo/repo3 ./ InRelease: The following signatures couldn't be verified because the public key is not available: NO_PUBKEY 97C70BCC9DD37D5B
E: The repository 'file:/tmp/t151repo/repo3 ./ InRelease' is not signed.

apt はリポジトリの署名を公開鍵で検証します。NO_PUBKEY は、そのリポジトリの署名を検証するための公開鍵が手元にないという意味です。 終了ステータスは 100 でした。

リポジトリの設定に signed-by= で公開鍵ファイルを指定すると、update が通りました。

$ echo "deb [signed-by=/tmp/t151repo/demo.gpg] file:/tmp/t151repo/repo3 ./" > /etc/apt/sources.list.d/demo.list
$ apt-get update
Get:1 file:/tmp/t151repo/repo3 ./ InRelease [771 B]
Get:2 file:/tmp/t151repo/repo3 ./ Packages [290 B]
Reading package lists...

外部のリポジトリを追加するときの一般的な手順は次の形です(URL は配布元の公式手順に従ってください。この形のコマンドは外部接続が必要なため未実行です)。

# 1. 公開鍵を /etc/apt/keyrings に保存する
sudo install -d -m 0755 /etc/apt/keyrings
curl -fsSL https://example.com/repo/gpg.key | sudo gpg --dearmor -o /etc/apt/keyrings/example.gpg

# 2. signed-by で鍵を指定してリポジトリを追加する
echo "deb [signed-by=/etc/apt/keyrings/example.gpg] https://example.com/repo stable main" \
  | sudo tee /etc/apt/sources.list.d/example.list

# 3. 一覧を更新する
sudo apt update

鍵は、そのリポジトリの配布元が公式に案内しているものを使います。鍵の期限が更新された場合(EXPKEYSIG と表示される場合)も、同じ手順で新しい鍵を保存し直します。

E: Unable to correct problems, you have held broken packages

依存関係を満たせないパッケージをインストールしようとした結果です。

$ apt-get -s install t151-needs9
Some packages could not be installed. (中略)
The following packages have unmet dependencies:
 t151-needs9 : Depends: t151-simple (>= 9.0) but it is not going to be installed
E: Unable to correct problems, you have held broken packages.

手がかりは The following packages have unmet dependencies: の行です。 この例では「t151-simple の 9.0 以上が必要だが、入手できるのは 2.0 まで」という状況です。メッセージに held とありますが、hold を設定していなくても表示されます。

実際のパッケージでも再現しました。curl だけを以前のバージョンに指定した場合です。

$ apt-get -s install curl=8.5.0-2ubuntu10
The following packages have unmet dependencies:
 curl : Depends: libcurl4t64 (= 8.5.0-2ubuntu10) but 8.5.0-2ubuntu10.15 is to be installed
E: Unable to correct problems, you have held broken packages.

curl は同じバージョンの libcurl4t64 を必要とするため、片方だけのバージョン指定では組み合わせが成立しません。

原因 対処
バージョン指定が依存先と合っていない 依存先も同じバージョンで指定する(apt install curl=X libcurl4t64=X)
一覧情報が最新でない sudo apt update のあとに再実行する
hold 中のパッケージが更新を止めている apt-mark showhold で確認し、必要なら unhold
別のリリース向けのリポジトリが混ざっている apt-cache policy パッケージ名 で取得元を確認する
前回の処理が途中で終わっている sudo apt --fix-broken install、sudo dpkg --configure -a

定期的な更新の手順とチェックリスト

サーバーや開発用マシンを更新するときの流れです。

sudo apt update                 # 1. 一覧を最新にする
apt list --upgradable           # 2. 更新されるものを確認する
apt-get -s upgrade | tail -n 5  # 3. 追加・削除・保留の件数を確認する
sudo apt upgrade                # 4. 更新する
sudo apt autoremove             # 5. 不要になったものを確認して削除する

更新の前後では、削除されるパッケージ(will be REMOVED の欄)、固定中のパッケージ(apt-mark showhold)、ディスクの空き(df -h /)、再起動の要否(/var/run/reboot-required の有無)を確認しておくと安心です。

/var/log/apt/history.log には、実行したコマンド(Commandline)と変更されたパッケージが、開始・終了の日時つきで残ります。

よくある質問

Q. apt update と apt upgrade はどちらを先に実行しますか? A. apt update が先です。update でパッケージ一覧の情報を最新にし、そのあと upgrade でインストール済みのパッケージを更新します。今回の検証でも、update を実行するまでは更新できるパッケージが0件と表示され、update のあとに3件が見つかりました。sudo apt update && sudo apt upgrade と続けて書くのが定番です。

Q. apt と apt-get はどちらを使えばよいですか? A. 端末で手入力するときは apt、シェルスクリプトや Dockerfile では apt-get が向いています。apt は出力をパイプへ渡すと「apt does not have a stable CLI interface」という警告を表示し、表示形式がバージョンで変わることがあるためです。機能面では、apt upgrade が新しいパッケージの追加を許可する点が apt-get upgrade との違いです。

Q. apt upgrade と apt full-upgrade はどう使い分けますか? A. ふだんの更新は apt upgrade で行い、「kept back」が残ったときに apt-get -s full-upgrade で削除されるパッケージを確認してから apt full-upgrade を実行する流れがおすすめです。upgrade は既存パッケージを削除せず、full-upgrade は更新に必要であれば削除も行います。

まとめ

  • apt update は一覧の情報を更新するだけ、apt upgrade はパッケージ本体を更新する。update を先に実行する
  • apt-get upgrade は追加も削除もしない、apt upgrade は追加まで、full-upgrade(dist-upgrade)は削除まで行う
  • 「kept back」はエラーではなく保留。apt-get -s full-upgrade で必要な操作を確認する
  • apt は対話向け、apt-get・apt-cache・dpkg-query はスクリプト向け。apt をパイプに渡すと警告が表示される
  • remove は設定を残し(状態 rc)、purge は設定も削除する。autoremove はシステム全体の不要な依存が対象なので、-s で確認してから実行する
  • バージョン指定は pkg=バージョン、固定は apt-mark hold、ファイルの持ち主は dpkg -S、中身は dpkg -L
  • エラーはメッセージの読みどころが決まっている。lock は「待つ」、locate は「update と名前」、NO_PUBKEY は「signed-by」、held broken は「unmet dependencies の行」

本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。

(記載例)出典:株式会社RJC「aptコマンド一覧|updateとupgradeの違い・apt-getとの違い」

株式会社RJCでは、aptをはじめとするLinuxのパッケージ管理を仲間と学び合っています。こうした知識を共有しながら、日々技術を磨いています。

株式会社RJC ― SI事業・SES事業・AI駆動開発。RJCは一緒に成長を楽しめる会社です。

WE ARE HIRING

RJCで一緒に開発しながら、
成長を楽しみませんか?

RJCは、Web・モバイル・AIを活用した開発プロジェクトで、テックリードやPM・PMOも活躍するシステム開発会社です。会社を知る、待遇を確かめる、話を聞いてみる。気になるところ見てみてください!

  • 127日年間休日
  • 12時間平均残業時間
  • 毎日ガチャ遊びココロも大切にする福利厚生。アマギフなどの賞品ラインナップ!

ほかにも、チケットレストラン、書籍読み放題、2年ごとの慰労報奨(休暇 or 金一封)、11期連続の黒字決算。

ABOUT RJC RJCがどんな会社か知る 考え方、研修、働き方、福利厚生、社員の前職まで。RJCのことが丸わかり! RJC丸わかりページへ JOB DESCRIPTION 仕事内容・待遇を見てみる 仕事内容、給与・待遇、選考の流れ。経験者も未経験も!応募前に知りたいこと、まとめました! 募集要項を見る ENTRY エントリーする エントリーは1〜2分・履歴書不要です。まずは話を聞いてみたい、という方でも歓迎です! エントリーフォームへ

RJCで一緒に開発しながら、 成長を楽しみませんか?