パッケージ管理入門 - apt/yumの基本操作と使い分け
この記事でできるようになること
- apt と dnf のコマンド対応を根拠を持って使い分けられる
- インストール前に影響範囲を確認して安全に実行できる
- 定番のパッケージ管理エラーを手順に沿って切り分けられる
前提知識(先に読むと理解しやすい記事)
この記事で解決できること
aptとyum/dnfの コマンド対応関係 が頭に入ります。- 検索・インストール・更新・削除の 実務で迷わない型 が身につきます。
- インストール前に 影響範囲を確認 して安全に実行できます。
- 「
updateとupgradeの違い」「yumとdnfどちらを使うか」を 根拠を持って判断 できます。 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が標準(yumはdnfへの互換シンボリックリンク)- 最初に必ず 一覧更新(
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 で入れ直す |
実行前に表示される削除一覧を必ず読む |
purge と autoremove は削除範囲が広く、取り返しがつきにくい操作です。
purge は /etc/ 配下の設定ファイルまで消すので、独自に書いた設定はバックアップなしでは戻せません。
autoremove は判定を誤ると稼働中サービスの依存パッケージまで削除します。
どちらも実行前に「これから何が消えるか」の一覧を必ず読んでから y を押してください。
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 upgrade と apt 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 7:
yumがネイティブ - CentOS 8 / Rocky 8 以降・RHEL 8 以降・Fedora:
dnfがネイティブ。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
4. 検索の現実的な使い方
結論: 名前で絞る・ファイルから逆引きする・公式名を確認する、の 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 update5-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)
原因の優先度:
apt updateを実行していない- パッケージ名が違う(
pythonではなくpython3等) - リポジトリ自体が無効(
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
lock ファイルを 動作中のプロセスがある状態で削除すると dpkg のデータベースが壊れる。必ず lsof で空を確認してから実行すること。
詳細な切り分けは dpkg のロックが解除されないとき を参照。
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をかける(直前に変更点を確認しないまま実行) - 公式手順を読まずに
sudoでcurl ... | bash --force-yes/--allow-downgradesを反射的に付ける- 複数のソースから同一パッケージを入れる(リポジトリ優先度の混乱)
安全に運用するチェックリスト
- インストール前に
apt update/dnf makecache -s(apt のシミュレーション) で予定変更を確認できる:apt-get install -s <pkg>- RHEL 系は トランザクション履歴 で巻き戻せる:
$ dnf history list $ sudo dnf history undo <ID>
apt list --upgradableで更新対象を一覧してからupgrade- リポジトリ追加は 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>