Linuxパッケージ管理の理解: APT vs. YUM vs. DNF

APT、YUM、DNFの実用的な比較:Linuxパッケージのインストール、更新、削除、トラブルシューティングについて。

Linuxパッケージ管理の理解: APT vs. YUM vs. DNF

Ubuntu、Debian、Fedora、Rocky Linux、AlmaLinux、RHELの間を行き来する場合、パッケージ管理は筋肉記憶が最初に崩れる場所の一つです。仕事はどこでも同じです:ソフトウェアをインストールし、セキュリティアップデートを適用し、不要なものを削除し、依存関係を一貫させます。コマンドとファイルの場所は十分に異なるため、間違った手順書をコピーすると時間を無駄にしたり、ホストに損害を与えたりする可能性があります。

APT、YUM、DNFは、通常1台のマシンで選択する競合ツールではありません。これらは異なるディストリビューションファミリーに属しています。APTはDebianベースのシステムでの通常の高レベルツールです。YUMは古いRed Hatベースのシステムでの長年の高レベルツールでした。DNFは現在のFedora、RHEL 8以降、CentOS Stream、Rocky Linux、AlmaLinuxでの現代的な代替品です。

パッケージマネージャとは?

その核心では、パッケージマネージャは、オペレーティングシステムへのソフトウェアパッケージのインストール、アップグレード、設定、削除のプロセスを自動化するソフトウェアツールのコレクションです。ソースコードからソフトウェアをコンパイルしたり、手動で依存関係を管理したりする代わりに、パッケージマネージャはソフトウェアリポジトリと対話して、事前にコンパイルされたバイナリを取得し、必要なすべての前提条件を自動的に処理します。

パッケージマネージャの主な機能は次のとおりです:

  • 依存関係解決:特定のアプリケーションが機能するために必要なすべてのライブラリやその他のソフトウェアパッケージを自動的に識別してインストールします。
  • ソフトウェアリポジトリ:パッケージが保存されているリモートサーバー(リポジトリ)への接続を管理し、幅広いソフトウェアへのアクセスを保証します。
  • システムアップグレード:個々のパッケージまたはオペレーティングシステム全体の更新を容易にし、セキュリティパッチや新機能が適用されることを保証します。
  • パッケージの整合性:デジタル署名を使用してパッケージの信頼性と整合性を検証し、改ざんを防止します。
  • クリーンな削除:ソフトウェアがアンインストールされるときに、関連するすべてのファイルと依存関係がきれいに削除され、システムの乱雑さを回避します。

Linuxディストリビューションは通常、2つの主要なパッケージ形式のいずれかを使用します:Debianベースのシステムでは.deb、Red Hatベースのシステムでは.rpmです。APTは.debパッケージを管理し、YUMとDNFは.rpmパッケージを管理します。

APT(Advanced Package Tool)

APTは、主にDebianとその派生版(Ubuntu、Linux Mint、Pop!_OSなど)で見られる.debパッケージを管理するためのコマンドラインユーティリティです。堅牢な依存関係解決と広大なソフトウェアエコシステムで有名です。

コアコンセプト

  • dpkgaptは高レベルツールですが、dpkgは実際に個々の.debパッケージをインストール、削除、管理する基礎となる低レベルツールです。APTはdpkgのフロントエンドとして機能し、リポジトリと依存関係を処理します。
  • sources.list/etc/apt/sources.listファイル(および/etc/apt/sources.list.d/内のファイル)は、APTがパッケージを見つけるために使用するソフトウェアリポジトリの場所を定義します。これらは、公式リポジトリ、サードパーティのPPA(Personal Package Archives)、またはローカルソースの場合があります。
  • パッケージ構造:パッケージは.debファイルとして配布され、基本的にはコンパイルされたソフトウェア、設定ファイル、メタデータを含むアーカイブです。

一般的なAPTコマンド

