UbuntuやDebianなどで特定のパッケージをインストールするとき、普通は以下のコマンドを使用します。

sudo apt install [パッケージ名]

しかし、その一方でdpkgコマンドでも同様にパッケージをインストールするときに下記のコマンドで代用できます。

sudo dpkg -i [パッケージ名]

このaptコマンドとdpkgコマンドはどう違っているのか、そもそもaptとdpkgはどういう意味なのかをこの記事で説明します。

aptコマンドとは

aptの概要

apt(Advanced Packaging Tool)は高水準で動くパッケージ管理システムです。もちろんaptコマンドはUbuntuやDebianなどのディストリビューションにはデフォルトでインストールされています。

高水準とは、機械的でなく人間に近い動作をするという意味です。命令したとおりに動くことが低水準であり、命令した内容を意訳して動くことが高水準と言えます。高水準と低水準の定義は曖昧ですが、ハードウェアを直接操作する機械語が低水準と呼ばれ、ソフトウェアを操作するプログラミング言語は高水準と呼ばれています。つまり、ハードウェアに近づけば近づくほど低水準で、ソフトウェアや人間に操作しやすいよう近づけば近づくほど高水準です。

パッケージとは、特定の機能を持ったソフトウェアに関係するファイルをまとめたものを意味しています。例えばWindowsになんらかのソフトウェアをインストールするときには、実行ファイル形式のインストーラーを起動する必要があります。そのインストーラーの中にはソフトウェアを動かすために必要なプログラムやプログラムを動かすために必要なモジュールに加え、フォントや画像などが入っているのです。このインストーラーのことをパッケージと呼びます。

パッケージ管理システムは、パッケージのインストールや削除、更新などを統括するシステムのことを言います。このシステムを活用することでバラバラになっているパッケージを統括して管理できるのでパッケージの更新を忘れたりするリスクがなくなります。

aptコマンドの機能について

aptコマンドの機能を活用することで、指定したパッケージに依存している別のパッケージも自動的にインストールしたり削除したりすることが可能です。そのため、aptコマンドを使用してインストールすればすぐにパッケージの使用が可能になります。

aptコマンドではインターネット上にあるリポジトリにアクセスしてパッケージをダウンロードして利用可能になりますが、拡張子が.debのファイルもインストール可能です。そのためリポジトリに存在しないパッケージをインストールしたいときには.debファイルを直接指定してインストールすることで利用可能になります。.aptコマンドからの.debファイルの利用は、Windowsで言うダブルクリックで起動するインストーラーをコマンド上で利用するようなものだと考えればわかりやすいでしょう。

aptコマンドの機能は他にもあり、パッケージのインストールや削除だけでなく、パッケージの更新にシステムのアップグレードや、すでにインストールしているパッケージの詳細の表示などもあります。

dpkgコマンドとは

dpkgの概要

dpkg(debian package)とは低水準で動くパッケージ管理システムです。dpkgコマンドもaptコマンドと同様にUbuntuやDebianにはデフォルトでインストールされています。低水準で動くので、aptにはできない削除するパッケージを個別に指定したり、パッケージ間の依存関係を無視してインストールすることが出来ます。ただし低水準で動く仕様上、操作を誤ってしまうとシステムを破壊してしまう可能性もあるので利用の際には注意が必要です。

aptコマンドとは違ってdpkgではリモートホストに存在するパッケージをインストールすることは不可能で、リモートホストに存在するパッケージをインストールするときには、パッケージファイルである.debファイルをあらかじめローカルホストに用意しておく必要があります。(例えばwgetコマンドで.debファイルをダウンロードするなど。)

しかし先述の通り、dpkgコマンドではパッケージ間に依存がある場合、依存関係にある別のパッケージを自動的にインストールされないので不便です。aptでパッケージの依存関係の問題や、.debファイルの問題などが解決されている以上、dpkgでは主にインストールされているパッケージの確認をするために利用されます。

dpkgコマンドの機能について

