パッケージ管理入門 - apt/yumの基本操作と使い分け

パッケージ管理入門 - apt/yumの基本操作と使い分け

この記事でできるようになること

  • apt と dnf のコマンド対応を根拠を持って使い分けられる
  • インストール前に影響範囲を確認して安全に実行できる
  • 定番のパッケージ管理エラーを手順に沿って切り分けられる

前提知識(先に読むと理解しやすい記事)

この記事で解決できること

  • aptyum/dnfコマンド対応関係 が頭に入ります。
  • 検索・インストール・更新・削除の 実務で迷わない型 が身につきます。
  • インストール前に 影響範囲を確認 して安全に実行できます。
  • updateupgrade の違い」「yumdnf どちらを使うか」を 根拠を持って判断 できます。
  • Unable to locate package / package not found などの 定番エラーを切り分け できます。

結論(実務の型)

  • apt(Debian/Ubuntu/Mint 系)と dnf(RHEL 9 / Rocky / AlmaLinux / Fedora)が 現行スタンダード
  • yum は CentOS 7 系・RHEL 7 系まで。RHEL 8 以降は dnf が標準(yumdnf への互換シンボリックリンク)
  • 最初に必ず 一覧更新apt update / dnf makecache)→ 次にインストール
  • 何かを入れる前に 検索で正式名を確認 する。「ありそうな名前」で install しない

前提(対象環境)

  • Debian 系:Ubuntu 20.04 / 22.04 / 24.04、Debian 11 / 12
  • RHEL 系:CentOS 7(yum)、Rocky Linux 8/9・AlmaLinux 8/9・RHEL 8/9(dnf)
  • 一般ユーザーから sudo で実行する想定。root 直接ログインは想定しない

0. 先に用語を 6 つ揃える

結論: パッケージ・リポジトリ・インデックス・依存関係の 4 語が分かれば、エラー文の大半は読める。

パッケージ管理のエラーメッセージは、用語を知らないと意味が取れません。 先に最小限の 6 語を定義します。

用語 一行の意味 混同されやすい言い方
パッケージ ソフトウェア 1 本を配布用にまとめたファイル 「.deb」「.rpm」も同じものを指します
リポジトリ パッケージの配布元となるサーバ 「リポ」「repo」「配布元」とも呼ばれます
インデックス(一覧) リポジトリにどのパッケージがあるかを記した目録 「パッケージ一覧」「キャッシュ」とも言います
依存関係 あるパッケージが動くために必要な別のパッケージ 「dependency」「依存パッケージ」も同義です
メタパッケージ 中身は空で、複数パッケージをまとめて入れるための箱 「まとめパッケージ」とも呼ばれます
GPG キー 配布元が本物かを検証するための電子署名の鍵 「署名鍵」「公開鍵」も同じものを指します

apt update は「インデックスを更新する」操作です。パッケージ本体は更新しません。 パッケージ本体を新しくするのは apt upgrade です。この 2 つを取り違えるのが最も多い誤解です。

1. apt と yum/dnf の対応表

結論: install / remove / search は両系統で共通し、違うのは update まわりと設定ファイル削除の表現だけ。

実務で参照頻度が高い対応関係を 1 つにまとめる。

操作 Debian 系 (apt) RHEL 系 (dnf / yum)
パッケージ一覧(インデックス)の更新 sudo apt update sudo dnf makecache
更新可能パッケージの確認 apt list --upgradable dnf check-update
インストール sudo apt install <pkg> sudo dnf install <pkg>
アップグレード(全体) sudo apt upgrade sudo dnf upgrade
削除(設定残す) sudo apt remove <pkg> sudo dnf remove <pkg>
削除(設定も消す) sudo apt purge <pkg> (該当なし/手動削除)
検索 apt search <kw> dnf search <kw>
情報表示 apt show <pkg> dnf info <pkg>
導入済み一覧 apt list --installed dnf list installed
自動導入の不要パッケージ整理 sudo apt autoremove sudo dnf autoremove
キャッシュクリア sudo apt clean sudo dnf clean all
リポジトリ一覧 apt policy dnf repolist

覚え方のコツinstall / remove / search共通。違うのは update まわりと「設定ファイルまで消すか」の表現。