歴史的にはapt-getが主要なコマンドでしたが、aptコマンド(Debian 8 / Ubuntu 16.04あたりで導入)は、apt-getapt-cacheの最も一般的な機能を組み合わせることで、よりユーザーフレンドリーなインターフェースを提供します。

タスク apt コマンド 説明
パッケージリストの更新 sudo apt update リポジトリから利用可能なパッケージとそのバージョンのリストを更新します。
インストール済みパッケージのアップグレード sudo apt upgrade すべてのインストール済みパッケージを最新バージョンにアップグレードします。パッケージは削除されません。
フルシステムアップグレード sudo apt full-upgrade すべてのインストール済みパッケージをアップグレードし、依存関係を解決するために必要に応じて古いものを削除します。
パッケージのインストール sudo apt install <パッケージ名> 指定されたパッケージとその依存関係をインストールします。
パッケージの削除 sudo apt remove <パッケージ名> パッケージを削除しますが、設定ファイルは保持します。
パッケージのパージ sudo apt purge <パッケージ名> パッケージとその設定ファイルを削除します。
パッケージの検索 apt search <キーワード> キーワードに一致するパッケージを検索します。
パッケージ詳細の表示 apt show <パッケージ名> パッケージに関する詳細情報を表示します。
古いパッケージのクリーンアップ sudo apt autoremove 不要になった自動インストールされた依存パッケージを削除します。

# パッケージリストの更新
sudo apt update

# 'nginx' Webサーバーのインストール
sudo apt install nginx

# すべてのインストール済みパッケージのアップグレード
sudo apt upgrade

# 'nginx'とその設定ファイルの削除
sudo apt purge nginx

APTの利点

  • 信頼性の高い依存関係処理:APTは、システムを変更する前に、何をインストール、アップグレード、保持、または削除する予定かを説明するのが得意です。
  • 大規模なリポジトリエコシステム:DebianとUbuntuのリポジトリは、幅広いサーバーおよびデスクトップソフトウェアをカバーしています。
  • 予測可能なサーバー動作:安定したDebianおよびUbuntu LTSリリースは、通常、最新のアップストリームリリースよりもテストされたパッケージバージョンを優先します。

APTの欠点

  • 新しいソフトウェアバージョン:安定性と徹底的なテストに重点を置いているため、公式リポジトリのパッケージが絶対的な最新バージョンでない場合があります。

YUM(Yellowdog Updater, Modified)

YUMは、Red Hat Enterprise Linux(RHEL)およびその派生版(CentOS、Fedora(最近まで)、Scientific Linuxなど)の主要なパッケージマネージャでした。.rpm(Red Hat Package Manager)パッケージで動作します。

コアコンセプト

  • rpmdpkgと同様に、rpm.rpmファイル用の低レベルパッケージ管理ツールです。YUMは高レベルのフロントエンドとして機能します。
  • .repoファイル:リポジトリ設定は通常、/etc/yum.repos.d/にある.repoファイルで定義されます。これらのファイルは、各リポジトリのベースURL、GPGキー、その他のメタデータを指定します。
  • パッケージ構造:ソフトウェアは.rpmファイルとして配布され、バイナリ、ライブラリ、メタデータが含まれています。

一般的なYUMコマンド

タスク yum コマンド 説明
アップデートの確認 sudo yum check-update インストールせずに利用可能なアップデートを確認します。
すべてのパッケージの更新 sudo yum update すべてのインストール済みパッケージを更新します。
パッケージのインストール sudo yum install <パッケージ名> 指定されたパッケージとその依存関係をインストールします。
パッケージの削除 sudo yum remove <パッケージ名> パッケージを削除します。
パッケージの検索 yum search <キーワード> キーワードに一致するパッケージを検索します。
パッケージ詳細の表示 yum info <パッケージ名> パッケージに関する詳細情報を表示します。
キャッシュファイルのクリーンアップ sudo yum clean all キャッシュされたリポジトリメタデータとパッケージをクリーンアップします。

