2007年07月12日

apt-get vs. aptitude

 これまでのインストールガイドでは、ソフトウェアをインストールするためにapt-getコマンドを使ってきました。ところが、いろんなサイトを閲覧しているとaptitudeコマンドを使っているところがけっこうあります。この二つの違いはなんなのでしょうか。そしてどちらを使うべきなのでしょうか。

Googleで"apt-get vs. aptitude"と検索すると、そのものずばりの記事スレッドフォーラムの投稿なんかが見つかります。やっぱみんな気になっているのね。ここでは、一番まとまっていたと思われるYet Another Linux Blogのこのエントリを基本に説明していこうと思います。

結論から言うと、「Ubuntuで使うなら今はapt-getに統一しておいた方がいいよ」ということらしいです。実際、非公式なUbuntuGuideのGeneral Notesのところでも
All references to "aptitude" will be replaced with "apt-get". You may still use "aptitude" if you wish, however could cause dependency issues.
なんて書いてあったりします(日本語訳:このガイドに書いてある"aptitude"は全て"apt-get"に脳内補完しておくれやす。"aptitude"も使えなくもないけど、依存性が破壊されるおそれがありますのねん)。

以下、apt-getaptitudeの違いをつらつらと。


ログファイル

 apt-getは特にログファイルを持っていません。そのかわり後ろで動くdpkgコマンドが
/var/log/dpkg.log
というログファイルを持っているようです。この中にはインストール・アンインストールしたパッケージの一覧が載っています。

aptitudeでもdpkgが後ろで動いていますが、dpkg.logとは別に
/var/log/aptitude
というファイルを管理しています。もし一度もaptitudeコマンドを使ったことがないのなら、ファイル自体が存在しません。


インストール時

 主な違いは「推奨(recommends)パッケージ」の扱いです。apt-getは推奨パッケージを表示するだけに留めますが、aptitudeは推奨パッケージもインストールしようとします(たぶん提案(suggests)パッケージはインストールしません。推奨と提案の違いはこのエントリの質疑応答が参考になります)。


アンインストール時

 主な違いは必要のなくなったパッケージ(孤児(orphan)パッケージと呼ばれるらしい)の扱いです。apt-getaptitudeもあるパッケージをインストールしたとき、必要なパッケージも自動的にインストールしてくれますが、インストールしたパッケージを削除したとき、apt-getはそのパッケージだけを、aptitudeは(/var/log/aptitudeのログを元に)不要になったパッケージも削除します。

この不要パッケージに対する扱いの違いのために、aptitudeの愛用者が多かったようです。現在ではapt-get autoremoveコマンドでaptitude同様のことを独自のログファイルを作成することなく実現できます。


実例

 仮想的なpackageXパッケージをapt-getaptitudeの双方でインストールしたときの違いを見ていきましょう。まず、packageXに対する依存関係は以下のようになっているとします。
  • 依存:packageXdep
  • 推奨:packageXrec
  • 提案:packageXsug

ケース1:aptitudeを使ってインストールし、aptitudeを使ってアンインストールする。
  • aptitude install packageXpackageXpackageXdeppackageXrecがインストールされる。
  • aptitude remove packageXpackageXpackageXdeppackageXrecがアンインストールされる。
  • 一緒にインストールされたパッケージはaptitudeのデータベースに基づいて全てアンインストールされる。
  • aptitudeのデータベースの整合性は維持される。

ケース2:apt-getを使ってインストールし、apt-getを使ってアンインストールする。
  • apt-get install packageXpackageXpackageXdepがインストールされる。
  • apt-get remove packageXpackageXのみがアンインストールされる。
  • 依存関係によってインストールされたパッケージは残ったままになる。
  • aptitudeのデータベースには触れないので整合性は維持される。

ケース3:apt-getを使ってインストールし、apt-get --autoremoveを使ってアンインストールする。
  • apt-get install packageXpackageXpackageXdepがインストールされる。
  • apt-get --autoremove remove packageXpackageXpacageXdepがアンインストールされる。
  • 一緒にインストールされたパッケージは全てアンインストールされる。
  • aptitudeのデータベースには触れないので整合性は維持される。

ケース4:apt-getを使ってインストールし、aptitudeを使ってアンインストールする。
  • apt-get install packageXpackageXpackageXdepがインストールされる。
  • aptitude remove packageXpackageXがアンインストールされる。
  • packageXdepaptitudeのデータベースに登録されていないので、アンインストールされない。
  • aptitudeのデータベース
  • においてpackageXdepインストールされていないことになっている。