dpkgコマンドでは、パッケージの依存関係を無視してインストールしたり削除したりすることが可能です。そのため特定のパッケージは削除したいとき、依存関係にある別のパッケージを削除したくないときに利用できます。インストールのときも同様です。

低水準で動くことができるdpkgでは、aptとは違ってディストリビューションにインストールされているパッケージのリストをまとめて表示することが出来ます。他にもインストールするパッケージのディレクトリを指定することが可能など、aptには存在しない機能がたくさん用意されています。ただし、先述の通り低水準で起動する仕様上、dpkgコマンドの操作を誤ってしまうとシステムに重大な問題を抱えてしまうことになるので十分注意しましょう。

aptコマンドの使用方法

aptコマンドの使用方法は一般的なコマンドと同様にヘルプが用意されていますが、わかりやすくテーブルにまとめてみました。

コマンド機能
sudo apt install [パッケージ名][パッケージ名]をインストールする。
sudo apt remove [パッケージ名][パッケージ名]を削除
sudo apt purge [パッケージ名][パッケージ名]を設定ファイルも含めて完全に削除
sudo apt autoremove必要なくなったパッケージの自動削除
sudo apt update更新が利用可能なパッケージの一覧を更新
sudo apt upgradeパッケージをインストール、更新をしてシステムをアップグレード
sudo apt source [パッケージ名][パッケージ名]のソースをダウンロード
sudo apt build-dep [パッケージ名][パッケージ名]のソースをビルド、コンパイルするために必要なパッケージのダウンロード
sudo apt show [パッケージ名][パッケージ名]の詳細情報を表示する

更新が可能なパッケージの一覧を更新するupdateとパッケージを更新するupgradeはセットで必ず覚えておきましょう。この2つのコマンドを実行することによってインストールされているパッケージの状態が最新になります。

通常、aptでパッケージの更新を行ってシステムのアップグレードを実行するupgradeでは、パッケージの依存関係の変化などによって発生した不要なパッケージの削除が行われません。使用されていないパッケージが放置されてしまうとセキュリティーホールにつながるので、autoremoveコマンドで削除しておきましょう。

aptでは先述の通りdebファイルも取り扱うことができるので、上記のコマンドの[パッケージ名]にはローカルホストに存在する.debも指定可能です。例えば、Ubuntuで仮想OSを起動させるために必要なVirtualBoxをインストールしたいときには、Oracleの公式サイトにアクセスし、debファイルをダウンロードしてインストールすることもできます。拡張子が.debのファイルであれば、ファイルが存在するパスを[パッケージ名]に入力することでインストールできます。

aptにはパッケージ名の詳細情報を表示することができるshowがあります。dpkgにも後述の-sオプションでパッケージ名の詳細情報を手に入れることができます。しかし日本語版Ubuntuの場合は、aptのshowでDescription(説明)が日本語で書かれているのに対して、dpkgの-sオプションでは英語のままで表示される違いがある点に注意しましょう。

aptのshowコマンドでパッケージ名の詳細を表示させたときには一部が日本語で表示される

aptにはイースターエッグという隠し機能が用意されていますが、特に意味は無いのであえて覚えておく必要はありません。それでも実行したいときには下記のコマンドを入力してください。ただのジョークです。

apt moo

dpkgコマンドの使用方法

dpkgコマンドは基本的に-lの利用が多いので覚えておくと良いでしょう。そのほかのコマンドは低水準でパッケージの操作をしたいときに実行します。

コマンド機能
dpkg -lインストールされているパッケージの一覧を表示する
sudo dpkg -i [.debファイル名] [ディレクトリ][.debファイル名]を[ディレクトリ]にインストールする
sudo dpkg -r [パッケージ名][パッケージ名]を削除する
sudo dpkg -P [パッケージ名][パッケージ名]を設定も含めて完全に削除する
dpkg -s [パッケージ名] [パッケージ名]の詳細情報を表示する