# 利用可能なアップデートの確認
sudo yum check-update

# 'httpd'(Apache)Webサーバーのインストール
sudo yum install httpd

# すべてのインストール済みパッケージの更新
sudo yum update

# 'httpd'の削除
sudo yum remove httpd

YUMの利点

  • 成熟したエンタープライズ動作:YUMは古いRHELおよびCentOSシステムではまだ一般的であるため、レガシーな手順書で見かけるでしょう。
  • トランザクション履歴yum historyは、以前のインストール、更新、削除を表示できます。場合によってはトランザクションを元に戻したりロールバックしたりできますが、設定ファイル、サービス状態、外部データは魔法のように復元されないため、注意深くテストする必要があります。

YUMの欠点

  • パフォーマンス:特に大規模なリポジトリや複雑な依存関係ツリーの場合、DNFのような最新のパッケージマネージャと比較して遅くなることがあります。
  • 置き換えられつつある:新しいRHELベースのシステム(RHEL 8+)では、DNFがデフォルトのパッケージマネージャとしてYUMに取って代わりましたが、yumは依然としてdnfのエイリアスとして機能することがよくあります。

DNF(Dandified YUM)

DNFは、Red Hatベースのディストリビューション向けの次世代パッケージマネージャであり、YUMの後継です。Fedora(バージョン18以降)、RHEL 8+、CentOS Stream、AlmaLinux、Rocky Linuxでデフォルトです。DNFはYUMの多くの欠点に対処し、パフォーマンスと依存関係解決の改善を提供します。

コアコンセプト

  • libsolv:DNFは依存関係解決にlibsolvを使用します。これは高度に最適化されており、YUMの古いソルバーよりも大幅に優れたパフォーマンスを提供します。
  • モジュール性:RHEL 8+およびFedoraの主要な機能であり、モジュール性により、ソフトウェアパッケージの異なるバージョンまたはストリーム(例:Python 3.6 vs. Python 3.8)を同時に利用可能にし、ユーザーはインストールするものを選択できます。
  • 互換性:DNFはYUMと大部分互換性のあるコマンドラインインターフェースを維持しており、ユーザーが移行しやすくなっています。

一般的なDNFコマンド

多くのDNFコマンドはYUMコマンドと同一または非常に似ています。

タスク dnf コマンド 説明
アップデートの確認 sudo dnf check-update インストールせずに利用可能なアップデートを確認します。
すべてのパッケージの更新 sudo dnf update すべてのインストール済みパッケージを更新します。
パッケージのインストール sudo dnf install <パッケージ名> 指定されたパッケージとその依存関係をインストールします。
パッケージの削除 sudo dnf remove <パッケージ名> パッケージを削除します。
パッケージの検索 dnf search <キーワード> キーワードに一致するパッケージを検索します。
パッケージ詳細の表示 dnf info <パッケージ名> パッケージに関する詳細情報を表示します。
キャッシュファイルのクリーンアップ sudo dnf clean all キャッシュされたリポジトリメタデータとパッケージをクリーンアップします。
利用可能なモジュールの一覧表示 dnf module list 利用可能なソフトウェアモジュールストリームを一覧表示します。
モジュールの有効化 sudo dnf module enable <モジュール> 特定のモジュールストリームを有効にします。

# 利用可能なアップデートの確認
sudo dnf check-update

# 'mariadb-server'データベースのインストール
sudo dnf install mariadb-server

# すべてのインストール済みパッケージの更新
sudo dnf update

# 利用可能なNode.jsモジュールストリームの一覧表示
dnf module list nodejs

# Node.js 16モジュールストリームの有効化(利用可能な場合)
sudo dnf module enable nodejs:16

# 'mariadb-server'の削除
sudo dnf remove mariadb-server