ケース5:aptitudeを使ってインストールし、apt-get --autoremoveを使ってアンインストールする。
  • aptitude install packageXpackageXpackageXdeppackageXrecがインストールされる。
  • apt-get --autoremove remove packageXpackageXpackageXdepがアンインストールされる(packageXrecはどうなるか不明)。
  • packageXdepaptitudeのデータベースに関係なくアンインストールされる。
  • aptitudeのデータベース
  • において、packageXdepインストールされたままの状態になっている。


 うーん、わかりやすくまとめたつもりがなぜかわかりにくくなっている……。全てのケースにおいて単独では問題はおきないと思います。ただ、ケース4、5の場合、このあとにpackateXdepが関係するパッケージをインストールしたときに何か問題が起きそうです。このへんの話が「apt-getaptitudeの混用はやめたほうがいいよ」という理由になっているのだと思います。

気をつけなきゃいけないのは、Synapticがapt-getを使っているらしいということです(情報源が見つからなかったけど、Synapticを使ってもaptitudeのログファイルが作られていないので事実だと思う)。つまりSynapticを使うなら選択肢としてapt-getを使うしかない、と。性能的にapt-getaptitudeに差はないので、今後はapt-getを使いましょう。

ところで、aptitudeってapt-getの進化版と思っていたのですけれども、違うんですね。どちらもdpkgのフロントエンドを目指して作られたけれども出自は別で、どちらかというとaptitudeの方が古いんだとか。


追記(2007/12/17)

 案外、このエントリにやってくる人が多いようなので、いくつか修正・追記しておきました。とりあえず、ここに書いてあることは、非公式の情報を元に推論したものであり、事実と違う可能性があるので注意してください。実際、apt-getに統一した方がいいと書きましたが、DebianのMLやDebian GNU/Linux スレッドテンプレを見ると、積極的にaptitudeが使われています。これはDebianでは、SynapticのようなGUIは利用せずに端末上からインストールする方が多いために、aptitudeで統一した方がいろいろとログが残るし、特にオプションを指定しなくても「推奨」パッケージがインストールされるし、aptitudeにはCUI用のインターフェースも用意されているしと利点が多いからだと思われます。

また、上記では取り消し線をつけておきましたが、Synapticがapt-getを呼び出しているわけではないようです。まずAdvanced Packaging Tool(APT)というパッケージ管理のライブラリがあり、apt-getはそのライブラリに付属するおまけのコマンドで、aptitudeとSynapticはそのライブラリを利用し、ユーザインターフェースを備えたものという位置づけのようです。よって、Synapticもまたapt-getと同様にaptitudeのログを無視するということには変わりありません。また、[アプリケーション] - [追加と削除...]から起動できる「アプリケーションの追加と削除」の正体はgnome-app-installというアプリケーションであり、これは、python-apt
というPythonでAPTライブラリを利用するモジュール集を使っています。このため、これもまたSynapticと同様にaptitudeのログを無視します。

Ubuntuでも、サーバ版を使うだとか、Synapticや「アプリケーションの追加と削除」は使わないだとか言う場合は、aptitudeに統一してもいいかもしれません。ただ、「apt-getaptitudeの混用は避けるべき」というのは、Debian GNU/Linux スレッドテンプレにも書いてあるので、どちらかに統一するべきでしょう。ただ、公式ドキュメントにはそのような記載が一切ないので、それほど気にする必要はないのかもしれません。個人的には、Synapticや「アプリケーションの追加と削除」、apturlなどが便利なので「aptitudeは使わない」というように決めています。
タグ:ubuntu
posted by しぐま at 19:01| Comment(2) | コンピュータ | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
こんばんは。
aptitude のメンテナをやっているものなのでちょっと気になった点についてコメントです。
「aptitudeは(/var/log/aptitudeのログを元に)不要になったパッケージも削除します」は嘘ですよ。
/var/lib/apt/extended_states というデータベースがあり、依存関係で引き込まれて自動的にインストールされたか否かに関する情報がそこに含まれています。

ログなんて飾りですよ。
何ヶ月かすれば logrotate に消されてしまうものなので。;-)
Posted by noritada at 2008年01月10日 03:22
aptitudeのメンテナさん直々に指摘していただけるなんて光栄です。ちゃんと確認もせずにふわふわな状態で嘘を書いてしまってすみません……。

aptitudeも(/var/lib/aptitude/pkgstatesだけでなく)/var/lib/apt/extended_statesを読み込んでくれるんですね。てことは、この二つを混用することによる問題って何が原因で起こるのでしょう。というか、問題自体も解決済みなのかな。やっぱちゃんと確認してからって話になっちゃいますね……。
Posted by しぐま at 2008年01月11日 21:27