dpkgコマンドにおけるインストールや削除などは、依存関係にある別のパッケージは無視される点に注意しましょう。基本的にdpkgは低レベルでの操作になるの-lのインストールされているパッケージの一覧を表示するコマンド以外は使用しないほうが無難です。ただし、-lはインストールされているパッケージがすべて表示されます。Ubuntuのデフォルトの状態であれば、GNOMEデスクトップやNautilus、Firefoxやgccに加え、PythonやPerlなどのコンパイラまで表示されます。そのため、-lコマンドを利用するときには以下のようにすることでスクロール可能にすることが良いでしょう。

dpkg -l | less

これでインストールされているパッケージのすべてがスクロール可能です。CUI環境しか用意されていない状態であれば便利に活用できます。もし、特定のパッケージがインストールされているかどうかを調べたいときには、以下のコマンドを使用して検索します。

dpkg -l | grep [検索したい言葉]

[検索したい言葉]にはパッケージの説明も含まれているので、例えばTCPWrapperの正式なパッケージ名がわからない状態で、インストールされているかどうかを調べたいときには[検索したい言葉]にTCPを入力することでパッケージが表示されます。[検索したい言葉]は正規表現が使用可能なので便利です。

また、dpkg-debコマンドを使用することで.debファイルをビルドしたり、展開することが出来ます。指定したディレクトリを.debファイルにビルドしたい場合は以下のコマンドを実行します。

dpkg-deb -b [ビルドしたいディレクトリ]

主に自分で作ったパッケージを.debファイルにまとめたいときに利用すると良いでしょう。ビルドされた.debファイルをインストールするときには展開するのではなく、aptコマンドかdpkgコマンドを使用しましょう。

dpkgの-sオプションではDescription(説明)がaptとは違って英語で表示されます。翻訳された文章ではなく英語の原文で確認したいときには活用すると良いです。

dpkgによるパッケージの詳細情報の表示では説明がすべて英語

aptコマンドとdpkgコマンドの違い

上記の内容を簡単にまとめるとaptコマンドとdpkgコマンドの違いは以下のようになります。

aptdpkg
抽象度高水準低水準
主な用途システムのアップグレード
.debファイルやパッケージのインストールや削除
ソースのダウンロードなど
低レベルのパッケージ操作
パッケージの一覧表示
パッケージのビルドと展開など
使用者エンドユーザー向け開発者向け

結論

どちらもパッケージ管理システムであるという点は同じで、相違点は低水準で動くか高水準で動くかという点であるということがおわかりいただけたでしょうか。

基本的には高水準で動くaptコマンドを使用してパッケージの管理を行うことが良いでしょう。リポジトリに存在しているパッケージのインストールや拡張子.debファイルのインストール、ソフトウェアやディストリビューションの更新、パッケージの依存についても自動的に処理してくれます。特に何も考えずに上記の項目で説明したaptコマンドを使用したとしても、dpkgに比べれば大した問題には発展しないことが多いです。

一方で低水準で動くdpkgコマンドはあくまでもパッケージのインストールや削除の際には利用せず、-lでインストールされているリストを表示する際に利用するだけにとどめておくと安全です。パッケージの削除やインストールの際にdpkgコマンドを実行したとしても他のパッケージに依存している状態であれば、削除後には不要なパッケージがいつまでも残留し、インストール後には正常にパッケージを利用できなくなることがあります。とはいえ、dpkg-debコマンドで.debファイルをビルドすることができるのでパッケージの開発者の方は覚えておくと便利でしょう。

どうしても低水準で動くdpkgと高水準で動くaptの違いがわからない方は、車に例えると低水準で動くdpkgはマニュアル車で、高水準で動くaptはオートマ車であると認識しておきましょう。dpkgは非常に操作できる範囲が広くその殆どが手動での操作になります。一方でaptはインストールしたいパッケージを指定すれば依存関係などすべて自動的に行ってくれます。もちろん手動で操作するdpkgには相応の知識が必要になるので十分注意しましょう。dpkgの詳細を知らずに操作することは、AT限定免許でマニュアル車を運転するようなものです。