2. apt:最低限の流れ

結論: apt は update で一覧更新してから install・検索・upgrade・remove/purge の順で操作するのが基本。

ここからはシステムを実際に変更するコマンドです。 何が変わるか戻し方を先に押さえてください。

コマンド 実行すると何が変わるか 戻し方 安全に試す方法
update パッケージ一覧(インデックス)だけが新しくなる 戻す必要なし(システムは変わらない) そのまま実行してよい
install パッケージ本体と依存パッケージが入る remove で削除 apt-get install -s <pkg> で予定だけ確認
upgrade 既存パッケージのバージョンが上がる 個別にバージョン指定して戻す(手間大) apt list --upgradable で対象を先に一覧
remove 実行ファイルが消える(設定ファイルは残る) install で入れ直す apt-get remove -s <pkg> で削除範囲を確認
purge 実行ファイルと /etc/ 配下の設定ファイルが消える 設定は復元不可。事前バックアップが必要 先に設定ファイルを控えてから実行
autoremove 「不要」と判定された依存パッケージがまとめて消える 個別に install で入れ直す 実行前に表示される削除一覧を必ず読む

2-1. 一覧更新 → インストール

$ sudo apt update
$ sudo apt install nginx

apt update省略するとインストールに失敗することがある(古いインデックスを参照して 404)。新規 VM や久々のサーバでは必ず先に実行する。

2-2. 検索(名前があやふやなとき)

$ apt search nginx
$ apt show nginx

apt search説明文も含めて 全文検索される。「nginx で検索したのに大量に出てくる」のはこのため。正式名だけに絞るには apt list 'nginx*' のようにパターンで絞る方が確実。

$ apt list 'nginx*'
Listing... Done
nginx/jammy-updates 1.18.0-6ubuntu14.4 amd64
nginx-common/jammy-updates 1.18.0-6ubuntu14.4 all
nginx-core/jammy-updates 1.18.0-6ubuntu14.4 amd64

パッケージ名/配布元 バージョン アーキテクチャ の順に並びます。

導入済みのものだけを見たい場合は次のようにします。

$ apt list --installed 2>/dev/null | grep nginx

2-3. アップグレード

$ sudo apt update
$ sudo apt upgrade           # 既存パッケージのバージョン更新
$ sudo apt full-upgrade      # 依存解決のため削除も許容(カーネル更新等)

apt upgradeapt full-upgrade(旧 dist-upgrade)は別物。カーネルや systemd の大規模更新では full-upgrade が必要なケースがある。本番サーバでは事前に変更点を確認すること。

2-4. 削除

$ sudo apt remove nginx      # バイナリだけ削除(設定ファイルは残る)
$ sudo apt purge nginx       # 設定ファイルも削除
$ sudo apt autoremove        # 依存で入った不要パッケージを掃除

apt remove/etc/ 配下の設定を残す。再インストール時に「前の設定が生きていて挙動が変」と感じたら purge で消す。

3. yum / dnf:最低限の流れ

結論: RHEL 8 以降は dnf が標準で yum は互換リンク。スクリプトでは dnf を直接書く方が将来も安全。

3-1. yum と dnf の関係

  • CentOS 7 / RHEL 7yum がネイティブ
  • CentOS 8 / Rocky 8 以降・RHEL 8 以降・Fedoradnf がネイティブ。yum コマンドは dnf への互換シンボリックリンク(実体は /usr/bin/dnf-3 などにリンク)

RHEL 8+ で yum install ... と打っても動くが、実行されているのは dnf。スクリプトを書くときは dnf を直接書く方が将来も安全。

3-2. 基本操作

$ sudo dnf check-update           # 更新可能パッケージの確認
$ sudo dnf install nginx
$ sudo dnf upgrade                # 全体アップグレード
$ sudo dnf remove nginx
$ dnf search nginx
$ dnf info nginx
$ dnf list installed | grep nginx

dnf remove <pkg> は、そのパッケージに依存している別のパッケージも一緒に削除対象へ入れます。 実行前に表示される削除一覧を読み、想定外のものが含まれていないか確認してください。 RHEL 系は dnf history undo <ID> で直前のトランザクションを巻き戻せます(手順は後述)。