DNFの利点

  • 改善された依存関係解決:DNFはlibsolvを使用するため、一般的に複雑な依存関係の選択を古いYUMの動作よりも高速かつ明確に処理します。
  • よりクリーンな出力とAPI:DNFは多くの管理ワークフローで古いYUMよりもスクリプト化が容易です。
  • モジュール性:同じシステム内で異なるバージョンのソフトウェアをインストールする柔軟性を提供します。
  • モダンな設計:拡張機能とよりクリーンなコードのための明確なAPIで構築されています。

DNFの欠点

  • 新しいテクノロジー:安定していますが、特にモジュール性に関連するいくつかの機能は、新しいユーザーにとって少し急な学習曲線を必要とする場合があります。

主な違いとユースケース

APTとYUM/DNFの基本的な違いは、それらがサービスを提供するディストリビューションファミリーと、処理するパッケージ形式にあります。

機能 APT(Debian/Ubuntu) YUM/DNF(RHEL/Fedora)
パッケージ形式 .deb(Debianパッケージ) .rpm(Red Hatパッケージ)
基礎となるツール dpkg rpm
設定ファイル /etc/apt/sources.list /etc/yum.repos.d/*.repo
主要ディストリビューション Debian、Ubuntu、Mint、Pop!_OS RHEL、Fedora、CentOS、AlmaLinux、Rocky Linux
依存関係ソルバー 内部(堅牢、十分にテスト済み) YUM:内部(低速);DNF:libsolv(高速、モダン)
進化 apt-get -> apt yum -> dnf
モジュール性 直接組み込まれていない(柔軟性のためにPPA) DNFは複数バージョン用のmoduleストリームを提供
  • APTは、堅牢な安定性、広範なコミュニティサポート、そして広大なソフトウェアリポジトリを優先するユーザーや管理者に最適です。サーバーとデスクトップの両方で人気のあるDebianベースのシステムに最適です。
  • YUMは、長年にわたってエンタープライズ環境でその役割を十分に果たし、ソフトウェアを管理するための安定した実績のある方法を提供してきました。エイリアスとしてまだ存在していますが、直接の使用は段階的に廃止されています。
  • DNFは、Red Hatベースのシステムの現代的な標準です。最新のRHEL、Fedora、またはその派生版を実行している人にとっての選択肢であり、パフォーマンス、高度な依存関係解決、モジュール性などの機能を提供し、特定のソフトウェアバージョンを必要とする開発環境や本番環境に最適です。

パッケージ管理のベストプラクティス

使用しているパッケージマネージャに関係なく、ベストプラクティスに従うことで、健全で安全なシステムが保証されます:

  • 定期的な更新sudo apt update && sudo apt upgradeまたはsudo dnf updateを定期的に実行して、セキュリティパッチとバグ修正を適用します。
  • インストール前に理解する:特にサードパーティのリポジトリからインストールする前に、パッケージが何をするのか、その評判を常に確認してください。
  • リポジトリソースの確認:追加されたリポジトリが信頼できるものであることを確認し、悪意のあるソフトウェアや不安定なソフトウェアのインストールを防ぎます。
  • クリーンアップsudo apt autoremoveまたはsudo dnf autoremoveを使用して、孤立した依存関係を削除し、ディスク容量を解放します。
  • apt showまたはdnf infoの確認:インストールする前に、これらのコマンドを使用して、依存関係やサイズを含むパッケージの詳細を取得します。
  • 重要なシステムのバックアップ:主要なアップグレード(例:apt full-upgradeやディストリビューションのアップグレード)を実行する前に、重要なデータと設定のバックアップがあることを確認してください。

パッケージマネージャの問題のトラブルシューティング

ほとんどのパッケージマネージャの障害は、リポジトリメタデータ、依存関係の競合、ローカルパッケージデータベースの状態の3つのバケットに分けると、それほど謎ではありません。

APTがパッケージを見つけられないと言った場合、sudo apt updateから始めてください。APTはすべてのインストールでリモートリポジトリを新たにクエリするわけではありません。ローカルメタデータを使用します。パッケージが最近追加された場合、またはマシンがしばらくリストを更新していない場合、リポジトリが正しくてもインストールが失敗する可能性があります。apt update自体が失敗した場合は、エラーのリポジトリ行を読んでください。古いPPA、期限切れの署名キー、壊れたミラー、またはサポートされていないディストリビューションコードネームが実際の問題であることがよくあります。

DNFまたはYUMシステムでは、同等の最初の移動は通常次のとおりです:

sudo dnf makecache
sudo dnf repolist

古いシステムの場合:

sudo yum makecache
sudo yum repolist

repolistは、リポジトリがそもそも有効になっているかどうかを確認できるため便利です。パッケージは、EPEL、CodeReady Builder、PowerTools、CRB、またはベンダーリポジトリから利用できる場合がありますが、ベースOSリポジトリからは利用できません。その場合の修正は、WebからランダムなRPMをダウンロードすることではありません。よりクリーンな修正は、正しいリポジトリを有効にして、パッケージマネージャに依存関係を処理させることです。

依存関係の競合にはより注意が必要です。APTがシステムの大部分を削除することを提案した場合、停止してトランザクションを読んでください。同じことがdnf removeにも当てはまります。パッケージを削除すると、それに依存するサービスが削除される可能性があります。サーバーでは、トランザクションを受け入れる前に、提案されたトランザクションをインシデントノートにコピーするのが好きです。これにより、その後サービスが壊れた場合に何が変更されたかの記録が得られます。

中断されたインストールの場合は、手動でクリーンアップを試みる前に、ネイティブの修復コマンドを使用してください:

# Debian/Ubuntu
sudo dpkg --configure -a
sudo apt -f install

# Fedora/RHELファミリー
sudo dnf check
sudo dnf history

/var/lib/dpkg/var/lib/rpm/var/cache/apt、または/var/cache/dnfの下での手動削除は最後の手段にすべきです。これらのディレクトリはパッケージマネージャの状態であり、通常の散らかりではありません。

実用的な変換チートシート

異なるLinuxファミリー用に書かれたドキュメントに従う場合は、コマンドだけでなく意図を変換してください。

タスク Debian/Ubuntu Fedora/RHELファミリー
リポジトリメタデータの更新 sudo apt update sudo dnf makecache
インストール済みパッケージのアップグレード sudo apt upgrade sudo dnf upgrade または sudo dnf update
パッケージのインストール sudo apt install nginx sudo dnf install nginx
パッケージの削除 sudo apt remove nginx sudo dnf remove nginx
パッケージと設定の削除 sudo apt purge nginx 正確な同等物はありません;パッケージスクリプトは設定/データを残す場合があります
パッケージの検索 apt search nginx dnf search nginx
パッケージ情報の表示 apt show nginx dnf info nginx
インストール済みパッケージの一覧表示 apt list --installed dnf list installed
パッケージファイルの表示 dpkg -L nginx rpm -ql nginx
ファイルを所有するパッケージの検索 dpkg -S /path/file rpm -qf /path/file

最後のペアは過小評価されています。ホスト上で奇妙なバイナリや設定ファイルを見つけた場合、dpkg -Sまたはrpm -qfは、どのパッケージがそれを所有しているかを教えてくれます。どのパッケージも所有していない場合、そのファイルはアプリケーション、デプロイメントスクリプト、管理者、または攻撃者によって作成された可能性があります。それ自体は何も証明しませんが、より良い次の質問を与えてくれます。

パッケージ管理について考える最も安全な方法は単純です:ディストリビューションが期待するツールの範囲内にとどまり、トランザクションを受け入れる前に読み、サードパーティのリポジトリを本番依存関係として扱うことです。リポジトリファイルがどこにあるか、パッケージの所有権を検査する方法を知れば、APT、YUM、DNFはまったく異なる世界のように感じられなくなります。