この記事では、Linux システム上で Debian パッケージ管理ツールを使用してパッケージを管理する方法を学びます。この記事で説明する内容は以下のとおりです。
- Debian バイナリー・パッケージをインストール、再インストール、アップグレード、および削除する方法
- 特定のファイルやライブラリーが含まれるパッケージを、該当するパッケージがインストールされていなくても検出する方法
- パッケージに関する情報 (バージョン、内容、依存関係、パッケージ整合性、インストール状況など) を、該当するパッケージがインストールされていなくても取得する方法
この記事は、Linux Professional Institute Junior Level Administration (LPIC-1) 試験 101 の主題 102 の 102.4 の試験対策に役立ちます。この目標の重要度は 3 です。
この連載の記事を最大限に活用するには、Linux の基礎知識と、記事に記載されたコマンドを演習できる実際の Linux システムが必要です。プログラムのバージョンによって出力のフォーマットに違いが出てくる場合もあるため、コマンドの実行結果は必ずしもここに記載するリストや図とまったく同じであるとは限りません。特に、記載する出力のほとんどは、お使いのシステムにインストールされているパッケージによって大きく左右されます。記事の出力と実際の出力がかなり違っているとしても、重要な共通点は認識できるはずです。
かつて、Linux プログラムの多くはソース・コードとして配布されていました。このソース・コードを、ユーザーが必要な man ページ、構成ファイルなどと併せてビルドして 1 つのプログラム、あるいは一連のプログラムに組み込むという仕組みでしたが、最近では、ほとんどの Linux ディストリビューターが事前にビルドされたプログラムを使用しています。これらのプログラムのセットが、パッケージと呼ばれるものです。パッケージは、該当するディストリビューションにすぐにインストールできる状態で配布されます。この記事では、パッケージのインストール、更新、削除を支援するパッケージ管理ツールについて説明します。この記事で焦点とするパッケージ管理システムは、Debian と Debian から派生した Ubuntu などのディストリビューションで使用されている APT (Advanced Packaging Tool) です。この連載の別の記事「Linux の 101 試験対策: RPM および YUM によるパッケージ管理」では、Red Hat のパッケージ管理ツールについて説明しています。
ユーザーの目から見ると、基本的なパッケージ管理機能は一連のコマンドで提供されています。Linux の使い易さを向上させようとする Linux 開発者たちの努力の末、基本ツールは他のツールによって補完されるようになりました。その一例は GUI ツールです。GUI ツールによって、基本ツールの複雑さはある程度、エンド・ユーザーから隠されます。この記事と RPM および YUM のパッケージ管理について説明している記事では基本ツールを焦点としていますが、基本ツール以外のツールについても、皆さんが詳しく調べられるように取り上げています。
APT、RPM、および YUM (このうち、RPM と YUM は Red Hat システム用のパッケージ管理ツールです) には多くの共通点があります。具体的に言うと、この 3 つではすべて、パッケージのインストールと削除を行うことが可能で、インストールされているパッケージに関する情報はデータベースに保持されます。さらに、いずれも基本的なコマンドライン機能を備えていると同時に、ツールを追加することによって、よりユーザー・フレンドリーなインターフェースを提供することができます。また、インターネットからパッケージを取得できるという共通点もあります。
Linux システムをインストールするときには、さまざまなパッケージをインストールするのが通常です。インストールする一連のパッケージは、システムの用途 (サーバー、デスクトップ、または開発者のワークステーションなど) に合わせてカスタマイズすることができます。そしてある時点で、機能を追加するために新しいパッケージをインストールしなければならなくなったり、既存のパッケージの更新や、不要になったパッケージの削除や、新しいパッケージがリリースされたことで廃止されたパッケージの削除が必要になったりすることがあります。以降のセクションでは、これらのタスクを行う方法を説明するとともに、特定のコマンドが含まれている可能性のあるパッケージを見つけるなどといった、タスクに関連する課題に取り組みます。
例えば、Lisp を習得したいというあなたに、同僚たちが gcl コマンドを使用するように提案したとします。そこであなたは、gcl --help、which gcl、あるいは type gcl を使ってみることにしました。けれどもシステムが gcl を見つけられないとすると、リスト 1 のような出力が表示されます。
リスト 1. 見つからない gcl コマンド
ian@pinguino:~$ gcl --help -bash: gcl: command not found ian@pinguino:~$ gcl --help The program 'gcl' is currently not installed. You can install it by typing: sudo apt-get install gcl gcl: command not found ian@pinguino:~$ which gcl ian@pinguino:~$ type gcl -bash: type: gcl: not found |
リスト 1 の 2 番目の出力に参考になる解決策が示されなかったとすると、同僚のところに戻って、どのパッケージをインストールしたら良いのかを尋ねるか、あるいは単純に、gcl コマンドは gcl パッケージにあるだろうと見当をつけることでしょう。大抵、この見当は外れませんが、いつも当たるとは限りません。正しいパッケージを見つける方法については後で説明しますが、この例で必要なのは gcl パッケージです。このパッケージをインストールするには、install オプションを指定した apt-get コマンドを使用します (リスト 2 を参照)。apt-get コマンドは、依存関係を満たすために必要な追加パッケージを判断してから、インストールするすべてのパッケージをリストアップします。その時点で、インストールを続行するかどうかを尋ねるプロンプトが出されます。以下の例では「y」と応答して、gcl と追加で必要なパッケージ、libreadline5 をインストールしています。
リスト 2. apt-get コマンドによる gcl のインストール
ian@pinguino:~$ sudo apt-get install gcl [sudo] password for ian: Reading package lists... Done Building dependency tree Reading state information... Done The following packages were automatically installed and are no longer required: linux-headers-2.6.31-14 linux-headers-2.6.31-14-generic Use 'apt-get autoremove' to remove them. The following extra packages will be installed: libreadline5 Suggested packages: gcl-doc The following NEW packages will be installed: gcl libreadline5 0 upgraded, 2 newly installed, 0 to remove and 30 not upgraded. Need to get 47.1MB of archives. After this operation, 157MB of additional disk space will be used. Do you want to continue [Y/n]? y Get:1 http://us.archive.ubuntu.com karmic/main libreadline5 5.2-6 [140kB] Get:2 http://us.archive.ubuntu.com karmic/universe gcl 2.6.7-45ubuntu1 [47.0MB] Fetched 47.1MB in 1min 33s (502kB/s) Preconfiguring packages ... Selecting previously deselected package libreadline5. (Reading database ... 142156 files and directories currently installed.) Unpacking libreadline5 (from .../libreadline5_5.2-6_i386.deb) ... Selecting previously deselected package gcl. Unpacking gcl (from .../gcl_2.6.7-45ubuntu1_i386.deb) ... Processing triggers for man-db ... Setting up libreadline5 (5.2-6) ... Setting up gcl (2.6.7-45ubuntu1) ... install/gcl: Handling install for emacsen flavor emacs22 Loading 00debian-vars... No /etc/mailname. Reverting to default... Loading /etc/emacs/site-start.d/50dictionaries-common.el (source)... Loading debian-ispell... Loading /var/cache/dictionaries-common/emacsen-ispell-default.el (source)... Loading /var/cache/dictionaries-common/emacsen-ispell-dicts.el (source)... Loading /etc/emacs/site-start.d/50gcl.el (source)... Wrote /usr/share/emacs22/site-lisp/gcl/add-default.elc Wrote /usr/share/emacs22/site-lisp/gcl/ansi-doc.elc Wrote /usr/share/emacs22/site-lisp/gcl/dbl.elc Wrote /usr/share/emacs22/site-lisp/gcl/doc-to-texi.elc Wrote /usr/share/emacs22/site-lisp/gcl/gcl.elc Wrote /usr/share/emacs22/site-lisp/gcl/man1-to-texi.elc Wrote /usr/share/emacs22/site-lisp/gcl/smart-complete.elc Wrote /usr/share/emacs22/site-lisp/gcl/sshell.elc install/gcl: Handling install for emacsen flavor emacs23 Loading 00debian-vars... No /etc/mailname. Reverting to default... Loading /etc/emacs/site-start.d/50dictionaries-common.el (source)... Loading debian-ispell... Loading /var/cache/dictionaries-common/emacsen-ispell-default.el (source)... Loading /var/cache/dictionaries-common/emacsen-ispell-dicts.el (source)... Loading /etc/emacs/site-start.d/50gcl.el (source)... Wrote /usr/share/emacs23/site-lisp/gcl/add-default.elc Wrote /usr/share/emacs23/site-lisp/gcl/ansi-doc.elc Wrote /usr/share/emacs23/site-lisp/gcl/dbl.elc Wrote /usr/share/emacs23/site-lisp/gcl/doc-to-texi.elc Wrote /usr/share/emacs23/site-lisp/gcl/gcl.elc Wrote /usr/share/emacs23/site-lisp/gcl/man1-to-texi.elc Wrote /usr/share/emacs23/site-lisp/gcl/smart-complete.elc Wrote /usr/share/emacs23/site-lisp/gcl/sshell.elc Processing triggers for libc-bin ... ldconfig deferred processing now taking place |
リスト 2 の出力を見ると、apt-get はどこかから (場所については後で説明します) パッケージのリストを読み取って依存関係のツリーを作成した後、現在インストールされていない必須のパッケージが libreadline5 であると判断しています。また、マニュアル用のパッケージ、gcl-doc のインストールも推奨しています。さらにスペース使用量などの要約情報を示し、インストールを続行するかどうかを尋ねるプロンプトを出してから、gcl を必須パッケージと一緒にインストールするという流れになっています。通常、Debian パッケージには .deb という拡張子が付いています。以下の行から、Debian パッケージがダウンロードされ、解凍されていることがわかります。
Unpacking gcl (from .../gcl_2.6.7-45ubuntu1_i386.deb) ...
パッケージをインストールするのではなく、パッケージが他のパッケージに依存しているかどうかだけを調べたいとしたら、どうすればよいのでしょうか。その場合には、apt-get コマンドで -s (simulate の略) オプションを使用します。これと同等の機能を持つオプションには、--just-print および \--dry-run があります。これらのオプションについての詳細は、man ページを参照してください。リスト 3 に、gcl-doc パッケージのインストールをシミュレーションした場合の出力を記載します。
リスト 3. シミュレーションした gcl-doc のインストール
ian@pinguino:~$ sudo apt-get install -s gcl-doc Reading package lists... Done Building dependency tree Reading state information... Done The following packages were automatically installed and are no longer required: linux-headers-2.6.31-14 linux-headers-2.6.31-14-generic Use 'apt-get autoremove' to remove them. The following NEW packages will be installed: gcl-doc 0 upgraded, 1 newly installed, 0 to remove and 30 not upgraded. Inst gcl-doc (2.6.7-45ubuntu1 Ubuntu:9.10/karmic) Conf gcl-doc (2.6.7-45ubuntu1 Ubuntu:9.10/karmic) |
当然のことながら、マニュアル用のパッケージに必須パッケージはありません。
前のセクションで Debian パッケージをインストールする方法を学びましたが、パッケージはどこにあるのでしょうか。apt-getはどうやってパッケージをダウンロードしてくる場所を知るのでしょうか。apt-get はどこかからパッケージのリストを読み取ると説明しましたが、その場所を知るための出発点は /etc/apt/sources.list です。このリストが apt-get にパッケージの検索先を指示します。CD-ROM や ローカル・ファイルシステムが検索先として指示される場合もあれば、http または ftp を使ってネットワークで検索する場合もあります。他のソースは、/etc/apt/sources.list.d ディレクトリーに追加することができます。
リスト 4 に、私のシステムに置かれている /etc/apt/sources.list から抜粋した冒頭の数行を記載します。最初の行のディストリビューション CD がコメントアウトされている (行頭の #) ことに注意してください。頻繁に更新されていない可能性の高い新しいパッケージを多数インストールしなければならない場合には、この行のコメントを外して、ディストリビューション CD や DVD からインストールするのでも良いかもしれませんが、ブロードバンド・ネットワーク接続を使用している場合、あるいは頻繁に更新しなければならない場合には、/etc/apt/sources.list に指定されたネットワーク・ソースから最新レベルの追加パッケージをダウンロードしたほうが効率的です。
リスト 4. /etc/apt/sources.list
ian@pinguino:~$ cat /etc/apt/sources.list #deb cdrom:[Ubuntu 9.10 _Karmic Koala_ - Release i386 (20091028.5)]/ karmic main restrict ed # See http://help.ubuntu.com/community/UpgradeNotes for how to upgrade to # newer versions of the distribution. deb http://us.archive.ubuntu.com/ubuntu/ karmic main restricted deb-src http://us.archive.ubuntu.com/ubuntu/ karmic main restricted ## Major bug fix updates produced after the final release of the ## distribution. deb http://us.archive.ubuntu.com/ubuntu/ karmic-updates main restricted deb-src http://us.archive.ubuntu.com/ubuntu/ karmic-updates main restricted ## N.B. software from this repository is ENTIRELY UNSUPPORTED by the Ubuntu ## team. Also, please note that software in universe WILL NOT receive any ## review or updates from the Ubuntu security team. deb http://us.archive.ubuntu.com/ubuntu/ karmic universe deb-src http://us.archive.ubuntu.com/ubuntu/ karmic universe deb http://us.archive.ubuntu.com/ubuntu/ karmic-updates universe deb-src http://us.archive.ubuntu.com/ubuntu/ karmic-updates universe |
apt-get や同様のツールは、ローカル・データベースを使用してインストール済みパッケージを判断します。これらのツールは、インストール済みパッケージのレベルと入手可能なレベルとを比較するために、入手可能なレベルに関する情報を /etc/apt/sources.list に記載されたソースから取得してローカル・システムに保管します。ローカル・データベースに保管された情報を /etc/apt/sources.list に指定されたソースと同期させるには、apt-get update コマンドを使用します。このコマンドは、パッケージをインストールまたは更新する前に実行してください。また、/etc/apt/sources.list を変更した場合、またはファイルを /etc/apt/sources.list.d に追加した場合には、その後に必ずこのコマンドを実行しなければなりません。
パッケージを削除するには、apt-get コマンドに remove オプションを指定します。リスト 5 に、削除のシミュレーションを記載します。
リスト 5. gcl 削除のシミュレーション
ian@pinguino:~$ sudo apt-get remove -s gcl [[sudo] password for ian: Reading package lists... Done Building dependency tree Reading state information... Done The following packages were automatically installed and are no longer required: linux-headers-2.6.31-14 linux-headers-2.6.31-14-generic libreadline5 Use 'apt-get autoremove' to remove them. The following packages will be REMOVED: gcl 0 upgraded, 0 newly installed, 1 to remove and 30 not upgraded. Remv gcl [2.6.7-45ubuntu1] |
前のセクションで gcl の必須パッケージとしてインストールした libreadline5 は自動的に削除されませんが、出力行のうちの 1 つに、このパッケージと 2 つのLinux ヘッダー・パッケージが不要になったことが示されています。apt-get の autoremove 関数 (または同等の remove 関数と --auto-remove オプション) を使用すると、指定したパッケージと併せ、依存関係としてインストールされたもののどのインストール済みパッケージにも必要でなくなったすべてのパッケージを削除することができます。削除されるパッケージには、削除しようとしているもの以外のパッケージによってインストールされた依存関係も含まれます。この例でこれに相当するのは、linux-headers-2.6.31-14 および linux-headers-2.6.31-14-generic パッケージです。リスト 6 に、gcl とその依存関係である libreadline5、そして gcl とは無関係の、不要になった 2 つの Linux ヘッダー・パッケージを削除する方法を示します。
リスト 6. gcl と依存関係の削除
ian@pinguino:~$ sudo apt-get autoremove gcl Reading package lists... Done Building dependency tree Reading state information... Done The following packages will be REMOVED: gcl libreadline5 linux-headers-2.6.31-14 linux-headers-2.6.31-14-generic 0 upgraded, 0 newly installed, 4 to remove and 30 not upgraded. After this operation, 239MB disk space will be freed. Do you want to continue [Y/n]? y (Reading database ... 142327 files and directories currently installed.) Removing gcl ... remove/gcl: purging byte-compiled files for emacs22 remove/gcl: purging byte-compiled files for emacs23 Removing libreadline5 ... Removing linux-headers-2.6.31-14-generic ... Removing linux-headers-2.6.31-14 ... Processing triggers for man-db ... Processing triggers for libc-bin ... ldconfig deferred processing now taking place |
パッケージ名を指定しないで apt-get の autoremove 関数を使用すると、依存関係としてインストールされた後に使用されなくなったすべてのパッケージがシステムから削除されます。また、apt-get purge オプションを使って構成情報を削除することもできます。詳細については、man ページを参照してください。
個々のパッケージを更新する場合には、再度 install オプションを指定した apt-get を使用します。リスト 7 に、私のシステムにインストールされている tzdata パッケージを例に、パッケージの更新方法を示します。パッケージを更新する前には必ず apt-get update を実行して、ローカル・データベースに入手可能な最新の更新を反映してください。
リスト 7. 単一パッケージの更新
ian@pinguino:~$ sudo apt-get install tzdata [sudo] password for ian: Reading package lists... Done Building dependency tree Reading state information... Done The following packages will be upgraded: tzdata 1 upgraded, 0 newly installed, 0 to remove and 29 not upgraded. Need to get 679kB of archives. After this operation, 0B of additional disk space will be used. Get:1 http://us.archive.ubuntu.com karmic-updates/main tzdata 2010i-0ubuntu0.9.10 [679kB] Fetched 679kB in 1s (569kB/s) Preconfiguring packages ... (Reading database ... 124394 files and directories currently installed.) Preparing to replace tzdata 2010h-0ubuntu0.9.10 (using .../tzdata_2010i-0ubuntu0.9.10_all .deb) ... Unpacking replacement tzdata ... Setting up tzdata (2010i-0ubuntu0.9.10) ... Current default time zone: 'America/New_York' Local time is now: Mon May 3 16:11:57 EDT 2010. Universal Time is now: Mon May 3 20:11:57 UTC 2010. Run 'dpkg-reconfigure tzdata' if you wish to change it. |
すべてのパッケージの更新、または新しいディストリビューションへのアップグレード
個々のパッケージを更新するのではなく、システム上のすべてのパッケージを更新する場合には、apt-get upgrade コマンドを使用します。同様に、apt-get dist-upgrade はディストリビューションを新しいレベルにマイグレードするのにも役立ちます。
apt-get のその他の機能およびオプションについての詳細は、man ページを参照してください。
apt-get の man ページを見てみると、多数のオプションがあることがわかります。apt-get コマンドを何度も使用してみて、デフォルト・オプションが好ましくないと判断した場合には、新しいデフォルトを /etc/apt/apt.conf に設定することができます。スクリプトが apt.conf ファイルを問い合わせるには、apt-config プログラムを使用することができます。apt.conf ファイルおよび apt-config プログラムについての詳細は、man ページを参照してください。
APT に組み込まれている debconf という機能は、インストールされた後にパッケージを構成するために使用されます。この機能を使用するパッケージの場合 (すべてのパッケージがこの機能を使用するわけではありません)、インストールした後にパッケージの構成を変更することができます。パッケージを再構成するのに最も簡単な方法は、dpkg-reconfigure コマンドを使用することです。例えば、adduser コマンドを使うと、すべてのシステム・ユーザーが読み取ることのできるホーム・ディレクトリーを作成することができますが、プライバシー上の理由から読み取り可能なユーザーを制限したいという場合もあります。また、リスト 7 で tzdata パッケージをアップグレードしたときに、dpkg-reconfigure tzdata を実行するとタイムゾーンを変更できるというアドバイスが示されていました。dpkg-reconfigure を実行するには、root 権限が必要です。
図 1 に示しているのは、dpkg-reconfigure tzdata を実行すると最初に表示される質問です。あらかじめ設定されているデフォルトは、この図のように America ではなく、お使いのシステムを反映したデフォルトになっている場合もあります。このテキスト・モードの画面をナビゲートするには、Tab キーとカーソル移動キーを使用します。
図 1. dpkg-reconfigure を使用したタイムゾーンの設定変更
ここからは、パッケージに関する情報を取得するためのツールを取り上げます。これらのツールのなかには他の機能を持つものもありますが、ここでは情報を取得する方法に焦点を絞ります。
APT システムには、dpkg という別のツールも組み込まれています。dpkg は中間レベルのパッケージ管理ツールであり、パッケージのインストールと削除を行えるだけでなく、パッケージのステータス情報を表示することもできます。dpkg の構成は、/etc/dpkg/dpkg.cfg で制御することができます。また、ホーム・ディレクトリー内に置かれた .dpkg.cfg ファイルを使って詳細な構成を行うことも可能です。
dpkg ツールはファイルシステム内の /var/lib/dpkg ツリーに含まれる多数のファイルを使用します。そのうち、システム上のパッケージに関するステータス情報が含まれているのは /var/lib/dpkg/status ファイルです。リスト 8 では dpkg -s を使用して、以前のセクションで更新した tzdata パッケージと、同じく以前のセクションで削除した gcl パッケージのステータス情報を表示しています。gcl パッケージに関しては、いくつかの構成ファイルがまだ残っていることが示されている点に注意してください。purge オプションを併せて使用すると、ダウンロードしたパッケージをキャッシュから消去し、構成情報を削除することができます。
リスト 8. tzdata パッケージのステータス
ian@pinguino:~$ dpkg -s gcl tzdata Package: gcl Status: deinstall ok config-files Priority: optional Section: interpreters Installed-Size: 152848 Maintainer: Ubuntu MOTU Developers <ubuntu-motu@lists.ubuntu.com> Architecture: i386 Version: 2.6.7-45ubuntu1 Config-Version: 2.6.7-45ubuntu1 Depends: libc6 (>= 2.7), libgmp3c2, libice6 (>= 1:1.0.0), libncurses5 (>= 5.6+20071006-3 ), libreadline5 (>= 5.2), libsm6, libx11-6, libxaw7, libxext6, libxmu6, libxt6, tcl8.4 ( >= 8.4.16), tk8.4 (>= 8.4.16), debconf (>= 1.2.0), gcc, emacs22 | emacsen Suggests: gcl-doc Conffiles: /etc/default/gcl 9301be50652f86b8d3f8b835f6dce03e /etc/emacs/site-start.d/50gcl.el 12116c8c8988326764799973a0a7d5ab Description: GNU Common Lisp compiler GNU Common Lisp (GCL) is a Common Lisp compiler and interpreter implemented in C, and complying mostly with the standard set forth in the book "Common Lisp, the Language I". It attempts to strike a useful middle ground in performance and portability from its design around C. . This package contains the Lisp system itself. Documentation is provided in the gcl-doc package. Original-Maintainer: Camm Maguire <camm@enhanced.com> Package: tzdata Status: install ok installed Priority: required Section: libs Installed-Size: 6276 Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> Architecture: all Version: 2010i-0ubuntu0.9.10 Replaces: libc0.1, libc0.3, libc6, libc6.1 Provides: tzdata-squeeze Depends: debconf (>= 0.5) | debconf-2.0 Description: time zone and daylight-saving time data This package contains data required for the implementation of standard local time for many representative locations around the globe. It is updated periodically to reflect changes made by political bodies to time zone boundaries, UTC offsets, and daylight-saving rules. Original-Maintainer: GNU Libc Maintainers <debian-glibc@lists.debian.org> |
パッケージに含まれているファイルや、特定のファイルがどのパッケージに属しているかを調べなければならないことはよくあります。そのような場合にはいずれも dpkg を使用します。リスト 9 に、dpkg -L を使用して、libparted パッケージによってインストールされたファイル (ディレクトリーを含む) を表示する場合を示します。ほとんどのパッケージについては、特定のバージョンを指定しなくても、パッケージ名を指定するだけで十分です。ただし、一部のパッケージには複数のバージョンが用意されています。このようなパッケージについては、dpkg を使ってパッケージの情報を問い合わせる際に、詳細なパッケージ名を指定しなければなりません。
リスト 9. libparted パッケージに含まれるファイルを調べる場合
ian@pinguino:~$ dpkg -L libparted Package `libparted' is not installed. Use dpkg --info (= dpkg-deb --info) to examine archive files, and dpkg --contents (= dpkg-deb --contents) to list their contents. ian@pinguino:~$ dpkg -L libparted1.8-12 /. /lib /lib/libparted-1.8.so.12.0.0 /usr /usr/share /usr/share/doc /usr/share/doc/libparted1.8-12 /usr/share/doc/libparted1.8-12/copyright /usr/share/doc/libparted1.8-12/changelog.Debian.gz /lib/libparted-1.8.so.12 |
特定のファイルが含まれているパッケージを見つけるには、dpkg の -S オプションを使用します (リスト 10 を参照)。この場合、パッケージ名はファイル名の左側に表示されます。
リスト 10. 特定のファイルが含まれるパッケージを調べる場合
ian@pinguino:~$ dpkg -S /lib/libparted-1.8.so.12 libparted1.8-12: /lib/libparted-1.8.so.12 |
場合によっては、ファイルがどのパッケージにも属されていないかのように表示されることがあります。その場合、パッケージがどこにあるのかを突き止めるために、追加で調査が必要になります。例えばインストールのセットアップのステップでは、シンボリック・リンクを作成するなどのタスクが行われる可能性があります。シンボリック・リンクは、パッケージの内容としては表示されません。比較的最近のことですが、Linux システムに、update-alternatives コマンドを使って管理する alternatives システムが追加されました。alternatives は java などのコマンドに対して頻繁に作成されます。java コマンドは、例えば openJDK、Sun、または IBM などのバージョンの場合があります。
リスト 11 では、which コマンドを使用して java を実行しようとすると何が呼び出されるかを調べた後、ls コマンドを使用して java コマンドのシンボリック・リンクが何に対して張られているのかを調べています。/etc/alternatives ディレクトリーへのリンクが alternatives システムを使用していることを示唆しているため、update-alternatives コマンドを使用して詳細情報を検索し、最後に dpkg -S コマンドで java コマンドが openjdk-6-jre-headless に含まれていることを確認しています。alternatives システムをセットアップするには、openjdk-6-jre-headless パッケージに含まれるポストインストール・スクリプトを使うという方法もあります。
リスト 11. 複雑な dpkg -S の使用例
ian@pinguino:~$ which java /usr/bin/java ian@pinguino:~$ ls -l $(which java) lrwxrwxrwx 1 root root 22 2010-05-03 17:51 /usr/bin/java -> /etc/alternatives/java ian@pinguino:~$ update-alternatives --display java java - auto mode link currently points to /usr/lib/jvm/java-6-openjdk/jre/bin/java /usr/lib/jvm/java-6-openjdk/jre/bin/java - priority 1061 slave java.1.gz: /usr/lib/jvm/java-6-openjdk/jre/man/man1/java.1.gz Current `best' version is /usr/lib/jvm/java-6-openjdk/jre/bin/java. ian@pinguino:~$ dpkg -S /usr/lib/jvm/java-6-openjdk/jre/bin/java openjdk-6-jre-headless: /usr/lib/jvm/java-6-openjdk/jre/bin/java |
前述のとおり、パッケージのステータス情報は /var/lib/dpkg/status に保持されます。また、dpkg はパッケージの情報を表示する以外の操作にも使えることを説明しました。代わってこのセクションで取り上げるのは、aptitude コマンドです。このコマンドは、APT パッケージ管理機能を操作するための、テキスト・ベースの全画面表示のインターフェースを提供します (ncurses を使用)。aptitude ではパッケージをインストールまたは削除できる他、パッケージを常に最新の状態にするか、あるいは現状のまま維持するかなどを示すステータス・フラグを制御することができます。aptitude コマンドを (root として) 実行すると、図 2 のような画面が表示されます。
図 2. aptitude の実行
Enter キーを押して選択項目を展開または折り畳んだ後、ctrl-t を使ってメニュー・バーにアクセスしてください。図 3 には、さまざまな更新があるなかで、私のシステムに適用できる更新の 1 つとして、新しいカーネル・バージョン 2.6.31.20 が示されています。左側の列に示されている「i」は、現在、このパッケージをインストールするとアップグレードできる状況であることを意味します。「Help (ヘルプ)」メニュー項目を選択すると、使用できる各種のオプションについての説明が表示されます。オプションには、パッケージを更新せずに現行のレベルで維持するというオプション、パッケージを削除するというオプション、または自動的にインストールして自動削除の対象にするというオプションがあります。以前のセクションで apt-get の autoremove オプションについて触れましたが、これで、自動削除の対象となるパッケージを確認または制御する方法がわかったはずです。フラグの値を変更するには、「Help (ヘルプ)」で説明しているキーボード・ショートカットを使用するか、「Package (パッケージ)」メニュー項目を使用してください。
図 3. aptitude の実行とパッケージ・フラグの確認
パッケージを検索するには、スラッシュ (「/」) キーを使用します。例えば、前に削除した gcl パッケージを再インストールする場合には、「/gcl」と入力するだけでパッケージを検索することができます。検索結果として、gcl パッケージではなく、例えば gcl という文字が含まれる gcl-doc が示された場合には、「n」キーを押して次の検索結果に進んでください。該当するパッケージが見つかったら、「Package (パッケージ)」メニューを使用して、そのパッケージにインストール対象としてのマークを付けます。
作業が完了したら、「Action (アクション)」 -> 「Install/remove packages (パッケージをインストール/削除)」を選択して (または、「g」を押すという方法もあります)、変更内容をシステムに適用します。変更内容を適用したくない場合には、中止オプションを選択することもできます。
メニュー・バーの「Help (ヘルプ)」を選択するか、または「?」(疑問符) を入力すると、いつでもヘルプを使用することができます。ヘルプを終了するには、「q」キーを押します。
前のセクションで説明したように、aptitude は、個々のパッケージをインストールまたは削除する場合だけでなく、システム上のすべてのパッケージを最新レベルにアップグレードする場合に利用することができます。
aptitude の他にも、Debian システムには対話型のパッケージ管理インターフェースとして dselect、synaptic、update-manager、gnome-apt、wajig があります。このうち synaptic は、X Window System 用のグラフィカル・アプリケーションです。図 4 に、お馴染みの gcl パッケージがインストール対象としてマークされている synaptic ユーザー・インターフェースを示します。
図 4. synaptic を使用した gcl のインストール
「Apply (適用)」ボタンをクリックすると、gcl パッケージがインストールされ、更新が予定されているその他すべてのパッケージが更新されます。パッケージ・リストを最新の内容にするには、「Reload (再ロード)」ボタンをクリックします。GUI インターフェースを使い慣れているとしたら、apt-get、dpkg、あるいは dselect よりも synaptic のほうが使い易いと感じるはずです。
お使いのシステムに、update-manager が組み込まれている場合もあります。これは、システムを最新の状態に維持できるようにすることを目的に作成された X Window System アプリケーションです。このアプリケーションは、システムにインストールされていると定期的に起動されるため、システムを更新し忘れることがありません。Update Manager では、図 2 に示されている一連の更新は図 5 のように表示されます。aptitude の場合と同じく、更新は分類して表示されるので、どの更新が重要なセキュリティー更新であるかがわかります。
図 5. Update Manager の例
Debian のパッケージ管理に関する最後のトピックとして、これからパッケージの検索方法について検討します。通常、この記事で説明した apt-get やその他のツールは、使用可能なパッケージのリストのなかかから必要となる可能性のある Debian パッケージを事前に把握します。この記事ではまだ使用していませんでしたが、システム上のパッケージ情報を検索するのに役立つコマンドとして、apt-cache があります。apt-cache では、正規表現を使って検索することができます (正規表現についての詳細は、「Linux の 101 試験対策: 正規表現を使用したテキスト・ファイルの検索」を参照)。リスト 12 に一例として、Linux ローダーが含まれるパッケージの名前を調べる方法を記載します。
リスト 12. apt-cache による Linux ローダーの検索
ian@pinguino:~$ apt-cache search "linux loader" lilo - LInux LOader - The Classic OS loader can load Linux and others lilo-doc - Documentation for LILO (LInux LOader) |
前に説明した aptitude と synaptic も検索ツールを提供しています。synaptic を使用する場合、検索メニューには、パッケージ名だけを検索するオプションと、パッケージ名だけでなくパッケージの説明も検索するオプションがあることに注意してください。
これらのツールを使用してもパッケージが見つからない場合には、Debian のサイト (リンクについては、「参考文献」を参照) や他のインターネット・サイトに記載されているパッケージのリストから、パッケージが見つかる場合もあります。
大多数のパッケージ・ツールがパッケージに関して提供できる情報量は、パッケージがインストール済みの場合に比べ、パッケージがインストールされていない場合は大幅に減ります (例えばパッケージに含まれるファイルのリストなど)。まだインストールしていないプログラムが含まれるパッケージを検索する必要がある場合には、以下の方法があります。
- プログラムが含まれている可能性のあるパッケージを推測し、パッケージをインストールせずにダウンロードだけして、ダウンロードしたパッケージ問い合わせを行う。
- インターネットを検索する。
- この記事のセクション「見つからないコマンド」で説明する command-not-found 機能を試してみる。
apt-get コマンドには、パッケージをダウンロードするだけで、インストールは行わない -d オプションがあります。また、--print-uris オプションを指定すると、パッケージのダウンロード元、そしてパッケージのチェックサムが表示されます。現行のチェックサムは SHA256 チェックサムの可能性が高いため、sha256sum コマンドを使用すれば、ダウンロードしたパッケージの完全性をチェックすることができます。URI とチェックサムの情報はパッケージをダウンロードした後には表示されないので、この情報はパッケージをダウンロードする前に取得してください。
一例として、gcl コマンドが実際に gcl パッケージに含まれているかどうかを調べたいとします。その場合には、リスト 13 に示すように apt-get を使用して gcl パッケージをインストールすることはせずにダウンロードだけします。
リスト 13. apt-get を使用してダウンロードだけを行う
ian@pinguino:~$ sudo apt-get install -d gclReading package lists... Done Building dependency tree Reading state information... Done The following extra packages will be installed: libreadline5 Suggested packages: gcl-doc The following NEW packages will be installed: gcl libreadline5 0 upgraded, 2 newly installed, 0 to remove and 0 not upgraded. Need to get 47.1MB of archives. After this operation, 157MB of additional disk space will be used. Do you want to continue [Y/n]? Get:1 http://us.archive.ubuntu.com karmic/main libreadline5 5.2-6 [140kB] Get:2 http://us.archive.ubuntu.com karmic/universe gcl 2.6.7-45ubuntu1 [47.0MB] Fetched 47.1MB in 7s (6,475kB/s) Download complete and in download only mode |
パッケージをダウンロードしたら、dpkg の --info オプションを使ってパッケージ情報を表示するか、あるいは --contents オプションを指定して、パッケージによってインストールされるファイルをリストアップします。ダウンロードしたパッケージ・ファイルは、通常 /var/cache/apt/archives/ に置かれます。リスト 14 に、ダウンロードしたパッケージ・ファイルを見つけて、そのファイルによってインストールされるバイナリーを調べる方法を示します (パッケージ・ファイルは .../bin/... ディレクトリーにインストールされるという前提です)。
リスト 14. dpkg を使用して .deb の内容を表示する
ian@pinguino:~$ sudo find /var/cache -name "*.deb" /var/cache/apt/archives/gcl_2.6.7-45ubuntu1_i386.deb /var/cache/apt/archives/libreadline5_5.2-6_i386.deb ian@pinguino:~$ sudo dpkg --contents /var/cache/apt/archives/gcl*.deb| grep "/bin/" drwxr-xr-x root/root 0 2008-12-06 07:42 ./usr/bin/ -rwxr-xr-x root/root 617 2008-12-06 07:42 ./usr/bin/gcl |
apt-get 以外の手段で .deb ファイルを見つけてダウンロードしたら、dpkg -iを実行してファイルをインストールすることができます。
APT アーカイブにダウンロードしたパッケージをインストールしないことにした場合は、apt-get clean を実行してダウンロードしたパッケージ・ファイルをすべて消去します。
以上の方法をすべて試してもパッケージが見つからない場合は、パッケージのソースとしてもう 1 つの可能性が考えられます。例えば、検索しているプログラムが、.deb ではなく、RPM としてパッケージ化されている場合を考えてみてください。その場合には、パッケージ・フォーマットを変換できる alien プログラムを使用するという方法があります。ただし、alien プログラムではすべてのパッケージ管理システムのすべての機能を別のフォーマットに変換できるわけではありません。使用する場合には、alien プログラムのマニュアルをよく読んでください。
リスト 1 に話を戻すと、gcl コマンドを取得するために、どのパッケージをインストールすれば良いかを伝える親切なメッセージがありましたが、どのようにしてそのパッケージがわかったのでしょうか。Bash シェルでコマンドを検索すると、コマンドが見つからない場合には、シェルが command_not_found_handle というシェル関数を検索します。リスト 15 に、この関数が私の Ubuntu 9.10 システムでどのように定義されているかを記載します。
リスト 15. command_not_found_handle
ian@pinguino:~$ type command_not_found_handle
command_not_found_handle is a function
command_not_found_handle ()
{
if [ -x /usr/lib/command-not-found ]; then
/usr/bin/python /usr/lib/command-not-found -- $1;
return $?;
else
return 127;
fi
} |
command_not_found_handle 関数が存在する場合には、元のコマンドと元の引数を引数として使ってこの関数が呼び出され、関数の終了ステータスがシェルの終了ステータスになります。この関数が定義されていなければ、Bash シェルはエラー・メッセージを出力し、終了ステータス 127 を返します。通常、この関数が設定されるのはシステムの /etc/bash.bashrc ファイルです。リスト 15 からわかるように、この関数は /usr/lib/command-not-found の有無をチェックし、存在する場合はこれを Python スクリプトとして実行します。/usr/lib/command-not-found が存在しないとしたら、その原因はおそらく、この関数を提供する command-not-found パッケージがシェル・セッションの開始後に削除されたためです。その場合、command_not_found_handle 関数は標準のシステムの振る舞いを模倣して終了ステータス 127 を返します。
パッケージのインストールについての説明を締めくくるには、PackageKit について触れないわけにはいきません。PackageKit はソフトウェアを簡単にインストール、更新できるようにするために設計されたシステムで、さまざまなディストリビューションで使用されているソフトウェア・グラフィカル・ツールをまとめて 1 つに統合することを目的としています。PackageKit は、システムが起動したデーモンを使用します。つまり、デーモンは必要なときにだけ起動されるということです。Packagekit には Gnome 対応のバージョン (gnome-packagekit) と KDE 対応のバージョン (KPackageKit) があります。
この記事では、Debian パッケージ管理システムのほんの一部を説明しただけにすぎません。Debian にはパッケージ管理システムの他にも多くの機能があります。Debian の詳細と、この連載の他の記事へのリンクについては「参考文献」を参照してください。
学ぶために
- 2009年4月時点での目標に基づく LPIC-1 認定に備えるために必要な developerWorks の記事を見つけるには、developerWorks の LPIC-1 ロードマップを利用してください。
- LPIC Program サイトで、Linux Professional Institute の 3 つの Linux システム管理資格認定レベルについて、詳しい目標、タスクのリスト、そして出題例を調べてください。特に、2009年4月時点での LPI 101 試験および LPI 102 試験の目標は要チェックです。最新の目標については、必ず LPIC Program サイトを参照してください。
- developerWorks の連載「LPI exam prep」をすべて読んで、Linux の基礎を学び、2009年4月以前の LPI 試験の目標に基づくシステム管理者認定試験に備えてください。
- Debian ディストリビューションについて調べるには、Debian ホーム・ページが出発点となります。
- Debian のインストール方法についての詳細は、「Debian GNU/Linux インストールガイド」を参照してください。
- Debian パッケージでは、Debian パッケージの一覧を見たり、パッケージを検索したりできます。
- Debian のパッケージ管理ユーティリティーである API について詳しく学ぶには、「APT HOWTO」を参照してください。
- 「Debian 新メンテナガイド 」を調べてみてください。
- みんなのための Linux、Ubuntu にアクセスしてください。
- PackageKit について詳しく学ぶには、PackageKit ホーム・ページにアクセスしてください。
- The Linux Documentation Project には、HOWTO 文書をはじめ、各種の有益な文書が豊富に揃っています。
- developerWorks Linux ゾーンで、Linux 開発者および管理者向けのハウツー記事とチュートリアル、そしてダウンロード、ディスカッション、フォーラムなど、豊富に揃った資料を探してください。
- さまざまな IBM 製品および IT 業界についての話題に絞った developerWorks の Technical events and webcasts で時代の流れをキャッチしてください。
- 無料の developerWorks Live! briefing に参加して、IBM 製品およびツール、そして IT 業界の傾向を素早く学んでください。
- developerWorks の on-demand demos で、初心者向けの製品のインストールおよびセットアップから熟練開発者向けの高度な機能に至るまで、さまざまに揃ったデモを見てください。
- Twitter で developerWorks をフォローするか、developerWorks で Linux に関するツイートのフィードに登録してください。
製品や技術を入手するために
- Alien パッケージ・コンバーターを入手してください。
- Debian ホーム・ページから Debian パッケージを入手してください。
- ご自分に最適な方法で IBM 製品を評価してください。評価の方法としては、製品の試用版をダウンロードすることも、オンラインで製品を試してみることも、クラウド環境で製品を使用することもできます。また、SOA Sandbox では、数時間でサービス指向アーキテクチャーの実装方法を効率的に学ぶことができます。
議論するために
- ディスカッション・フォーラムに参加してください。
- My developerWorks コミュニティーに加わってください。ここでは他の developerWorks ユーザーとのつながりを持てる他、開発者が主導するブログ、フォーラム、グループ、ウィキを調べることができます。

Ian Shields は、developerWorks Linux ゾーンの様々な Linux プロジェクトに関わっています。彼はノースキャロライナ州 Research Triangle Park にある IBM のシニア・プログラマーです。1973年にオーストラリアのキャンベラでシステム・エンジニアとして IBM に入社して以来、カナダのモントリオールやノースキャロライナ州 Research Triangle Park で、コミュニケーション・システムやパーベイシブ・コンピューティングに携わってきました。彼はいくつかの特許を保持しています。Australian National University にて純粋数学および哲学で学位を取得し、また North Carolina State University にてコンピューター・サイエンスで修士号と博士号を取得しています。