3-3. グループインストール(dnf 特有の便利機能)

開発ツール一式など、関連パッケージをまとめて入れる。

$ dnf grouplist
$ sudo dnf groupinstall "Development Tools"

Debian 系では同等の概念は薄く、build-essential のような メタパッケージ に依存させる方式が一般的。

$ sudo apt install build-essential

結論: 名前で絞る・ファイルから逆引きする・公式名を確認する、の 3 手で大半の検索は片付く。

「パッケージ名を覚えていない」が一番多いトラブル。次の 3 手で大半は片付く。

4-1. 名前で絞る

# Debian 系
$ apt list 'php*' 2>/dev/null

# RHEL 系
$ dnf list 'php*'

4-2. 何のファイルか分かっているとき(コマンドが先に分かっている)

apt-file / dnf providesファイルパスからパッケージを逆引きできる。

# Debian 系(apt-file は別途インストールが必要)
$ sudo apt install apt-file
$ sudo apt-file update
$ apt-file search /usr/bin/htop

# RHEL 系(標準で使える)
$ dnf provides /usr/bin/htop
$ dnf provides '*/sshd_config'

command not found で詰まったときは、まず dnf provides / apt-file search でどのパッケージに入っているかを特定するのが最短。

4-3. 公式名を確認

$ apt show nginx
$ dnf info nginx

Version / Source / Homepage を確認すれば、目的のソフトウェアか同名の別物か が分かる。

5. リポジトリの確認と追加

結論: 有効リポジトリを確認し、追加は公式ベンダーのみ、GPG キーのフィンガープリント照合を必ず行う。

5-1. 現在有効なリポジトリ

# Debian 系
$ apt policy                              # 各パッケージのソース優先度
$ ls /etc/apt/sources.list.d/             # 追加リポジトリの設定ファイル
$ cat /etc/apt/sources.list

# RHEL 系
$ dnf repolist                            # 有効なリポジトリ一覧
$ dnf repolist --all                      # 無効リポジトリも含めて表示
$ ls /etc/yum.repos.d/

5-2. 公式ではないリポジトリを追加する場合の注意

サードパーティリポジトリは攻撃面が広がる

  • 信頼できるベンダー公式(Docker、PostgreSQL、Node.js NodeSource 等)のみ追加する
  • 追加時は GPG キーのフィンガープリント を公式手順で照合する
  • 「とりあえず curl ... | sudo bash」は本番サーバでは避ける

5-3. リポジトリ追加の現代的な手順(Debian 系)

Ubuntu 22.04 以降は apt-key が非推奨。/etc/apt/keyrings/ 配下に GPG キーを置き、signed-by= でリポジトリ定義から参照する方式が推奨。

# キー配置(公式手順に従う)
$ sudo install -d -m 0755 /etc/apt/keyrings
$ curl -fsSL https://download.example.com/key.gpg \
    | sudo tee /etc/apt/keyrings/example.gpg > /dev/null

# リポジトリ定義
$ echo "deb [signed-by=/etc/apt/keyrings/example.gpg] https://download.example.com/apt stable main" \
    | sudo tee /etc/apt/sources.list.d/example.list
$ sudo apt update

5-4. フィンガープリントの照合方法

フィンガープリント(指紋)とは、鍵を短い文字列に要約した識別子である。同じ鍵なら必ず同じ値になるため、これを突き合わせれば「配布元が用意した本物の鍵か」を確認できる。

配置した鍵の指紋を表示し、ベンダー公式サイトに記載された値と 1 文字ずつ突き合わせる。表示するだけのコマンドなので何度でも実行してよい。

$ gpg --show-keys --fingerprint /etc/apt/keyrings/example.gpg

一致しない場合、その鍵は公式のものではない。追加を中止し、/etc/apt/keyrings//etc/apt/sources.list.d/ に置いたファイルを削除する。

6. 定番トラブルの切り分け

結論: パッケージ未検出・ロック・GPG エラー・ディスク不足が定番で、それぞれ決まった切り分け手順がある。

6-1. Unable to locate package <pkg>(apt)

