Linuxパッケージマネージャー比較:apt vs yum vs dnf vs pacman

Linux tutorial - IT technology blog
Linux tutorial - IT technology blog

パッケージマネージャーが想像以上に重要な理由

新しいLinuxサーバーにSSH接続して最初に使うツールといえば、パッケージマネージャーです。ソフトウェアのインストール、依存関係の解決、システムの最新維持を一手に担います。初心者が戸惑うのは、ディストリビューションによってパッケージマネージャーが異なり、コマンドがそのまま使えないことです。

CentOSマシンでapt install nginxと入力して失敗した経験があれば、この壁にぶつかったことになります。本ガイドでは最も一般的な4つのパッケージマネージャー — aptyumdnfpacman — を解説し、どのディストリビューションでも迷わず使えるようにします。

どのディストリビューションにどのパッケージマネージャー?

  • apt — Debian、Ubuntu、Linux Mint、Pop!_OS
  • yum — CentOS 7、RHEL 7、旧バージョンのFedora
  • dnf — Fedora、CentOS 8+、RHEL 8+、AlmaLinux、Rocky Linux
  • pacman — Arch Linux、Manjaro、EndeavourOS

パッケージ形式も異なります。Debianベースは.debファイル、Red Hatベースは.rpmファイル、Archは.pkg.tar.zstを使用します。パッケージマネージャーはこれらの違いを吸収してくれます — コマンドを実行するだけで、あとはすべて自動処理されます。

インストール:システムにパッケージを導入する

同じ操作でもディストリビューションごとにコマンドが異なります。パターンを把握すれば、システムを切り替えても戸惑わなくなります。

パッケージのインストール

# apt(Debian/Ubuntu 向け)
sudo apt update && sudo apt install nginx

# yum(CentOS 7 / RHEL 7 向け)
sudo yum install nginx

# dnf(Fedora / CentOS 8+ / AlmaLinux 向け)
sudo dnf install nginx

# pacman(Arch Linux 向け)
sudo pacman -Syu nginx

aptを使う際に身につけておきたい習慣があります。インストール前に必ずapt updateを実行することです。これを省略するとパッケージインデックスが古いままとなり、古いバージョンをインストールしてしまったり、原因がわかりにくい依存関係エラーが発生したりすることがあります。

dnfはこのステップを自動で行います。インストール前にメタデータを自動更新するため、現在多くの人がyumよりdnfを好む主な理由となっています。

上記のpacmanコマンドは-Syではなく-Syuを使用していることに注目してください。Archでは新しいパッケージをインストールする前に、必ずシステム全体をアップグレードしてください。アップグレードなしでデータベースだけ更新すると部分アップグレード状態となり、わかりにくい不具合が発生する可能性があります。

パッケージの削除

# apt
sudo apt remove nginx
# 残存した設定ファイルも削除する場合:
sudo apt purge nginx

# yum / dnf
sudo yum remove nginx
sudo dnf remove nginx

# pacman
sudo pacman -R nginx
# 未使用の依存パッケージも一緒に削除する場合:
sudo pacman -Rs nginx

apt purgeapt removeの違いで躓く人は多いです。removeは設定ファイルをディスクに残しますが、purgeは完全に削除します。本番のUbuntu 22.04サーバーでは、古いサービスを削除する際にデフォルトでpurgeを使うようにしました。削除されたパッケージの設定ファイルは静かに蓄積していきます — 通常のメンテナンスを数ヶ月続けると、孤立した設定ファイルが予想以上に増えていきます。

全パッケージのアップグレード

# apt
sudo apt update && sudo apt upgrade
# フルアップグレード(依存関係の変更も対応):
sudo apt full-upgrade

# yum
sudo yum update

# dnf
sudo dnf upgrade

# pacman
sudo pacman -Syu

Archのpacman -Syuはローリングリリースのフルシステムアップグレードを行います。定期的に実行してください — Archシステムをリポジトリとの同期からずれた状態にしておくと問題が発生します。部分的なアップグレードは追跡しにくい不具合を引き起こすことがあります。

UbuntuやRHELベースのシステムはより保守的です。アップグレードは段階的で予測可能なため、常時監視できないサーバーには安全な選択肢です。

設定:パッケージマネージャーの動作をカスタマイズする

デフォルト設定でほとんどの場合は対応できますが、問題が発生したときやサードパーティのリポジトリからパッケージを取得する必要があるとき、設定ファイルの場所を知っておくと役立ちます。

apt の設定(Debian/Ubuntu)

リポジトリは/etc/apt/sources.list/etc/apt/sources.list.d/配下の個別ファイルで定義します。Ubuntuで最もよく行うカスタマイズはPPAの追加です:

# PPAを追加する
sudo add-apt-repository ppa:deadsnakes/python3.12
sudo apt update

# 設定済みのリポジトリを一覧表示する
cat /etc/apt/sources.list
ls /etc/apt/sources.list.d/

パッケージを現在のバージョンで固定して自動アップグレードを防ぎたい場合は、apt-mark holdを使います:

# パッケージを現在のバージョンで固定する
sudo apt-mark hold nginx

# 後で固定を解除する
sudo apt-mark unhold nginx

dnf の設定(Fedora/RHEL/AlmaLinux)

メイン設定ファイルは/etc/dnf/dnf.confにあります。リポジトリは/etc/yum.repos.d/配下の.repoファイルとして管理されます。新規インストール時に有効にしておくとよいオプションをいくつか紹介します:

