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

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

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

  • 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 check-update)→ 次にインストール
  • 何かを入れる前に 検索で正式名を確認 する。「ありそうな名前」で 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 直接ログインは想定しない

1. apt と yum/dnf の対応表

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

操作 Debian 系 (apt) RHEL 系 (dnf / yum)
パッケージ一覧の更新 sudo apt update sudo 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:最低限の流れ

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*'
$ 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:最低限の流れ

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

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

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

$ dnf grouplist
$ sudo dnf groupinstall "Development Tools"

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

$ sudo apt install build-essential

「パッケージ名を覚えていない」が一番多いトラブル。次の 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. リポジトリの確認と追加

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

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

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 プロセスが動作中、または前回異常終了した残骸。

$ ps -ef | grep -E 'apt|dpkg' | grep -v grep
# プロセスが残っていない場合のみ:
$ sudo rm /var/lib/apt/lists/lock
$ sudo rm /var/lib/dpkg/lock-frontend
$ 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. 依存関係を壊さないための実務ルール

やってはいけないこと

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

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

  1. インストール前に apt update / dnf check-update
  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 / 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>

次に読む