原因の優先度:

  1. apt update を実行していない
  2. パッケージ名が違う(python ではなく python3 等)
  3. リポジトリ自体が無効(universe / multiverse が無効化されている等)

切り分け:

$ sudo apt update
$ apt search <近い単語>
$ apt-cache policy <pkg>

6-2. No match for argument(dnf)

ほぼ同じ。dnf clean all && sudo dnf makecacheメタデータを作り直すと治ることがある。

$ sudo dnf clean all
$ sudo dnf makecache
$ dnf search <近い単語>

6-3. Could not get lock /var/lib/dpkg/lock

別の apt プロセスが動作中、または前回異常終了した残骸。

ロックファイルの中身は空である。apt / dpkg は「ファイルが存在するか」ではなく flock(ファイルに掛ける排他ロック)で排他している。 つまり「ファイルがあるから消す」という発想自体が誤りで、削除は誰も掴んでいないことを確認した後の最終手段である。

まず、4 つのロックファイルを誰かが掴んでいないかを確認する。lsof は表示するだけで何も変更しない。

$ sudo lsof /var/lib/dpkg/lock-frontend /var/lib/dpkg/lock \
    /var/cache/apt/archives/lock /var/lib/apt/lists/lock

出力が空であれば、掴んでいるプロセスはない。その場合に限り削除してよい。

$ sudo rm /var/lib/dpkg/lock-frontend
$ sudo rm /var/lib/dpkg/lock
$ sudo rm /var/cache/apt/archives/lock
$ sudo rm /var/lib/apt/lists/lock
$ sudo dpkg --configure -a

6-4. GPG エラー(NO_PUBKEY / Signature couldn't be verified

サードパーティリポジトリのキー期限切れ、または不正に追加されたリポジトリ。

$ sudo apt update
# → NO_PUBKEY ABCD1234... が表示される

対処は 公式手順で正規のキーを再取得して /etc/apt/keyrings/ 配下に置き直す。期限切れと判明していない apt-key 削除や --allow-unauthenticated は使わない。

6-5. ディスク不足でインストール失敗

$ df -h /var /usr
$ sudo apt clean        # ダウンロード済み .deb を削除
$ sudo dnf clean all    # 同様にキャッシュを削除

/var/cache/apt/archives//var/cache/dnf/ が肥大化していることが多い。

7. 依存関係を壊さないための実務ルール

結論: 本番では事前確認なしの upgrade や curl | bash を避け、更新前の確認とロールバック手段を用意する。

やってはいけないこと

  • バージョン指定なしで本番サーバに apt upgrade をかける(直前に変更点を確認しないまま実行)
  • 公式手順を読まずに sudocurl ... | bash
  • --force-yes / --allow-downgrades を反射的に付ける
  • 複数のソースから同一パッケージを入れる(リポジトリ優先度の混乱)

安全に運用するチェックリスト

  1. インストール前に apt update / dnf makecache
  2. -s(apt のシミュレーション) で予定変更を確認できる:apt-get install -s <pkg>
  3. RHEL 系は トランザクション履歴 で巻き戻せる:
$ dnf history list
$ sudo dnf history undo <ID>
  1. apt list --upgradable で更新対象を一覧してから upgrade
  2. リポジトリ追加は GPG キーのフィンガープリント照合 を必ず実施

8. コピペ用テンプレート

結論: Debian 系と RHEL 系それぞれに初回設定から検索・更新・削除・巻き戻しまでの定型コマンドを用意した。

Debian / Ubuntu

# 初回セットアップ
sudo apt update && sudo apt upgrade -y

# 検索 → 情報確認 → インストール
apt list 'nginx*'
apt show nginx
sudo apt install nginx

# 更新対象だけ確認してから上げる
apt list --upgradable
sudo apt upgrade

# 削除(設定も含めて)
sudo apt purge nginx && sudo apt autoremove

RHEL / Rocky / AlmaLinux

# 初回セットアップ
sudo dnf upgrade -y

# 検索 → 情報確認 → インストール
dnf search nginx
dnf info nginx
sudo dnf install nginx

# 更新対象だけ確認
dnf check-update

# 履歴で巻き戻し
dnf history list
sudo dnf history undo <ID>

次に読む