# /etc/dnf/dnf.conf — 便利なオプション
[main]
fastestmirror=True
keepcache=True
max_parallel_downloads=10

新しいAlmaLinuxやRocky LinuxサーバーでまずEPEL(Extra Packages for Enterprise Linux)を追加するのが私の定番です — ベースリポジトリにない数千のパッケージが利用可能になります:

# AlmaLinux / Rocky Linux / RHEL の場合
sudo dnf install epel-release
sudo dnf update

pacman の設定(Arch Linux)

Archの設定は/etc/pacman.confにあります。よくあるカスタマイズとしては、32ビットソフトウェア用にmultilibリポジトリを有効にしたり、AURヘルパーをセットアップしたりすることです。最も広く使われているのはyayです:

# yay(AURヘルパー)をインストールする — rootではなく一般ユーザーで実行すること
git clone https://aur.archlinux.org/yay.git
cd yay && makepkg -si

# あとはpacmanと同じようにyayを使える(AURパッケージも対応)
yay -S google-chrome

AURはデスクトップユーザーにとってArchの最大の魅力です。コミュニティがメンテナンスする膨大な数のパッケージを網羅しており、DebianやFedoraの公式リポジトリでは見つからないソフトウェアも入手できます。

検証と監視:システムをクリーンかつ監査可能な状態に保つ

パッケージのインストール自体は数秒で完了します。継続的な課題は、実際に何がインストールされているか把握すること、孤立したパッケージが蓄積する前に発見すること、そして何かがひっそり破損していないかを確認することです。

パッケージの検索と情報確認

# パッケージ名で検索する
apt search nginx
dnf search nginx
yum search nginx
pacman -Ss nginx

# パッケージの詳細情報を表示する
apt show nginx
dnf info nginx
pacman -Si nginx

# インストール済みパッケージを一覧表示する
dpkg --get-selections         # Debian/Ubuntu
rpm -qa                       # RHEL/CentOS/Fedora
pacman -Q                     # Arch

孤立パッケージの発見と削除

ソフトウェアを削除しても、それに付随してインストールされた依存パッケージが残ることがあります。これらの余分なパッケージはディスクスペースを無駄に使い、今後のアップグレード時に混乱を招くことがあります。

# apt — 不要になった依存パッケージを削除する
sudo apt autoremove

# dnf
sudo dnf autoremove

# pacman — 孤立パッケージを一覧表示する
pacman -Qdt
# 孤立パッケージを削除する
sudo pacman -Rns $(pacman -Qtdq)

本番のUbuntu 22.04サーバーで、メジャーバージョンのクリーンアップ後にapt autoremoveを一度実行しただけで、約400MBのディスクスペースを回収できました。ストレージがコストに直結するVPSでは、こうした定期メンテナンスはすぐに元が取れます。

パッケージの整合性確認

# インストール済みのRPMパッケージを検証する(yum/dnfシステム)
rpm -Va
# 特定のパッケージを確認する
rpm -V nginx

# Debian/Ubuntuで破損したファイルを復元するには再インストールする
sudo apt --reinstall install nginx

# Archでパッケージファイルを検証する
pacman -Qk nginx

パッケージ履歴とログの確認

何かが壊れたとき、何が変更されたかを把握する必要があります。パッケージログが最初の調査先となります。

# aptの履歴
cat /var/log/apt/history.log

# dnfのトランザクション履歴
dnf history
dnf history info 5       # トランザクション #5 の詳細
dnf history undo 5       # そのトランザクションをロールバックする

# pacmanのログ
cat /var/log/pacman.log | tail -50

dnf history undoは本当に過小評価されているコマンドです。パッケージのアップデートでスタックが壊れた場合、正確なトランザクションをロールバックできます — 以前のバージョンを手動で調べる必要はありません。CentOS 8でPHPのアップグレードが失敗した際に、このコマンドで2回復旧しました。どちらもダウンタイムゼロでした。

クイックリファレンス チートシート

操作 apt dnf / yum pacman
インデックス更新 apt update dnf check-update pacman -Sy
インストール apt install pkg dnf install pkg pacman -S pkg
削除 apt remove pkg dnf remove pkg pacman -R pkg
全体アップグレード apt upgrade dnf upgrade pacman -Syu
検索 apt search pkg dnf search pkg pacman -Ss pkg
パッケージ情報 apt show pkg dnf info pkg pacman -Si pkg
孤立パッケージ削除 apt autoremove dnf autoremove pacman -Rns $(pacman -Qtdq)
履歴確認 /var/log/apt/history.log dnf history /var/log/pacman.log

実際にはどれを使うべきか?

基本的には選べません — ディストリビューションが決定します。ただし、それぞれのツールには個性があります:

  • aptは安定していて予測可能です。予期せぬ問題が困るサーバーに最適です。
  • dnfは最高のトランザクション履歴とロールバック機能を備えています。エンタープライズLinuxでは私の第一選択です。
  • yumは事実上引退しています。まだyumを使うシステムを運用している場合は、機会を見て移行を計画してください。
  • pacmanは高速で、AURのおかげでデスクトップ用途に最適です。ローリングリリースなので常に最新を保つ必要があり、メンテナンス頻度が低いサーバーには不向きです。

コマンドが体に染み込めば、ディストリビューションを切り替えても最初からやり直す感覚がなくなります。4つのツールに共通する概念は同じです — リポジトリ、パッケージ、依存関係、クリーンアップ。変わるのはシンタックスだけです。

Share: